在回答了关于如何用Java强制释放对象的问题(这个人正在清除一个1.5GB的HashMap)后System.gc()
,我被告知System.gc()
手动调用是不好的做法,但这些评论并不完全令人信服.此外,似乎没有人敢投票,也没有人回答我的回答.
我被告知这是不好的做法,但后来我也被告知垃圾收集器运行不再系统地停止世界,并且它也可以有效地被JVM用作提示,所以我有点像茫然
我知道JVM在需要回收内存时通常比你知道的要好.我也明白,担心几千字节的数据是愚蠢的.我也明白,甚至数兆字节的数据也不是几年前的数据.但仍然,1.5千兆字节?而且你知道内存中有1.5 GB的数据; 它不像是在黑暗中拍摄.是System.gc()
系统性的坏,还是有一点它变得好吗?
所以问题实际上是双重的:
System.gc()
?它是否仅仅是某些实现中JVM的提示,还是一个完整的收集周期?真的有垃圾收集器实现可以在不停止世界的情况下完成工作吗?请详细说明人们在评论中对我的回答所做的各种断言.System.gc()
,或者有时候可以接受?如果是这样,那些时候是什么时候?我正在使用C#.NET 3.5 ...我一直在努力通过将数据库相关活动移动到单独的工作对象来解耦BLL对象.worker对象将实体添加到数据库,并将事件成功或失败消息添加回BLL对象.
当我在BLL中实例化worker对象时,我连接了worker的事件并使用事件+ = delegate(eventhandler)语法设置BLL的事件处理程序.
我听说如果我没有使用 - =语法显式地取消监听器,那么当工作者被处置时可能存在内存泄漏.
所有这些处理都发生在一个Windows服务中,该服务从队列中获取消息并调用相应的BLL对象......我担心我可能会在此过程中引入内存泄漏.