JVM 调优总结

本文通过时间对JVM调优进行了总结,写成心得,如果有误,欢迎指出。

一、JVM参数详解

如何监控线上的机器

-Xmn128M 设置新生代大小
-XX:NewRatio 

1. MetaspaceSize

-XX:MetaspaceSize 这个值并不会限制MetaspaceSize的大小

-XX:MetaspaceSize、-XX:MaxMetaspaceSize 默认可以通过

如下命令获得

java -XX:+PrintFlagsFinal -version |grep MetaspaceSize

这个值会限制MetaspaceSize的大小,如果超过这个值会OOM

测试代码:

        /**
         * JVM参数:-XX:MetaspaceSize=8m 
         * -XX:MaxMetaspaceSize=128m -XX:+PrintFlagsInitial
         */
        public static void main(String[] args) {
            int i = 0;
            try {
                for (;;) {
                    i++;

                    Enhancer enhancer = new Enhancer();
                    enhancer.setSuperclass(OOMObject.class);
                    enhancer.setUseCache(false);
                    enhancer.setCallback(new MethodInterceptor() {
                        @Override
                        public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
                            return proxy.invokeSuper(obj, args);
                        }
                    });
                    enhancer.create();
                }
            } catch (Exception e) {
                System.out.println("第" + i + "次时发生异常");
                e.printStackTrace();
            }
        }

        static class OOMObject {
        }

2. UseCMSCompactAtFullCollection

-XX:+UseCMSCompactAtFullCollection

-XX:CMSFullGCsBeforeCompaction=10

一下两个参数必须同时使用才能生效。

3. -XX:CMSFullGCsBeforeCompaction=n

CMSFullGCsBeforeCompaction 说的是,在上一次CMS并发GC执行过后,到底还要再执行多少次full GC才会做压缩。默认是0,也就是在默认配置下每次CMS GC顶不住了而要转入full GC的时候都会做压缩。 如果把CMSFullGCsBeforeCompaction配置为10,就会让上面说的第一个条件变成每隔10次真正的full GC才做一次压缩(而不是每10次CMS并发GC就做一次压缩,目前VM里没有这样的参数)。这会使full GC更少做压缩,也就更容易使CMS的old gen受碎片化问题的困扰。 本来这个参数就是用来配置降低full GC压缩的频率,以期减少某些full GC的暂停时间。CMS回退到full GC时用的算法是mark-sweep-compact,但compaction是可选的,不做的话碎片化会严重些但这次full GC的暂停时间会短些;这是个取舍。

CMSFullGCsBeforeCompaction 在JDK 8中标记为

4. UseCMSInitiatingOccupancyOnly

建议线上设置,减少问题排查难度

+UseCMSInitiatingOccupancyOnly :禁止hostspot自行触发CMS GC

5. -XX:+CMSScavengeBeforeRemark

CMS,分为两个STW, init mark 和remrk两个阶段,remark占据了大部分时间(一般80%左右),在CMS GC之前先进行一次YGC,减少remark的时间,

JVM 调优总结_第1张图片
image.png

二、常见问题

1 .并发模式失败(concurrent mode failure)

发生在CMS运行期间,详情参考:

JVM 调优 —— GC 长时间停顿问题及解决方法

GC的悲观策略

2. 提升失败(promotion failed)

发生在Minor期间

你可能感兴趣的:(JVM 调优总结)