1、选择编译器的类型
(1)-server 编译慢,速度快
(2)-client 编译快,速度慢点
(3)-XX:+TieredCompilation 分层编译
2、代码缓存相关
-XX:ReservedCodeCacheSize=100M
代码缓存满了可能会报错CodeCached is full
1.7缺省 32M--48M(可以适当调大)
1.8 240M
3、编译阈值
方法调用计数器,循环回边计数器(循环完成的次数)
计数器是有衰减的
-UseCounterDecay是否启用衰减计数
-XX:CounterHalfLifeTime参数,控制半衰期的周期
a(){for(){....}}
4、编译线程
5、方法内联
-XX:默认是开启的
内不内联跟方法热度有关系
image.png
字节码小于325字节码才会内联, -XX:MaxFreInlinesSize =325( 缺省,可以设置)
方法小于35个字节码直接内联 -XX:MaxInlineSize
6、逃逸分析
尽量使用默认的参数
二、GC调优
1、gc调优的目的
GC的时间够小
GC的次数够少
2、调优的原则
(1)大多数的java应用不需要GC调优
(2)大部分需要GC调优的,不是参数问题,是代码问题
(3)GC调优是最后的手段,尽量别动就好了
第一位:选择合适的GC回收器
第二位:选择合适的堆得大小
第三位:选择 年轻代在堆中的比重
调优步骤
1、监控GC的状态
2、分析结果,判断是否要优化
minor GC 时间<50ms 10S一次
FullGC执行时间1s左右,频率在10分钟以上,GC不需要调优
不断测试,和生产对比,最后在确认上线
3、阅读GC日志
-XX:+HeapDumpOnOutOfMemoryError -XX:HeadDumpPath 这两个在生产上必须加上
-XX:+PrintGCDetails -Xlogger:logpath 这两个在可以在刚上生产的时候加上,前期监控,后面稳定了就可以关闭
-XX:PrintHeapAtGC 查看回收后的内存信息
-XX:TraceClassLoading 类加载顺序
吞吐量应用,年轻代大一点,老年代可以小一点
网友评论