好的,我在网上阅读了很多关于finalize()方法的文章以及我们不能真正依赖它的事实......
对,很清楚(我猜)
但是当内存泄漏发生时,在深入到 VisualVM 内部之前,我可以只使用 finalize 方法作为主要的调试工具吗?
(一个微小的日志消息,如 finalize 中的“对象已释放”和构造函数中的“对象已创建”)
好的,我在网上阅读了很多关于finalize()方法的文章以及我们不能真正依赖它的事实......
对,很清楚(我猜)
但是当内存泄漏发生时,在深入到 VisualVM 内部之前,我可以只使用 finalize 方法作为主要的调试工具吗?
(一个微小的日志消息,如 finalize 中的“对象已释放”和构造函数中的“对象已创建”)
您想跟踪被保留的对象,而不是那些被释放的对象(这是 finalize 向您显示的)。更重要的是,您想知道为什么要保留对象,即保留对象的引用路径。我建议使用 VisualVM 作为开始,如果堆很大或问题不明确,则可能使用商业分析器。
当资源没有被确定性地清理时,我使用 finalize() 进行日志记录。即它应该不是 close()d 的。
通过添加 jvm 参数生成 heapdump/系统核心。 http://www.oracle.com/technetwork/java/javase/memleaks-137499.html 然后下载 http://eclipse.org/mat/ 工具。在上述工具中加载生成的转储 然后按照镜像中所示
通过选择终结器概述,它将提供有关准备被终结器线程清除的对象数量的信息以及终结器线程的相关信息。