假设我在Linux机器上安装了2个Java实例:JRE和JDK。
如果我使用JRE运行java program1.java
,然后使用不同的JDK使用program1.java
获取jmap
的堆转储,为什么它会返回数据?
堆不应只能由启动程序的JVM访问吗?
答案 0 :(得分:2)
第二个程序不执行生成堆转储所需的工作。它只是告诉第一个JVM这样做。该机制取决于平台,但在Linux上,它通过发送合适的信号来完成。
请注意,对于Java 6,Attach API中有一种新的可能性,它允许第二个Java程序与第一个JVM进行更多的交互,但仍然在第一个JVM的控制之下。
答案 1 :(得分:1)
jmap
进程附加到正在运行的JVM进程,并使用调试API生成映射。无论安装jmap
的位置如何,在JRE或JDK目录中或其他任何位置都会发生这种情况。