1. 程式人生 > >jvm 虛擬機參數_堆內存分配

jvm 虛擬機參數_堆內存分配

永久 shared fig println configure oid tro 日誌 大堆

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% )

jvm 虛擬機參數_堆內存分配