深入JVM之——Trace參數

         最近學Hadoop發現有必要了解一下JVM的原理及運行機制,因爲Hadoop中運用的大量的JVM實例。比如NameNode、DataNode,JobTraker等。這些和守護進程在Hadoop體系中運行需要根據實際情況來自行調整相關參數。所以準備系統學習一下JVM,好了廢話不多說。我們這一節講解一下監控GC執行和JVM基本內存狀態。

              首先設置最簡單的跟蹤GC的運行參數設置如下(如何在Eclipse中設置運行參數這裏不多說了,大家可以百度):

 -verbose:gc在虛擬機發生內存回收時在輸出設備顯示信息,格式如下: [Full GC 256K->160K(124096K), 0.0042708 secs] 該參數用來監視虛擬機內存回收的情況。

然後我們新建一個類,在main方法中我們寫出如下形式

運行後我們發現:

上面第一行GC也叫Minor GC,他專門負責回收年輕代區域的內存,第二行Full GC也叫Major GC他專門負責回收年老代區域的內存。1900K->536K表示年輕代GC回收了(1900-536)k大小的內存。536K->462K表示年老代GC回收了(536-462)k大小的內存.而整個年輕代和年老代區域各佔有55744k的內存大小。

如果想看到更加詳細的GC輸出,可以將參數-XX:+PrintGC改爲-XX:+PrintGCDetails繼續運行之後我們發現

現在我們可以看到更加詳細的GC回收,並且在程序運行完成之後,還打印了的年輕代、年老代、持久區域的內存使用情況。eden表示新生代,form和to表示兩個倖存代(Survivor)區域。最下面還多出了PSPermGen表示持久代區域。

這裏我解釋一下[0x00000000ed160000,0x00000000ed23af50,0x00000000edfa0000)這句話的具體含義。以第一個0x00000000ed160000表示一個區域的低邊界就是起始的內存地址,第二個0x00000000ed23af50表示當前邊界也就是當前佔用到哪個位置。第三個0x00000000edfa0000示最高邊界也就是該區域最大能申請到的位置。很顯然這句話代表的這個區域並沒有完全使用空閒內存區域。

其他具體含義我想不用我說了,大家都能直接看懂。

如果想每次調用GC都輸出一下heap信息,則可以用這個參數-XX:+PrintGCHeapAtGC。我們執行後看到


大家可以從上面看出GC前後Heap內存形態是明顯有變化的。


-XX:+TraceClassLoading監控類加載情況。配置參數後我們運行程序


我們看到了JAVA程序加載了哪些類。


另外如果想把GC輸出重定向到磁盤上的一個具體的文件則可以使用-Xloggc:文件路徑!



發佈了13 篇原創文章 · 獲贊 2 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章