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