android - 如何阻止垃圾收集器在android中被调用

标签 android garbage-collection

我正在编写一个应用程序,该应用程序会生成大量垃圾,但远未达到内存限制。也就是说,即使产生了垃圾,也不需要收集垃圾。然而,尽管如此,尽管可用内存总量的一小部分已被使用,垃圾收集器仍不断被调用并滞后于我的应用程序。

正如您从这个输出中看到的,我只使用了 2% 的可用内存,但垃圾收集器一直在运行:

12-22 04:36:08.219: D/dalvikvm(12033): WAIT_FOR_CONCURRENT_GC blocked 61ms
12-22 04:36:08.359: D/dalvikvm(12033): GC_CONCURRENT freed 1012K, 98% free 11865K/405196K, paused 4ms+13ms, total 73ms
12-22 04:36:08.359: D/dalvikvm(12033): WAIT_FOR_CONCURRENT_GC blocked 38ms
12-22 04:36:08.479: D/dalvikvm(12033): GC_CONCURRENT freed 1020K, 98% free 11862K/405196K, paused 3ms+13ms, total 66ms
12-22 04:36:08.479: D/dalvikvm(12033): WAIT_FOR_CONCURRENT_GC blocked 36ms
12-22 04:36:08.649: D/dalvikvm(12033): GC_CONCURRENT freed 1015K, 98% free 11863K/405196K, paused 2ms+16ms, total 78ms
12-22 04:36:08.649: D/dalvikvm(12033): WAIT_FOR_CONCURRENT_GC blocked 66ms
12-22 04:36:08.789: D/dalvikvm(12033): GC_CONCURRENT freed 1017K, 98% free 11861K/405196K, paused 2ms+13ms, total 66ms
12-22 04:36:08.789: D/dalvikvm(12033): WAIT_FOR_CONCURRENT_GC blocked 58ms

完全避免这种不必要的垃圾收集会影响我的应用程序的成败。

如果我有足够的可用内存,为什么垃圾收集器会运行?有什么办法可以让垃圾收集器在绝对必要之前不运行?我还应该提到我正在使用有根电话运行。

谢谢!

编辑: 呃..我一直在尝试使用工厂和各种技术来消除所有垃圾,但仍然产生了相当多的垃圾,我认为这是由于形式为 s1 + s2 + s3 的字符串连接所致。我已将此类表达式转换为可以保存对每个组件的引用的形式,但我不确定它是否密封。您是否看到以下行产生了任何垃圾?

String ss1 = input.substring(m, m+k1);
String ss2 = ss1 + possible_perturbations1.charAt(p1);
String ss3 = input.substring(m+k1+1, m+k2);
String ss4 = ss2 + ss3;
String ss5 = ss4 + possible_perturbations2.charAt(p2);
String ss6 = input.substring(m+k2+1, m+i+1);
String current_str = ss5 + ss6;

allStrs.add(ss1);
allStrs.add(ss2);
allStrs.add(ss3);
allStrs.add(ss4);
allStrs.add(ss5);
allStrs.add(ss6);
allStrs.add(current_str);

一些注意事项:大多数标准库容器的删除函数都会产生垃圾,对象之间的大多数二进制操作也会产生垃圾,这些对象会生成临时变量,例如字符串、整数、 double 等……我想,对大多数人来说,这是显而易见的,但还是要说清楚。

最佳答案

没有你的代码,不好说,为什么调用垃圾收集器,这不是错误,而是GC的职责是收集空闲的内存块。

当您拥有已创建但不再使用的对象时,垃圾收集器将激活。

不被 GC 滞后的最好方法是避免一直收集垃圾的需要。例如,您可以重用对象而不是将它们置空并创建新对象。

但仅供引用,您无法阻止垃圾收集器运行,甚至不要尝试这样做。

关于android - 如何阻止垃圾收集器在android中被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14001783/

相关文章:

javascript - Javascript/垃圾收集器中的循环引用

Android:是否可以轻松地知道 View 实例实际上在屏幕上可见?

java - 如何使用包从 flutter 中的图像读取 QR 码?

java - 在一类 MyGdx Game 中编写了整个游戏。我如何制作主菜单? libgdx

java - Spark 作业抛出 "java.lang.OutOfMemoryError: GC overhead limit exceeded"

C# 调用 IDisposable.Dispose() 与使对象为空

Javascript 引用错误 : Security violation on Android Opera

Android - 定制的拼写检查器

.net - 易碎队列和完成队列

Java 堆已满,但所有区域都是空的