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