为什么调用 System.gc() 是不好的做法?
在回答了一个关于如何在Java中强制释放对象的问题(那个家伙正在清除一个1.5GB的HashMap)之后,我被告知手动调用是不好的,但这些评论并不完全令人信服。此外,似乎没有人敢为我的答案投赞成票,也不敢投反对票。System.gc()
System.gc()
我在那里被告知这是不好的做法,但后来我也被告知垃圾收集器运行不再系统地阻止世界,并且它也可以被JVM有效地用作提示,所以我有点不知所措。
我确实知道JVM在需要回收内存时通常比您更清楚。我也明白,担心几千字节的数据是愚蠢的。我也明白,即使是兆字节的数据也不是几年前的样子。但是,1.5千兆字节?而且您知道内存中悬挂着大约1.5 GB的数据;这不像是在黑暗中拍摄的。是系统性的坏事,还是在某些时候它变得没问题?System.gc()
所以问题实际上是双重的:
- 为什么打电话是或不是不好的做法?它真的只是在某些实现下对JVM的提示,还是总是一个完整的收集周期?真的有垃圾回收器实现可以在不阻止世界的情况下完成他们的工作吗?请阐明人们在评论我的答案时提出的各种断言。
System.gc()
- 门槛在哪里?打电话从来不是一个好主意,还是有时可以接受?如果是这样,这些时间是什么?
System.gc()