jvm調優參數以及常見OOM


OOM:

--JVM 有哪些常用參數
    -Xms10m  初始堆內存(1/64)
    -Xmx10m  最大堆內存(1/4)
    -XX:MaxDirectMemorySize=5m  最大直接內存

    -XX:MetaspaceSize=10m  初始元空間大小
    -XX:MaxMetaspaceSize=10m 最大元空間

    -Xmn10m 設置年輕代的大小,一般不用動!
    -XX:SurvivorRatio 設置年輕代各區的比例
    uintx SurvivorRatio = 8 Eden:s0:s1 = 8:1:1  

    -XX:NewRatio  設置年輕代與老年代的比例
    -XX:NewRatio = 2 新生代1,老年代是2,默認新生代整個堆的 1/3
    -XX:NewRatio = 4 新生代1,老年代是4,默認新生代整個堆的 1/5;

    -XX:MaxTenuringThreshold=15 設置年輕代進入老年代的需要的存活次數(默認是15次)
    jinfo -flag MaxTenuringThreshold pid  #查看對象進入老年代的最大存活次數

    -XX:+PrintGCDetails 輸出詳細的垃圾回收信息


    java -XX:+PrintCommandLineFlags -version  # 默認的垃圾回收器

    -XX:+PrintFlagsInitial  #查看 java 環境初始默認值


---GC
    -XX:+UseParallelGC #jdk1.8默認gc收集器  PSYoungGen(復制算法) + ParOldGen(標記整理壓縮)
    -XX:+UseG1GC       #使用G1收集器
    -XX:+UseParNewGc   #並行GC【不推薦使用 】 ParNew + Tenured
    -XX:+UseSerialGC   #串行GC[DefNew+Tenured]

// 出現問題:java.lang.OutOfMemoryError: Java heap space
// -Xmx10m -Xms10m -XX:+HeapDumpOnOutOfMemoryError

// GC 回收時間過長也會導致 OOM 
// 可能CPU占用率一直是100%,GC 但是沒有什么效果!
// -Xms10m -Xmx10m -XX:MaxDirectMemorySize=5m -XX:+PrintGCDetails
java.lang.OutOfMemoryError: GC overhead limit exceeded


// -Xms10m -Xmx10m -XX:MaxDirectMemorySize=5m -XX:+PrintGCDetails
// 故意破壞! 
// ByteBuffer.allocate(); 分配JVM的堆內存,屬於GC管轄 
// ByteBuffer.allocateDirect() ; 分配本地OS內存,不屬於GC管轄
java.lang.OutOfMemoryError: Direct buffer memory 基礎緩沖區的錯誤!


// 高並發 , unable to create native Thread這個錯誤更多的時候和平台有關!
// 1、應用創建的線程太多!
// 2、服務器不允許你創建這么多線程
java.lang.OutOfMemoryError: unable to create native Thread


// -XX:MetaspaceSize=10m -XX:MaxMetaspaceSize=10m
// 不斷的加載對象! Spring的 cglib Enhancer不停創建對象
java.lang.OutOfMemoryError: Metaspace 元空間報錯

-- 棧溢出(遞歸調用方法自身)
-Xss10m
// Exception in thread "main" java.lang.StackOverflowError

 


免責聲明!

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



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