在加载下收集Java heapdump

时间:2010-08-19 11:55:15

标签: java tomcat

我正在对运行在Java 6上的Tomcat 6运行负载。我想在Tomcat服务器负载时收集Java堆的堆转储。我通常使用jmap -dump来收集我的heapdumps。

但是,当我尝试在Tomcat处理高负载时执行此操作时,我发现heapdump集合失败。

jmap是从负载下的进程收集堆转储的最佳工具吗?导致jmap无法收集堆转储的可能原因是什么?

如果jmap不是最好的工具 - 哪个更好?

我可以完全接受jmap(或其他工具)在进行堆转储时在Java进程中停止世界。

3 个答案:

答案 0 :(得分:2)

jmap是从负载下的进程收集堆转储的最佳工具吗?

我想:不,不是。 From this link

  

注意 - 此实用程序不受支持   将来可能会或可能不会   JDK的版本。

答案 1 :(得分:2)

我也发现jmap可以很有气质。如果您遇到问题:

  • 再试一次。如果第一次失败,它经常会在几次尝试后设法获得堆转储
  • 使用-F选项
  • 添加-XX:+ HeapDumpOnOutOfMemoryError作为标准配置,以便在抛出OOM错误时主动进行堆转储
  • 以交互方式运行Tomcat并在ctrl-break选项中添加堆转储。这也给你一个线程转储,无论如何你可能需要的东西
  • 如果您的堆大小特别大并且您有可重复的条件,请暂时降低堆大小。它使得生成的文件更容易处理,花费更少的时间并且更有可能成功

答案 2 :(得分:2)

我发现使用JMX端口运行Tomcat允许我使用visualvm进行远程heapdump。当jmap失败时,这成功了。