叫練手把手教你讀JVM之GC信息

案例


衆所周知,GC主要回收的是堆內存,堆內存中包含年輕代和老年代,年輕代分爲Eden和Surivor,以下圖所示。咱們用案例分析下堆的GC信息【版本:HotSpot JDK1.8】。java

image.png

/**
 * @author :jiaolian
 * @date :Created in 2021-03-15 15:02
 * @description:新生代內存測試
 * @modified By:
 * 公衆號:叫練
 */
public class NewGenTest {
    public static void main(String[] args) {
        //每次在Eden申請1M空間
        byte[] bytes = null;
        for (int i=0; i<5; i++) {
            bytes = new byte[1024*1024];
        }
    }
}

案例很簡單,for循環運行5次,每次在Eden申請1M空間,假設咱們分配堆內存空間是20m,並打印GC詳細信息,配置過程:-XX:+PrintGCDetails -Xmx20m。微信

  • -XX:+PrintGCDetails:打印GC詳細信息。
  • -Xmx20m:分配最大堆內存空間是20m。


GC詳細分析


運行程序,IDEA控制檯打印結果以下:ide

  1. 第一句話:年輕代GC了一次,由於第五次循環,Eden滿了,年輕代內存約6M(6144K),Eden回收前約5M(5057K),回收後是489K,年輕代內存回收前約是5M,回收後約是2M(1783K),總堆內存大小約是20M(19968K),GC耗時0.0016002 secs。
  2. 第二句話:年輕代總內存約6M,使用約5M。
  3. 第三句話:eden空間總內存約5M(5632K),使用率是94%。
  4. 第四句話:from是512K,使用率是95%。
  5. 第五句話:老年代總空間約14M(13824K),使用了1294K,這個使用空間是由於程序在Eden申請1M空間,判斷空間不夠,就申請from或者to空間,發現只有512K,就觸發monitor GC,將1M內存申請在老年代。
  6. 第六句話:元空間內存。

image.png

  • -Xms 初始堆大小,不夠時,會自動擴展,因此通常Xms空間和Xmx最大堆空間設置成同樣的。

上面程序不變,設置JVM參數,-XX:+PrintGCDetails -Xmx20m -Xms5m,運行程序,部分結果以下圖所示。學習

image.png

如上圖所示:初始化堆大小是5M,新生代內存一共發生了4次GC,從上圖能夠分析,Eden只有1M多內存能夠被申請,因此第二次for循環申請1M空間就觸發了GC,數據就被丟進老年代,連續3次後,GC堆的空間由5M變爲了6M,說明初始化堆空間不夠使,能夠自動擴展堆內存。測試


固然咱們還能夠經過-Xmn 設置年輕代大小。下面咱們看看年輕代中,Eden和from/to區域怎麼劃分。spa

上面程序不變,設置JVM參數,-XX:+PrintGCDetails -Xmx20m -Xmn10m -XX:SurvivorRatio=2,運行程序,部分結果以下圖所示。3d

  • -Xmn10m:設置新生代內存爲10m
  • -XX:SurvivorRatio=2:設置新生代中eden和Survivor比例是2:1

image.png

咱們設置新生代是10M,這裏顯示新生代大小是7.5M(7680K),實際上from/to是有一塊空間是每次GC作交換的區域(方便垃圾回收),因此實際上7680K=5120+2560。5120/2560=2,也就是新生代和Survivor空間比例。blog


另外還有:-XX:NewRatio:設置老年代和新生代比例,通常是1/3)。好比設置-XX:NewRatio=2 -XX:+PrintGCDetails -Xmx30mip

那麼老年代空間是20M,新生代空間是10M。內存


總結


最後總結下:

  • -XX:+PrintGCDetails:打印GC詳細信息。
  • -Xmx20m:分配最大堆內存空間是20m。
  • -Xmn10m:設置新生代內存爲10m
  • -XX:SurvivorRatio=2:設置新生代中eden和Survivor比例。
  • -XX:NewRatio:設置老年代和新生代比例,通常是1/3)。

今天學習了JVM之GC信息參數配置,寫的不全同時還有許多須要修正的地方,但願親們加以指正和點評,喜歡的請點贊加關注哦。點關注,不迷路,我是叫練公衆號,微信號【jiaolian123abc】邊叫邊練。

相關文章
相關標籤/搜索