【问题标题】:Java and calling garbage collectorJava和调用垃圾收集器
【发布时间】:2013-12-20 20:36:06
【问题描述】:

我正在制作一些应用程序(服务器和客户端)。我有一点需要调用 System.gc();

但是我发现这里@9​​87654321@不建议调用gc。

如果我使用 System.gc(),程序运行在 ~80MB 内存,但没有 gc,内存增长到 ~600-700MB,我需要在 Android 手机上运行它

还有其他清除内存的方法吗?

谢谢

编辑:在我测试过的 Android 中看到 cmets(1 小时前移植),使用 System.gc() 运行良好,没有它我还没有测试过

编辑 2:这是 5 分钟后在桌面上运行的程序的两张照片:

使用 System.gc():http://imgur.com/M9yMBei 没有 System.gc():http://i.imgur.com/4qb2Ylc.png

编辑 3:哇!! 1 之前发布此应用程序正在使用大约 2GB 的 RAM!

【问题讨论】:

  • GC 将回收对象 when 它可以(以及 when 它认为它需要) - 对于像 Android 这样的系统,诀窍是设计应用程序,因此一次不需要加载太多。这就是视图在 Android 等中具有独立生命周期的原因:设计是为了限制工作足迹。
  • 澄清一下:如果不调用System.gc(),内存会增长到600、700 MB在移动设备上运行时?或者您是在带有桌面 JRE 的桌面机器上进行这些测试吗?
  • 您确定该应用无法在 Android 手机上运行吗?它可能会在内存中保留 600mb 的数据(尽管看起来很高),因为这是您分配的数据,如果可用的数据较少,可能会自动触发 gc()。
  • @delnan no,我已经在桌面、Windows 7 x64 和 8GB 内存中测试了没有 System.gc 的应用程序
  • 那是你的问题。桌面机器上的 JVM 可能甚至不会与 Android 设备上的 Dalvik VM 共享太多代码,并且无论它们的血统如何,任何理智的 GC 都会根据可用内存量调整它们的行为(收集频率等)。我预测您不会在移动设备上看到几乎一样多的内存消耗。

标签: java android memory-leaks garbage-collection


【解决方案1】:

这是不好的做法,因为通常运行时比您更了解系统的状态。如果 RAM 可用,为什么不使用它?如果 RAM 不可用,系统无论如何都会提前 GC。

无论如何,调用System.gc() 只是一个提示,我怀疑随着时间的推移,这个提示只会变得更有可能被忽略。

【讨论】:

    猜你喜欢
    • 2011-01-06
    • 2011-11-07
    • 1970-01-01
    • 2016-12-05
    • 2010-12-13
    • 2015-03-22
    • 1970-01-01
    • 1970-01-01
    • 2010-10-04
    相关资源
    最近更新 更多