Java 使用Jconsole解决内存泄漏

Java 使用Jconsole解决内存泄漏,java,spring,tomcat,memory-leaks,jconsole,Java,Spring,Tomcat,Memory Leaks,Jconsole,我正在尝试诊断J2EE服务器中的一些内存问题。我已经在我们的live服务器上安装了jconsole,并试图通过它监视tomcat服务器的状态。我有一个关于jconsole中的Threads选项卡的快速问题。我可以在线程列表中看到一个名为Finalizer的线程。此线程中的“总阻止”数不断增加。例如,现在是4049,一小时前是3867 名称:终结器 状态:正在等待java.lang.ref.ReferenceQueue$Lock@1b79cfd 阻止总数:4049等待总数:1579 这条线是什么意

我正在尝试诊断J2EE服务器中的一些内存问题。我已经在我们的live服务器上安装了jconsole,并试图通过它监视tomcat服务器的状态。我有一个关于jconsole中的Threads选项卡的快速问题。我可以在线程列表中看到一个名为Finalizer的线程。此线程中的“总阻止”数不断增加。例如,现在是4049,一小时前是3867

名称:终结器
状态:正在等待java.lang.ref.ReferenceQueue$Lock@1b79cfd
阻止总数:4049等待总数:1579

这条线是什么意思?它与GC有什么关系吗?我下载了一个堆转储,其中显示待完成的对象数为零

目前我的服务器的最大堆大小是200MB,堆大小保持在100到150MB之间,当我单击“执行GC”时,我可以看到一些堆空间被释放。然而,这并没有改变这个tomcat进程在windows任务管理器中占用的内存量,它目前正在消耗超过700MB的内存

如果能给我一些建议,我将不胜感激。如果您需要有关我的服务器设置的更多信息,请向我提问


提前感谢。

windows任务管理器显示虚拟内存大小,大多数情况下并不准确。我已经看过很多次了,JConsole显示的内存占用就是正确的内存占用


有关JConsole检查的更多信息。

在我看来像是死锁:


您是否有任何可能无限期等待的同步方法?

我想我已经找到了问题的答案。“Total blocked”和“Total waited”只是计算线程等待或被阻止的次数。JConsole正在从中获取此信息

Blocked count是线程被阻止进入或重新进入监视器的总次数。即线程处于java.lang.thread.State.BLOCKED状态的次数

Waitied count是线程等待通知的总次数。i、 e.线程处于java.lang.thread.State.WAITING或java.lang.thread.State.TIMED_等待状态的次数

名称:终结器状态:正在等待 java.lang.ref.ReferenceQueue$Lock@1b79cfd 总阻止数:4049总等待数: 1579

ReferenceQueue正在维护所有未使用对象的引用(等待最终确定),换句话说,有4049个对象正在等待垃圾收集


在查找内存泄漏时,请确保在执行转储之前执行完整GC(或多次GC,直到无法回收任何内容)

好吧,我在jconsole中使用了检测死锁功能,但找不到任何内容。它说没有检测到死锁。谢谢你的链接。我以前也看过那一页。它有我正在谈论的终结器线程的屏幕截图(图3-8)。但是,它没有涉及线程的任何细节,也没有涉及总阻塞、总等待属性。顺便说一下,在我的测试中,时间是以秒为单位的。