想知道什麼是各種工具&用於調試Java應用程序的生產問題。 贊,可用於調試生產的工具Java應用程序中的問題
- 什麼是採取線程轉儲的方式和工具?
- 採取堆轉儲的方式和工具是什麼?
- 什麼是分析上述轉儲的工具?
(假設所有的都在的Linux/Unix環境)
想知道什麼是各種工具&用於調試Java應用程序的生產問題。 贊,可用於調試生產的工具Java應用程序中的問題
(假設所有的都在的Linux/Unix環境)
什麼是採取線程轉儲的方式和工具?
對於一個線程轉儲,您可以使用JConsole的,VisualVM的,或者更簡單地說,發出退出信號目標進程
kill -QUIT <pid>
或
kill -3 <pid>
由於Java 5,也是jstack
這是獨立於平臺,並有一個很好的-m
選項來打印Java和本機幀(混合模式)。
採取堆轉儲的方式和工具是什麼?
在Sun的虛擬機,jmap
,孫JConsole,孫VisualVM,SAP JVMMon。對於IBM VM,請檢查this page。實際上,Eclipse MAT wiki有一個不錯的Getting a Heap Dump部分,總結了所有選項。
什麼是分析上述轉儲的工具?
對於線程轉儲,我使用TDA - Thread Dump Analyzer(用於Sun JDK)和IBM Thread and Monitor Dump Analyzer(用於IBM JDK)。 Samurai也非常好(它的工作原理類似於tail -f
,並自動從std/stderr中讀取線程轉儲,它也可以讀取「-verbose:gc」日誌),並且已經針對來自Apple,BEA,HP,Sun和VM的VM進行了測試IBM(也可以閱讀IBM的javacore)。
對於堆轉儲,我使用VisualVM(對於Sun JDK)或IBM Heap Dump Analyzer(僅適用於IBM JDK)或根據我的需要使用的極好的Eclipse MAT。後者是,能夠與HPROF二進制堆轉儲(由Sun,HP,SAP等生成的JVM),IBM系統轉儲(對它們進行預處理之後)以及來自各種IBM的IBM便攜式堆轉儲(PHD)平臺)。
謝謝!我會通過這些鏈接獲取更多信息... – 2010-05-31 01:14:16
假設JDK 6,看看下面的文章,以獲得一個正在運行的程序的線程轉儲:
http://java.sun.com/developer/technicalArticles/Programming/Stacktrace/
你可以使用與jHat做堆分析:
http://java.sun.com/javase/6/docs/technotes/tools/share/jhat.html
如果你想要做的內存轉儲看看JMAP:
http://java.sun.com/javase/6/docs/technotes/tools/share/jmap.html
另外,如果你需要做更多的一些深入的分析一下探查如Yourkit:
還有這兩件事情,可以令您感興趣:
而且我認爲在生產環境中調試Java應用程序的最佳方式不是傾倒等,但日誌良好的同治。
參見例如slf4j。
咦?線程轉儲和堆轉儲非常有價值,並且儘管日誌也非常有用,但當您獲得此OOM時,它們不會告訴您線程(包括服務器之一)在做什麼或內存中有什麼。只能使用日誌進行嚴重的問題分析(尤其是如果您指的是應用程序日誌)。 – 2010-05-28 19:37:20
日誌主要用於獲取有關您以後會問的問題的答案。那麼,那些你沒有想到的問題呢? – 2010-05-31 03:56:00
JVM沒有標準工具集。這些依賴於供應商,您應該查閱文檔。
對於Sun Java 6,VisualVM程序對於獲取正在運行的程序的快速配置文件和堆棧跟蹤非常有幫助。
我用這種調試的Sun JVM的工具是
要調試內存分配問題,可以在命令行中使用InMemProfiler。實時與收集的分配可以被跟蹤並且收集的對象可以根據其生命週期被分成桶。
在跟蹤模式下,該工具可用於identify the source of memory allocations。
我編輯了你的文章,因爲我相當確定你對內存_dumps_,而不是內存_dumbs_ ;-) – 2010-05-28 18:06:06
你對內存轉儲和堆轉儲有什麼區別? – 2010-05-28 19:39:53
謝謝大家,指出所有的錯字..我糾正了我的問題。 – 2010-05-31 01:13:38