Java1.8 JVM配置 GC日志輸出


 

                            Java1.8 堆內存模型,移除永久代,變成了元數據區

  由上圖可以看出,jdk1.8的內存模型是由2部分組成,年輕代 ,年老代。

    • 年輕代:Eden + 2*Survivor
    • 年老代:OldGen
    • 在jdk1.8中變化最大的Perm區,用Metaspace (元數據空間)進行了替換。

  注意:

    Metaspace所占用的內存空間不是在虛擬機內部,而是在本地內存空間中,這也是與1.7的永久代最大的區別所在

 

1、配置GC日志輸出目錄,方便分析Gc日志

-Xloggc:log/gc.log

 

 

2、配置查看JVMGC日志信息

  

-Xmx20m  //最大堆內存
-Xms20m  //最小堆內存
-Xmn3m //新生代大小,大小是:eden+ 2 survivor space
 -XX:+PrintGCDetails //打印GC信息

  運行如下代碼:

package com.tree.blog.jvm;

public class JVMTest {
    public static void main(String[] args) {
        byte[] b = null;
        byte[] c = null;
        for (int i = 0; i < 100; i++) {
            //3m 大於 -Xmn2m 直接分配到老生代中
            b = new byte[3 * 1024*1024 ];
            c =b;
        }
    }
}

  控制台輸出:

 

  從GC日志中可以看出,GC和FullGC信息,這里沒有設置newration,則是按照堆大小減去新生代大小,得到老年代大小的,如何配置了新生代和老年代的比例的話則按照堆的比例來分配內存

    xmx20m 的分配情況

    xmn3m 新生代大小

    老年代大小為20-3m

 3、查詢OOM dump文件

  配置dump文件輸出目錄,使用jdkbin目錄下的javaVisualVm查詢 OOM信息,打開信息如下

 

 

 

4、發送內存泄露是如何處理,這里可以配置觸發腳本

  -XX:OnOutOfMemoryError
    在OOM時,執行一個腳本。
  可以在OOM時,發送郵件,甚至是重啟程序。
  例如我們設置如下的參數:

-XX:OnOutOfMemoryError=D:/tools/jdk1.7_40/bin/printstack.bat %p //p代表的是當前進程的pid

  

 5、按照堆內存按照比例分配  新/老年代內存

  -XX:NewRatio=4   1:4   1/5

   -XX:SurvivorRatio=8(幸存代) 2:8   

  二八:小占20%,大占80%

參考:

  https://www.cnblogs.com/SaraMoring/p/5713989.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM