我已经配置了我的 linux 远程机器(使用 JRE 1.7)来执行具有 jmx 必要属性的 java 应用程序:

java -Dcom.sun.management.jmxremote \
-Dcom.sun.management.jmxremote.port=5005 \
-Dcom.sun.management.jmxremote.local.only=false \
-Dcom.sun.management.jmxremote.authenticate=false \
-Dcom.sun.management.jmxremote.ssl=false \
-jar myapplication.jar

现在在我的 Windows 本地机器(我有 JDK 1.7)中,我想使用 jmap 工具,例如打印直方图:
jmap -histo 10.218.72.227:5005
但它因以下错误而失败:
Picked up _JAVA_OPTIONS: -Djava.net.preferIPv4Stack=true
Attaching to remote server 10.218.72.227:5005, please wait...
Error attaching to remote server: java.rmi.NotBoundException: Not bound: "SARemoteDebugger" (only bound name is "jmxrmi")

奇怪的是,我可以成功地使用 jconsole 进行连接,但首先它会提示我不安全地重试连接(没有 SSL)的消息:

因此,它似乎应该是 jmap 的某种标志才能工作,您知道如何克服这个问题吗?

最佳答案

遵循 jsadebugd - Serviceability Agent Debug Daemon 的手册页
您首先需要将它附加到您的进程中才能远程使用 jmap

以下步骤显示了它是如何工作的。

所有 Java 进程(本地和远程)使用的 Java 版本。



在远程主机上执行

  • 启动您的应用程序java -jar myapplication.jar
  • 启动 rmiregistryrmiregistry -J-Xbootclasspath/p:$JAVA_HOME/lib/sajdi.jar &
  • 使用 jps (e.g.12345) 获取应用程序的 PID
  • 将调试恶魔附加到您的应用程序jsadebugd 12345 42

  • 在本地主机上执行
  • 执行 jmapjmap -heap [email protected]

  • 本地主机上的输出
    Attaching to remote server [email protected], please wait...
    Debugger attached successfully.
    Server compiler detected.
    JVM version is 24.80-b11
    Iterating over heap. This may take a while...
    Object Histogram:
    
    num       #instances    #bytes  Class description
    --------------------------------------------------------------------------
    1:      5575    527488  * ConstMethodKlass
    2:      5575    493168  * MethodKlass
    ...
    

    附加说明:手册页说明 This utility is unsupported and may or may not be available in future versions of the JDK

    也许在远程机器上运行 jmap(例如通过 ssh)会是一个更好的方法。

    关于java - 如何在没有 SSL 的情况下远程使用 jmap?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30738519/

    10-10 15:54