回答
您的應用程序已停止。獲得準確堆轉儲的唯一實用方法是在轉儲創建時停止所有應用程序活動。
這是「短暫」暫停還是「長時間」暫停取決於傾倒的程度。如果您使用「-dump」,那麼您將轉儲整個堆,包括無法訪問的對象。如果您使用「-dump:live」,則只會轉儲可到達的對象......但這也需要(至少)標記堆以確定哪些對象可到達。
但是,如果你傾銷一個千兆字節大小的堆,期望暫停時間以秒爲單位而不是毫秒來衡量。
回覆,你可以避開使用叉子停止JVM的建議,事實證明,派生一個多線程程序可能會出現問題:
- fork in multi-threaded program
- Multithreaded fork
- http://www.linuxprogrammingblog.com/threads-and-fork-think-twice-before-using-them
然後就是資源ce使用問題。
我會說你的程序在暫停內存轉儲時暫停。 內存轉儲是您正在運行程序的快照,因此在讀取內存時,jmap需要暫時鎖定JVM。然而,要將轉儲文件發送回客戶端,可以在單獨的線程中完成,從而最大限度地減少暫停。
我在試圖在生產機器上執行此操作時遇到了問題,它使用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文件起來,並將其複製到計算機中進一步分析。
- 1. 禁用JVM調試的JMap
- 2. 防止JVM執行System.exit()
- 3. Javascript執行何時停止?
- 4. 啓動/停止JVM
- 5. urlrewriter.net項目停止了嗎?
- 6. 運行時執行意外停止
- 7. php在運行時停止執行
- 8. 停止javascript執行
- 9. 停止執行JavaScript
- 10. 瀏覽器停止/崩潰是否停止腳本執行?
- 11. 停止執行代碼時在Page_Load中
- 12. 時停止執行刪除和更新
- 13. 承諾超時後停止執行
- 14. Excel執行循環時停止響應
- 15. 在執行時停止查詢
- 16. Trace32程序停止時執行腳本
- 17. 如何在執行promise時停止$ ionicLoading?
- 18. JMAP轉儲沒有在java執行:runtime.exec()
- 19. 停止所有JavaScript執行
- 20. JRuby - 停止腳本執行
- 21. 停止執行代碼
- 22. Java執行隨機停止
- 23. 如何停止Maven執行
- 24. GWT突然停止執行
- 25. 停止執行()開幕
- 26. 停止執行Ruby腳本
- 27. javascript:setInterval執行不停止
- 28. 停止執行getCurrentPosition方法
- 29. 在JavaScript中停止執行
- 30. 停止ngAfterContentInit執行兩次
「否」=「它沒有停止」或否=「它不會繼續運行」? – meriton 2011-03-13 02:53:52
即使這是大多數/所有JVM今天的做法,我不確定這是「獲得準確堆轉儲的唯一方法」。你也可以'fork'併爲子進程執行堆轉儲。這顯然會在寫入時使用大量內存,但如果您隨意使用免費頁面,則可能不會多達2倍。 – Ramon 2015-01-25 18:42:31
@Ramon。將「唯一的方式」改爲「唯一可行的方式」。 – 2015-01-25 23:24:30