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