如何从远程服务器获取JVM的堆转储(Heap Dump)?

11

如何从运行在Linux上的WL应用程序服务器上的远程JVM获取堆转储?

当我在本地Windows机器上运行时,我知道如何获取转储。但是,如何从用户验收测试服务器获取转储?谢谢。


我通常通过SSH登录并操作它。 - jmj
这个问题不适合在 Stack Overflow 上提问。Stack Overflow 上的问题必须与编程直接相关。关于远程服务器管理的问题应该转向 [sf] 提问。 - spicy.dll
4个回答

12
您可以使用JMX连接到远程应用程序服务器(需要事先启用),并使用HotSpotDiagnostic MBean来获取堆转储。
您可以使用JConsoleVisualVM调用MBean操作。
Mike Haller的post描述了如何在JVisualVM中使用此方法。

2

由于它是一个 *-nix 系统,如果您拥有必要的权限,那么使用 SSH 协议连接将非常容易:

  • Connect to the remote machine:

    ssh user@remote-machine-ip-address
    
  • Enter the user password once prompted for it (it should be the one for the user on the remote machine and not your current system user).

  • Generate your heap dump using the jmap utility (JDK binaries path should be availble into your system PATH variable or use a full path to it):

    jmap -dump:format=b,file=cheap.bin <pid>
    

3
JRE没有jmap实用程序,只有JDK才带有jmap。 - anjanb
1
@anjanb 谢谢提醒,我已经更新了答案 :) - tmarwen

1

有三个步骤:

  1. ssh到您的服务器

ssh <your_user_name>@<remote_ip>

  1. jmap触发内存转储

jmap -dump:format=b,file=<your_file_name> <your_jvm_pid>

  1. 通过jhat可视化堆(这里512m是大小限制,您可以根据泄漏文件的大小设置它,如-J-Xmx2g)

jhat -J-Xmx512m <your_file_name>

jhat -port 7401 <your_file_name>

我写了一篇博客来帮助分析性能问题:性能优化


当服务器仅使用JRE(而不是JDK)运行时,服务器上将无法使用jmap工具。 - Michiel Haisma
2
@MichielHaisma,为什么你要关注这个答案而不是那个答案?在决定开始赏金之前,难道不应该考虑所有的答案吗? - Holger

1
我已成功使用Visual VM进行线程转储和堆转储,但您没有列出JAVA版本?
JAVA Visual VM不再随JAVA一起提供,但仍可从此处下载,并且仍在维护中。他们刚刚发布了一个新的小版本:2021年10月19日:发布VisualVM 2.1.1

VisualVM也作为Java VisualVM在Oracle JDK 6〜8中分发。 它已在Oracle JDK 9中停止。

这里是从Dzone连接到VM的步骤,VisualVM:通过SSH(JMX或非JMX)监视远程JVM 对于其他替代方案,Baeldung JAVA网站提供了很棒的信息和教程,其中包括Java Profilers指南

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接