2011-03-13 230 views

回答

6

您的應用程序已停止。獲得準確堆轉儲的唯一實用方法是在轉儲創建時停止所有應用程序活動。

這是「短暫」暫停還是「長時間」暫停取決於傾倒的程度。如果您使用「-dump」,那麼您將轉儲整個堆,包括無法訪問的對象。如果您使用「-dump:live」,則只會轉儲可到達的對象......但這也需要(至少)標記堆以確定哪些對象可到達。

但是,如果你傾銷一個千兆字節大小的堆,期望暫停時間以秒爲單位而不是毫秒來衡量。


回覆,你可以避開使用叉子停止JVM的建議,事實證明,派生一個多線程程序可能會出現問題:

然後就是資源ce使用問題。

+2

「否」=「它沒有停止」或否=「它不會繼續運行」? – meriton 2011-03-13 02:53:52

+0

即使這是大多數/所有JVM今天的做法,我不確定這是「獲得準確堆轉儲的唯一方法」。你也可以'fork'併爲子進程執行堆轉儲。這顯然會在寫入時使用大量內存,但如果您隨意使用免費頁面,則可能不會多達2倍。 – Ramon 2015-01-25 18:42:31

+0

@Ramon。將「唯一的方式」改爲「唯一可行的方式」。 – 2015-01-25 23:24:30

3

我會說你的程序在暫停內存轉儲時暫停。 內存轉儲是您正在運行程序的快照,因此在讀取內存時,jmap需要暫時鎖定JVM。然而,要將轉儲文件發送回客戶端,可以在單獨的線程中完成,從而最大限度地減少暫停。

5

我在試圖在生產機器上執行此操作時遇到了問題,它使用jmap創建hprof文件,並將年齡自然鎖定java webapp。

我找到了這個網頁:

http://blogs.atlassian.com/2013/03/so-you-want-your-jvms-heap/

對此解釋稱,您還可以使用gdb的(在Linux系統上)轉儲Java進程的核心。

通過這個核心文件,您可以在單獨的進程中生成用於分析的hprof文件,以防止java服務器進程被長時間打斷。如果您要使用jmap運行相同的操作,會發生什麼情況。

總結:

下載安裝GDB

apt-get的更新

的apt-get安裝GDB

...

得到的java程序你感興趣

JPS 的java進程ID ...

與過程

GDB [啓動GDB會話pid] ...

然後生成核心文件:

的gcore /tmp/jvm.core

結束GDB會話

分離 退出

然後用核生成文件以生成hprof文件:

須藤JMAP -dump:格式= B,文件= jvm.hprof的/ usr/bin中/ JAVA /tmp/jvm.core

然後(克)ZIP文件起來,並將其複製到計算機中進一步分析。