读完这个问题之后,我想起了我什么时候被Java教过,并且告诉他们永远不要调用finalize()或者运行垃圾收集器因为"这是一个你永远不用担心的大黑盒子".有人可以将这个推理归结为几句话吗?我确信我可以阅读Sun关于此事的技术报告,但我认为一个简短的,简短的答案可以满足我的好奇心.
简短的回答:Java垃圾收集是一个非常精细的调整工具.System.gc()是一把大锤.
Java的堆分为不同的代,每个代都使用不同的策略收集.如果你将一个探查器附加到一个健康的应用程序,你会发现它很少需要运行最昂贵的集合,因为大多数对象都被年轻一代中速度较快的复制收集器捕获.
直接调用System.gc(),虽然在技术上不能保证做任何事情,但在实践中会触发一个昂贵的,世界各地的完整堆集合.这几乎总是错误的做法.你认为你正在节省资源,但实际上你没有任何理由浪费它们,迫使Java重新检查你所有的活动对象"以防万一".
如果您在关键时刻遇到GC暂停问题,最好配置JVM以使用并发标记/扫描收集器,该收集器专门用于最大程度地减少暂停时间,而不是尝试使用大锤来解决问题进一步打破它.
您正在考虑的Sun文档位于:Java SE 6 HotSpot™虚拟机垃圾收集调整
(你可能不知道的另一件事:在你的对象上实现finalize()方法会使垃圾收集速度变慢.首先,需要两次 GC运行才能收集对象:一个用于运行finalize(),另一个用于确保对象不是在最终确定期间不会复活.其次,具有finalize()方法的对象必须被GC视为特殊情况,因为它们必须单独收集,它们不能被批量丢弃.)