好吧,我在网上读了很多关于finalize()方法的文章,以及我们不能真正依赖它的事实...对,很清楚(我猜)但是,当内存泄漏发生时,在深入VisualVM之前,我是否可以只使用finalize方法作为主要的调试工具?(finalize中有一个类似“object released”的小日志消息,构造函数中有一个“object created”)
finalize()
finalize
pb3s4cty1#
您希望跟踪被保留的对象,而不是那些被释放的对象(finalize向您显示的是这些对象)。更重要的是,您希望知道为什么对象被保留,即保留它们的引用的路径。我建议使用VisualVM作为开始,如果堆很大或者问题很复杂,可能使用商业分析器。当一个资源没有被明确地清理时,我使用finalize()来记录日志。也就是说,它应该被close()d而不是。
vd8tlhqk2#
通过添加jvm参数生成heapdump/ System core。http://www.oracle.com/technetwork/java/javase/memleaks-137499.html然后下载http://eclipse.org/mat/工具。在上述工具中加载生成的转储,然后按照图像x1c 0d1x所示进行操作通过选择终结器概述,它将给予有关准备由终结器线程清除的对象数量的信息以及终结器线程的相关信息。
2条答案
按热度按时间pb3s4cty1#
您希望跟踪被保留的对象,而不是那些被释放的对象(finalize向您显示的是这些对象)。更重要的是,您希望知道为什么对象被保留,即保留它们的引用的路径。我建议使用VisualVM作为开始,如果堆很大或者问题很复杂,可能使用商业分析器。
当一个资源没有被明确地清理时,我使用finalize()来记录日志。也就是说,它应该被close()d而不是。
vd8tlhqk2#
通过添加jvm参数生成heapdump/ System core。http://www.oracle.com/technetwork/java/javase/memleaks-137499.html然后下载http://eclipse.org/mat/工具。在上述工具中加载生成的转储,然后按照图像x1c 0d1x所示进行操作
通过选择终结器概述,它将给予有关准备由终结器线程清除的对象数量的信息以及终结器线程的相关信息。