1. 程式人生 > >【JVM虛擬機】(1)---常用JVM配置參數

【JVM虛擬機】(1)---常用JVM配置參數

str spa void 經歷 color borde free TE per

常用JVM配置參數

常用JVM配置參數主要有:Trace跟蹤參數堆的分配參數棧的分配參數

一、Trace跟蹤參數

跟蹤參數用於跟蹤監控JVM,對於開發人員來講用於JVM調優以及故障排查的。

1、打印GC的簡要信息

-verbose:gc
-XX:+PrintGC

這兩個配置參數效果是一樣的,都是在發生GC時打印出簡要的信息,例如執行代碼

public static void main(String[] args) {
        byte[] bytes = null;
        for (int i = 0; i < 100; i++) {
            bytes 
= new byte[1 * 1024 * 1024]; } }

這個程序連續創建了100個1M的數組對象,使用-XX:+PrintGC或-verbose:gc參數執行該程序,即可查看到GC情況:

技術分享圖片

我們可以看到程序執行了2次GC(minor GC),這兩次GC都是新生代的GC。

33038K表示回收前對象占用空間。1760K表示回收後對象占用空間。125952K表示還有多少空間可用。0.0044838 secs表示這次垃圾回收花的時間。

2、打印GC的詳細信息以及堆使用詳細信息

--打印GC詳細信息
-XX:+PrintGCDetails
--打印CG發生的時間戳
-XX:+PrintGCTimeStamps

使用-XX:+PrintGCDetails參數,查看控制臺打印結果:

技術分享圖片

通過打印GC詳細信息可以得出以下結論:

(1)Heap(堆)主要分為三大塊:堆分為(PSYoungGen)新生代、(ParOldGen)老年代、(Metaspace)元空間。

註意這裏沒有永久區了,永久區在java8已經移除,原來放在永久區的常量、字符串靜態變量都移到了元空間,並使用本地內存。

(2)(PSYoungGen)新生代又分為:伊甸區(eden)和幸存區(from和to)。

思考:上面total總的為38400K,它不是應該eden+from+to=total?這是因為新生代的垃圾回收算法是采用復制算法,簡單的說就是在from和to之間來回復制(復制過程中再把不可達的對象回收掉),

所以必須保證其中一個區是空的,這樣才能有預留空間存放復制過來的數據,所以新生代的總大小其實等於eden+from(或to)=33280K+5120K=38400k。

思考:不同對象一般放在哪個區呢?

(1)新生代主要存放的是哪些很快就會被GC回收掉的或者不是特別大的對象。

(2)老年代則是存放那些在程序中經歷了好幾次回收仍然還活著或者特別大的對象。

(3)元空間在這裏都是放著一些用於存儲類的信息、常量池、方法數據、方法代碼等。這個區中的東西比老年代和新生代更不容易回收。

3、使用外部文件記錄GC的日誌

-Xloggc:gc.log

我在eclipse.ini配置

-XX:+PrintGC
-Xloggc:gc.log

運行eclipse會有一個gc.log記錄日誌文件

二、堆的分配參數

1、-Xmx –Xms:指定最大堆和最小堆

我的eclipse.ini中這兩個的配置是:

-Xms256m
-Xmx1024m

然後我們在程序中運行如下代碼:

 System.out.println("Xmx=" + Runtime.getRuntime().maxMemory() / 1024.0 / 1024 + "M");          //系統的最大空間
 System.out.println("free mem=" + Runtime.getRuntime().freeMemory() / 1024.0 / 1024 + "M");    //系統的空閑空間
 System.out.println("total mem=" + Runtime.getRuntime().totalMemory() / 1024.0 / 1024 + "M");  //當前可用的總空間

運行效果:

技術分享圖片

2、-Xmn、-XX:NewRatio、-XX:SurvivorRatio

-Xmn
    設置新生代大小

-XX:NewRatio
     新生代(eden+2*s)和老年代(不包含元空間)的比值
    例如:4,表示新生代:老年代=1:4,即新生代占整個堆的1/5

-XX:SurvivorRatio(幸存代)
     設置兩個Survivor區和eden的比值
    例如:8,表示兩個Survivor:eden=2:8,即一個Survivor占年輕代的1/10

舉例:

-Xmx20m -Xms20m -XX:NewRatio=1 -XX:SurvivorRatio=3

代表最大最小堆內存都是20M,新生代:老年代為1:1。兩個Survivor區和eden的比值為2:3

3、-XX:PermSize -XX:MaxPermSize

--設置元數據區的初始空間和最大空間

有關優化總結:

(1)官方推薦新生代占堆的3/8

(2)幸存代占新生代的1/10

三、棧大小分配

1、-Xss

通常只有幾百K

決定了函數調用的深度

每個線程都有獨立的棧空間

局部變量、參數 分配在棧上

參考

1、Java虛擬機詳解----常用JVM配置參數

2、深入理解JVM(三)——配置參數

想太多,做太少,中間的落差就是煩惱。想沒有煩惱,要麽別想,要麽多做。少校【15】

【JVM虛擬機】(1)---常用JVM配置參數