jvm診斷與優化(2)

jvm內存:如圖從左到右依次爲 jvm堆: java

[ (新生代)PSYoungGen:{ Eden\S0(form)\S1(to) } \ (老年代)ParOldGen:{ Old Memory} ] \ (方法區/持久區)Perm \ 再後就是系統內存了 shell

-XX:+PrintFlagsFinal     //查看jvm全部的系統參數值 jvm

-XX:PrintVMOptions    //查看你當前指定的參數 spa

如   java -Xmx20M -XX:+PrintVMOptions -XX:+PrintGC jvm.Test 20 日誌

VM option '+PrintVMOptions'
VM option '+PrintGC'
-XX:+PrintCommandLineFlags  //查看顯式與隱式指定的參數

如:java -Xmx20M -XX:+PrintCommandLineFlags -XX:+PrintGC jvm.Test 20 code

-XX:InitialHeapSize=20971520     //系統指定
-XX:MaxHeapSize=20971520         //系統指定
-XX:+PrintCommandLineFlags       //用戶指定
-XX:+PintGC                      //...
-XX:+UseCompressedOops 
-XX:-UseLargePagesIndividualAllocation 
-XX:+UseParallelGC

  -XX:PrintGC    //輸出GC處理信息 orm

package jvm;

public class Test {
	
	public static void main(String[] args) {
		int length = Integer.parseInt(args[0]);
		for (int i = 0; i < length; i++) {
			byte[] a = new byte[1*1024*1024];
		}
		//單位bytes
		System.out.println("maxMemory"+Runtime.getRuntime().maxMemory()/1000/1000+"M");
		System.out.println("maxMemory"+Runtime.getRuntime().freeMemory()/1000/1000+"M");
		System.out.println("maxMemory"+Runtime.getRuntime().totalMemory()/1000/1000+"M");
	}
}
java -Xmx10M -XX:+PrintGC jvm.Test 5

[GC 1642K->576K(9728K), 0.0165492 secs]
[GC 2708K->520K(9728K), 0.0012726 secs] 隊列

輸出說明 [2708K->520K] 指原有2708K 回收後變成 520K; [9728K] 可用堆空間總和大約爲10M; 最後是GC所花的時間 內存

 -XX:+PrintGCDetails   //GC更加詳細的信息 get

java -Xmx20M -XX:+PrintGCDetails jvm.Test 20

[GC [PSYoungGen: 5831K->496K(6656K)] 5831K->576K(19968K), 0.0014249 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
[GC [PSYoungGen: 5806K->472K(6656K)] 5886K->552K(19968K), 0.0008980 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
[GC [PSYoungGen: 5636K->440K(6656K)] 5716K->520K(19968K), 0.0019736 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
Heap
 PSYoungGen 
    total 6656K, used 5712K [0x00000000ff900000, 0x0000000100000000, 0x0000000100000000)
    eden space 6144K, 85% used [0x00000000ff900000,0x00000000ffe261e8,0x00000000fff00000)
    from space 512K, 85% used [0x00000000fff00000,0x00000000fff6e010,0x00000000fff80000)
    to   space 512K, 0% used [0x00000000fff80000,0x00000000fff80000,0x0000000100000000)
 ParOldGen  
    total 13312K, used 80K [0x00000000fec00000, 0x00000000ff900000, 0x00000000ff900000)
    object space 13312K, 0% used [0x00000000fec00000,0x00000000fec14000,0x00000000ff900000)
 PSPermGen  
    total 21504K, used 2549K [0x00000000f9a00000, 0x00000000faf00000, 0x00000000fec00000)
    object space 21504K, 11% used [0x00000000f9a00000,0x00000000f9c7d570,0x00000000faf00000)

輸出說明: 

[user] 用戶CPU耗時 [sys] 系統cpu耗時 [real] GC實際經歷時間; GC的打印信息能夠看到只對新生代作了內存回收

下面是jvm內存的信息了

新生代 可用空間爲 6656K(eden+from) 用了 5712k [下界,當前上界,上界]         

--當前空間的最大值:用上界減下界就能獲得 ,如新生代空間 (0x0000000100000000 -  0x00000000ff900000)/1024 = eden + from + to  = 6656+512 = 7168

--當前空間分配的大小 : 用當前上界減去下界; 若是當前上界等於下界,說明當前的堆空間沒有擴大的可能

 -XX:+PrintHeapAtGc  打印更加全面的堆信息(略)

-XX:+PrintGCTimeStamps   分析GC發生的時間

-XX:+PrintGCApplicationConcurrentTime  打印應用程序的執行時間

-XX:+PrintGCApplicationStoppedTime  打印應用程序因爲GC而產生的停頓時間

-XX:+PrintReferenceGC   跟蹤系統內的軟引用、弱引用、虛引用和Finallize隊列

-Xloggc   將GC的日誌以文件的形式輸出如:  java -Xmx20M  -Xloggc:E:/gc.log  jvm.Test  20

-verbose:class  等價於 -XX:TraceClassLoading  -XX:TraceClassUnloading    //跟蹤類的加載與卸載

-XX:+PrintClassHistogram     查看系統中類的分佈狀況; 運行後在控制後按Ctrl+Break

相關文章
相關標籤/搜索