【发布时间】:2014-03-13 00:35:20
【问题描述】:
假设我在 Linux 机器上安装了 2 个 Java 实例:一个 JRE 和一个 JDK。
如果我使用 JRE 运行 java program1.java,然后使用不同的 JDK 使用 jmap 获取 program1.java 的堆转储,为什么它会返回数据?
难道堆不应该只能由启动程序的 JVM 访问吗?
【问题讨论】:
假设我在 Linux 机器上安装了 2 个 Java 实例:一个 JRE 和一个 JDK。
如果我使用 JRE 运行 java program1.java,然后使用不同的 JDK 使用 jmap 获取 program1.java 的堆转储,为什么它会返回数据?
难道堆不应该只能由启动程序的 JVM 访问吗?
【问题讨论】:
第二个程序不执行生成堆转储所需的工作。它只是告诉第一个 JVM 去做。该机制取决于平台,但在 Linux 上,它是通过发送合适的信号来完成的。
请注意,对于 Java 6,Attach API 提供了一种新的可能性,它允许第二个 Java 程序与第一个 JVM 进行更多交互,但仍受第一个 JVM 的控制。
【讨论】:
jmap 进程附加到正在运行的 JVM 进程并使用调试 API 生成映射。无论jmap 安装在何处、JRE 或 JDK 目录或其他任何位置,都会发生这种情况。
【讨论】: