轉載請注明出處
http://blog.csdn.net/pony_maggie/article/details/44999175
作者:小馬
VisualVM 是一款免費的性能分析工具。它通過 jvmstat、JMX、SA(Serviceability Agent)以及 Attach API 等多種方式從程序運行時獲得實時數據,從而進行動態的性能分析。它最主要的功能是監控內存泄露,跟蹤垃圾回收,執行時內存、cpu分析,線程分析等。
通過實際的例子來說明。第一步我們要安裝viual VM, 比較好的是在jdk6之后的安裝目錄下自帶了這個工具,不用再獨立安裝。
打開之后如下圖:
當我們通過eclipse運行程序時,visual VM會自動識別到正在運行的程序,比如下面一段代碼頭:
- public class StringPoolTest
- {
- public void testStringPoolWithLongString()
- {
- long i = 0;
- while(true)
- {
- String longString = "this is a very very long string,to test the gc behavior of the string constant pool" + i;
- longString.intern();
- i++;
- }
- }
- /**
- * @param args
- */
- public static void main(String[] args)
- {
- StringPoolTest test = new StringPoolTest();
- test.testStringPoolWithLongString();
- }
- }
在eclipse下運行這段程序,然后到visual VM中打開監視視圖,看到如下的顯示情況:
CPU部分不顯示,應該是因為我運行的jdk版本太低。內存部分我們看到堆和perm的使用情況,注意看上面的程序,testStringPoolWithLongString函數是個死循環,不斷的調用String的intern,intern返回字符串對象的規范化表示形式,當調用 intern 方法時,如果池已經包含一個等於此 String 對象的字符串,則返回池中的字符串。否則,將此 String 對象添加到池中,並且返回此 String 對象的引用。java7以前,字符串常量池是放在perm空間的, 從java7開始,放在heap空間。我用的版本是1.6,所以如果我們切換到perm視圖看到的會是另一種景象,
從圖上可以看出,不斷的GC,又不斷的申請空間。
線程部分顯示的是當前用戶線程和守護線程的數量,