【发布时间】:2013-12-20 20:36:06
【问题描述】:
我正在制作一些应用程序(服务器和客户端)。我有一点需要调用 System.gc();
但是我发现这里@987654321@不建议调用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