使用Jconsole进行内存泄漏

时间:2010-11-15 06:07:00

标签: java spring tomcat memory-leaks jconsole

我正在尝试诊断J2EE服务器中的一些内存问题。我在我们的实时服务器上设置了jconsole,我正试图通过它监视tomcat服务器的状态。我有一个关于jconsole中Threads选项卡的快速问题。我可以在线程列表中看到一个名为Finalizer的线程。此线程中的“Total blocked”数字不断增加。例如,它现在是4,049,一小时前它是3,867。

Name: Finalizer
State: WAITING on java.lang.ref.ReferenceQueue$Lock@1b79cfd
Total blocked: 4,049 Total waited: 1,579

这个帖子是什么意思?它是否与GC有关?我已经下载了一个堆转储,它显示了待完成的对象数量为零。

我的服务器的最大堆大小目前是200MB,堆大小保持在100到150 MB之间,当我点击'Perform GC'时,我可以看到一些堆空间被释放。但是,这不会改变这个tomcat进程在Windows任务管理器中占用的内存量,目前这个内存消耗超过700 MB。

我将非常感谢任何关于我应该怎么做的提示。如果您需要有关我的服务器设置的更多信息,请向我提问。

提前致谢。

4 个答案:

答案 0 :(得分:10)

我想我找到了问题的答案。 'Total blocked'和'Total waited'只是线程等待或被阻止的次数的计数。 JConsole从ThreadInfo获取此信息。

  

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

     

等待计数是线程等待通知的总次数。即线程在java.lang.Thread.State.WAITING或java.lang.Thread.State.TIMED_WAITING状态中的次数。

答案 1 :(得分:1)

  

名称:终结者状态:等待   java.lang.ref.ReferenceQueue$Lock@1b79cfd   被阻止的总数:4,049总等待数:   1579

ReferenceQueue正在维护所有未使用对象的引用(等待完成),换句话说,有4049个对象在等待垃圾回收。

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

答案 2 :(得分:0)

Windows任务管理器显示虚拟内存大小,并且大部分时间都不准确。我已经看到了很多时间,JConsole显示的是足迹是正确的内存占用。

有关JConsole的更多信息,请检查here

答案 3 :(得分:0)

对我来说似乎是一个僵局: http://download.oracle.com/javase/tutorial/essential/concurrency/deadlock.html

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