如何在没有SSL的情况下使用jmap remotelly?

时间:2015-06-09 17:06:21

标签: java ssl java-7 jmx remote-debugging

我已经配置了我的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):

enter image description here

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

1 个答案:

答案 0 :(得分:1)

关注jsadebugd - Serviceability Agent Debug Daemon的手册页 您需要先将其附加到您的流程才能远程使用jmap

以下步骤说明了它的工作原理。

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

  

java版“1.7.0_80”
  Java(TM)SE运行时环境(版本1.7.0_80-b15)
  Java HotSpot(TM)服务器VM(内置24.80-b11,混合模式)

在远程主机上执行

  1. 开始申请 java -jar myapplication.jar
  2. 开始rmiregistry
    rmiregistry -J-Xbootclasspath/p:$JAVA_HOME/lib/sajdi.jar &
  3. 使用jps(例如12345)
  4. 获取应用程序的PID
  5. 将调试恶魔附加到您的应用程序
    jsadebugd 12345 42
  6. 在本地主机上执行

    1. 执行jmap
      jmap -heap 42@10.218.72.227
    2. 在本地主机上输出

      Attaching to remote server 42@10.218.72.227, 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)是一种更好的方法。