2014-03-12 36 views
0

假設我在Linux機器上安裝了2個Java實例:一個JRE和一個JDK。 如果我用JRE運行java program1.java,然後使用不同的JDK使用jmap獲得堆轉儲program1.java,爲什麼它會返回數據?訪問限於運行程序的JVM的Java堆

堆只能由啓動程序的JVM訪問嗎?

回答

2

第二個程序不執行生成堆轉儲所需的工作。它只是告訴第一個JVM做到這一點。該機制與平臺有關,但在Linux上,它是通過發送合適的信號完成的。

請注意,對於Java 6,Attach API中有一種新的可能性,允許第二個Java程序與第一個JVM進行更多的交互,但仍處於第一個JVM的控制之下。

1

jmap進程附加到正在運行的JVM進程並使用調試API生成映射。不管在哪裏安裝jmap,都會發生這種情況,在JRE或JDK目錄或其他任何地方。

+0

即使未在調試模式下啓動JVM,也可以觸發堆轉儲。 –