1、參數
-XX:+PrintGC 只要遇到 GC 就會打印日志
-XX:+UseSerialGC 配置串行回收器
-XX:+PrintGCDetails 查看詳細信息,包括各個區的情況
-XX:+PrintCommandLineFlags 可以將隱式或顯式傳給虛擬機的參數輸出
-Xms4m 設置堆初始大小為 4m
-Xmx20m 設置堆最大為 20m
2、備注
以 -XX:+PrintGC 為例子
1、-XX 表示對系統級別的 ( jvm ) 配置,比如日志信息、使用什么樣的垃圾回收器
2、非 -XX 基本上都是對應用層面上的配置,比如內存、方法區、棧的大小等等( 例子 -Xms4m 設置堆的初始大小為 4m )
3、PrintGC 前面的 "+" 表示啟用,如果是 "-" 則表示禁用
3、測試代碼
public static void main(String[] args) { //-Xms5m -Xmx20m -XX:+PrintGCDetails -XX:+UseSerialGC -XX:+PrintCommandLineFlags //查看 GC 信息 System.out.println("max memory" + Runtime.getRuntime().maxMemory());//最大內存 System.out.println("free memory" + Runtime.getRuntime().freeMemory());//空閑內存 System.out.println("total memory" + Runtime.getRuntime().totalMemory());//總共使用的內存
System.out.println("=========================================================="); byte[] b1 = new byte[1*1024*1024]; System.out.println("max memory" + Runtime.getRuntime().maxMemory());//最大內存 System.out.println("free memory" + Runtime.getRuntime().freeMemory());//空閑內存 System.out.println("total memory" + Runtime.getRuntime().totalMemory());//總共使用的內存 System.out.println("==========================================================");
byte[] b2 = new byte[4*1024*1024]; System.out.println("max memory" + Runtime.getRuntime().maxMemory());//最大內存 System.out.println("free memory" + Runtime.getRuntime().freeMemory());//空閑內存 System.out.println("total memory" + Runtime.getRuntime().totalMemory());//總共使用的內存 }
4、eclipse 配置 jvm 參數
右鍵 --> Run As --> Run Configurations 。在 VM arguments 中輸入 -Xms5m -Xmx20m -XX:+PrintGCDetails -XX:+UseSerialGC -XX:+PrintCommandLineFlags
( 進入 Run Configurations 界面后,Java Application 沒有對應的選項,你需要先 右鍵 --> Run As --> Java Application )
5、控制台打印結果
1 -XX:InitialHeapSize=5242880 -XX:MaxHeapSize=20971520 -XX:+PrintCommandLineFlags -XX:+PrintGCDetails -XX:+UseCompressedOops -XX:-UseLargePagesIndividualAllocation -XX:+UseSerialGC 2 max memory20316160 3 free memory4449752 4 total memory5111808 5 ========================================================== 6 [GC [DefNew: 646K->128K(1536K), 0.0022938 secs] 646K->470K(4992K), 0.0023261 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 7 max memory20316160 8 free memory3552072 9 total memory5111808 10 ========================================================== 11 [GC [DefNew: 1180K->0K(1536K), 0.0027321 secs][Tenured: 1494K->1494K(3456K), 0.0023825 secs] 1523K->1494K(4992K), [Perm : 2544K->2544K(21248K)], 0.0051517 secs] [Times: user=0.02 sys=0.00, real=0.00 secs] 12 max memory20316160 13 free memory3636792 14 total memory9441280 15 Heap 16 def new generation total 1664K, used 108K [0x00000000f9a00000, 0x00000000f9bc0000, 0x00000000fa0a0000) 17 eden space 1536K, 7% used [0x00000000f9a00000, 0x00000000f9a1b148, 0x00000000f9b80000) 18 from space 128K, 0% used [0x00000000f9b80000, 0x00000000f9b80000, 0x00000000f9ba0000) 19 to space 128K, 0% used [0x00000000f9ba0000, 0x00000000f9ba0000, 0x00000000f9bc0000) 20 tenured generation total 7556K, used 5590K [0x00000000fa0a0000, 0x00000000fa801000, 0x00000000fae00000) 21 the space 7556K, 73% used [0x00000000fa0a0000, 0x00000000fa615bc8, 0x00000000fa615c00, 0x00000000fa801000) 22 compacting perm gen total 21248K, used 2554K [0x00000000fae00000, 0x00000000fc2c0000, 0x0000000100000000) 23 the space 21248K, 12% used [0x00000000fae00000, 0x00000000fb07eba0, 0x00000000fb07ec00, 0x00000000fc2c0000) 24 No shared spaces configured.
6、分析打印結果
01、第 01 行:之所以會有第一行的打印,是因為 +PrintCommandLineFlags 這個參數 02、第 02 行:最大內存 20316160 03、第 03 行:空閑內存 4449752 04、第 04 行:使用內存 5111808 05、================== 06、第 06 行:DefNew 新生區經過 gc 后內存情況,[DefNew: 646K->128K(1536K), 0.0022938 secs] 新生區內存使用由 646K 變為 128K ,耗時 0.0022938 secs。[Times: user=0.00 sys=0.00, real=0.00 secs] 執行時間 用戶的、系統的、走完這段代碼實際耗時的 07、第 07 行:最大內存 20316160 08、第 08 行:空閑內存 3552072 09、第 09 行:使用內存 5111808 10、================== 11、第 11 行:[DefNew: 1180K->0K(1536K), 0.0027321 secs] 新生區內存使用由 1180K 變為 0k,[Tenured: 1494K->1494K(3456K), 0.0023825 secs] 老年區內存使用由 1494K 變為 1494K,[Perm : 2544K->2544K(21248K)], 0.0051517 secs] 永久區內存使用由 2544K 變為 2544K,[Times: user=0.02 sys=0.00, real=0.00 secs] 耗時情況
12、第 12 行:最大內存 20316160
13、第 13 行:空閑內存 3636792
14、第 14 行:使用內存 9441280 ( 當使用內存高於最小內存時,就會向最大內存借,借多少用多少,9441280 = 4m + 5111808 )
15、第 15 行:Heap 堆使用明細 ( 之所以會打印明細是因為 -XX:+PrintGCDetails 這個參數 )
16、第 16 行:def new generation total 1664K, used 108K,新生區 總共 1664k ,使用了 108k
17、第 17 行:eden space 1536K, 7% used,eden( 伊甸園區 ) 總共 1536k,使用了 7%
18、第 18 行:from space 128K, 0% used,from( s0 區 ) 總共 128k,使用了 0%
19、第 19 行:to space 128K, 0% used,to( s1 區 ) 總共 128k,使用了 0%
20、第 20 行:tenured generation total 7556K, used 5590K,老年區 總共 7556k 使用了 5590k
21、第 21 行:the space 7556K, 73% used,總共 7556k 使用了 73%
22、第 22 行:compacting perm gen total 21248K, used 2554K,方法區( 永久區 ) 總共 21248k 使用了 2554k
23、第 23 行:the space 21248K, 12% used,總共 21248k 使用了 12%
7、總結
實際工作中,將初始化堆內存大小與最大堆內存大小設置相等,這樣可以減少程序運行時垃圾回收次數,從而提高性能。( 個人建議調到 80% )