在回答关于如何使用System.gc()”>在Java中强制释放对象,有人告诉我,手动调用System.gc()是一种不好的做法,但这些评论并不完全令人信服。此外,似乎没有人敢投我的赞成票,也没有人敢投我的反对票
那里有人告诉我这是一种不好的做法,但后来我还被告知垃圾收集器的运行不再系统地停止世界,而且它也可以被JVM有效地用作提示,所以我有点不知所措
我知道JVM在需要回收内存时通常比您更清楚。我也明白担心几千字节的数据是愚蠢的。我也明白,即使是兆字节的数据也不是几年前的情况。但仍然是1.5千兆字节?你知道,内存中大约有1.5 GB的数据;这不像是在黑暗中开枪。System.gc()是系统性的坏,还是在某个时候它变得正常了
所以问题实际上是双重的:
- 为什么调用
System.gc()是一种不好的做法?它真的仅仅是在某些实现下对JVM的一个提示,还是总是一个完整的收集周期?是否真的有垃圾收集器实现可以在不影响世界的情况下完成其工作?请解释一下人们在my回答 - 门槛在哪里?调用
System.gc()从来都不是一个好主意,还是有时可以接受?如果是,那是什么时间
每个人都说要避免使用System.gc()的原因是它是一个非常好的指示器,可以指示根本性的错误代码。任何依赖于它的代码的正确性肯定是被破坏的;任何依赖它来实现性能的系统都很可能会崩溃
你不知道你运行的是哪种垃圾收集器。当然,有些JVM并不像您所断言的那样“阻止世界”,但有些JVM并没有那么聪明,或者出于各种原因(可能是在电话上?)没有这么做。你不知道它会做什么
而且,它也不能保证做任何事情。JVM可能会完全忽略您的请求
“你不知道它会起什么作用”、“你甚至不知道它是否有用”和“你无论如何都不需要叫它”的组合就是为什么人们如此强烈地说,一般来说你不应该叫它。我认为这是一个“如果你需要问你是否应该使用这个,你不应该”
编辑以解决其他线程的一些问题:
在阅读了你链接的帖子之后,我还想指出一些事情。
首先,有人建议调用gc()可能会将内存返回给系统。这当然不一定是真的——Java堆本身的增长与Java分配无关
与中一样,JVM将保留内存(几十兆字节),并根据需要增加堆。即使释放Java对象,它也不一定会将内存返回到系统;保留分配的内存以用于将来的Java分配是完全自由的
要显示System.gc()可能不执行任何操作,请查看:
http://bugs.sun.com/view_bug.do?bug_id=6668279
特别是有一个-XX:DisableExplicitGC虚拟机选项