Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java android中的垃圾收集(手动完成)_Java_Android_Memory Management_Garbage Collection - Fatal编程技术网

Java android中的垃圾收集(手动完成)

Java android中的垃圾收集(手动完成),java,android,memory-management,garbage-collection,Java,Android,Memory Management,Garbage Collection,我有一种奇怪的怀疑。我知道垃圾收集器有它自己的局限性。如果分配是正确的 不好的话,它会导致应用程序以异常方式响应的问题 所以我的问题是,在每个活动结束时强制调用垃圾收集器(System.gc())是一种好的编程习惯吗 更新 每个人都说调用system.gc()一点好处都没有。然后我想知道为什么它出现在这里。DVM将决定何时运行垃圾收集器。那个么这个方法需要什么呢 更新2 谢谢社区帮助我。但老实说,我是从这个链接了解到垃圾收集的真正的波伏娃的不;如果系统需要内存,它将自己调用GC 实例使用的任何内

我有一种奇怪的怀疑。我知道垃圾收集器有它自己的局限性。如果分配是正确的 不好的话,它会导致应用程序以异常方式响应的问题

所以我的问题是,在每个活动结束时强制调用垃圾收集器(
System.gc()
)是一种好的编程习惯吗

更新

每个人都说调用system.gc()一点好处都没有。然后我想知道为什么它出现在这里。DVM将决定何时运行垃圾收集器。那个么这个方法需要什么呢

更新2


谢谢社区帮助我。但老实说,我是从这个链接了解到垃圾收集的真正的波伏娃的

不;如果系统需要内存,它将自己调用GC

实例使用的任何内存,如果没有在其他任何地方引用,则当实例离开时,都将符合GC的条件


实例本身使用的内存,如果不再被引用,也可以使用GC。您可以进行代码检查或分析,查看是否不必要地保留了内存,但这是另一个问题。

调用
System.gc()
,不会造成任何伤害。但是你不能肯定它会有什么用处。因为您要求DVM执行垃圾收集,但无法命令它执行垃圾收集。。。它完全依赖于DVM。它在内存耗尽时或可能在任何时候调用。

在每个活动结束时强制调用垃圾收集器(System.gc())不是好的编程习惯


因为它是无用的,只有DVM决定什么时候应该调用它,尽管你叫它…

有一个关于内存管理的会议,由Patrick Dubroy在Google IO 2011上介绍。这是值得一看的,因为他已经讨论了堆分配和GC在这方面的工作。你可以在这里观看

我尝试将System.gc()放在我在Android应用程序中创建位图的行之前。在某些情况下,垃圾收集器释放了数兆字节,并结束了my OutOfMemoryError条件。它丝毫没有干扰正常的垃圾收集,但确实使我的应用程序运行得更快。

System.gc(),VM有时会一时兴起而忽略它,它在两种情况下最有用:

  • 您正在吞噬内存,就像没有明天一样(通常使用位图)
  • 您怀疑内存泄漏(例如意外保留旧上下文),并希望将VM内存置于静态状态,以查看内存使用情况是否在逐渐增加,以便进行调试

  • 在名义上的情况下,不应该使用它。

    我真的认为这取决于你的情况

    由于堆是分代的,GC可能不会在第一次运行时删除某些大型对象或位图,并且其启发式算法可能不会表明需要额外的垃圾收集,但肯定存在启发式可能错误的场景,作为开发人员,我们知道一种模式,或者可以预测GC无法预测的使用情况,因此调用system.GC()将使我们受益

    我以前在特定场景中见过这种情况,例如处理地图平铺或其他图形密集型行为,Android中的本机GC(甚至在3.0+设备上)无法正确执行,导致内存不足错误。但是,通过添加一些GC调用,可以防止内存不足错误,并且系统继续处理,尽管处理速度较慢(由于垃圾收集)。在图形密集型操作中,这通常是应用程序崩溃时所需的状态(稍微滞后),因为它无法将额外的资源加载到内存中

    对于为什么在某些情况下会发生这种情况,我唯一的解释似乎是时机问题。如果用户操作很慢,那么本机安卓GC似乎做得很好。但是,如果您的用户滚动速度快,或者缩放速度快,这就是我看到Android GC落后的地方,一些经过深思熟虑的System.GC()导致我的应用程序没有崩溃。

    手动调用GC是一种不好的编码习惯

    国家:


    GC\u显式

    显式GC,例如当您调用时(这您应该避免调用,而是信任GC在需要时运行)


    我在这里用粗体强调了最重要和最相关的部分。

    我不这么认为,如果您的应用程序缺乏性能,那么应该是其他原因,除非您分配大量数据。是这样吗?需要system.gc()方法@Ic2817仔细阅读问题。我没有说过我的应用程序是这样运行的。我正在讨论system.gc()的现有版本,感谢大家的快速响应。如果我在每个活动之后调用它,那么它将如何工作。这将帮助您是的,thanx..但它会帮助谁,谁想阅读java中的垃圾收集。但我想知道为什么system.gc()会这样做如果一切都由DVMa使用system.gc()方法决定,那么就在这里存在好了。我对system.gc()的存在有了一些想法。但让它成为未来的最佳答案。然后我会接受其中一个作为答案。但是请为您的努力投票。那么system.gc()为什么会存在?@Sameer询问最初的Java工程师。我假设您可以向系统提供提示,但其行为取决于实现。你知道你一年前问过这个问题,对吧?是的,我一年前问过这个问题……但我仍然不确定System.gc()的用法。所以我假设它提示JVM运行垃圾收集器(正如您刚才所说),但不能强制JVM运行垃圾收集器