首先要知道所谓的调优就是调比例,调内存(升级内存)
1.什么情况下才需要调优?
经常的fullGC才会需要,因为STW,会让程序变得很慢,OOM
可能会出现经常fullGC的情况:
订单突增,cpu的负载变高,请求变多,一个线程执行的时间边长,年轻代在gc完之后,还有一些对象没有被回收掉,就要放到伊甸园区,但是伊甸园区又放不下这么多的对象,就会利用空间担保机制,把这些对象直接放到老年代了,可以这些对象按理说就应该在年轻代要回收掉的,结果都到了老年代了,这样恶性循环,就会频繁FullGC,甚至OOM
调优思路:
老年代比例调小一点,新生代比例调大一点,伊甸园区的比例也调大一点,通过业务场景知道,我们并不需要太多的对象一直需要存活,因为我new出来的东西,执行完线程就结束了
默认的老年还和年轻代比例是2:1,改成1:2(让对象尽量在年轻代就被干掉)
年轻代和伊甸园区的比例是8:1:1,调整到3:1:1(防止由于yuangGC后,剩下的对象在伊甸园区放不下,导致直接放到老年代了)
2.怎么监控的FullGC的
需要配置一下打印GC的参数-XX:+printGCDetails,日志里就会出现gc的详情
3.调优工具
比如说线程死锁,或者到底哪里OOM了,查看一下堆栈信息
阿里的阿尔萨斯
dashboard---查看服务的详情,有哪些线程在跑着,看一下线程状态,如果长时间一直在阻塞着,可能发生死锁了,也可以看到 jvm使用的情况,年轻代和老年代执行GC的次数和时间
thread-----查看线程的运行情况,可以查看线程的运行状态,哪些发生了死锁
heapdunmp-----查看堆的文件,下载下来dump文件排查问题
vmoption------虚拟机参数,可以设置一些jvm参数,比如打开gc日志
profiler-----看哪下线程可能有问题,生成火焰图
4.linxu命令查看JVM
不通过阿尔萨斯,也可以通过 jmap-dump的形式去 dump文件,会生成一个快照文件
du-/文件名/ -----------查看内存使用情况
jstat-gc ---------查看java堆的情况
s0--总内存大小空间
ec--伊甸园区总空间
oc---老年代总空间
mc---方法区总空间
ygc--执行次数
fgc--执行次数
5.总结调优的思路
首先频繁进行fullGC(可以查看日志观察jvm的内存状态发现),程序变得很慢
OOM(配置参数-xx:+heapdumpOutOfMemory),发生OOM自动dump文件,根据文件分析一下哪里发生OOM了
除了上述的两种方式还可以根据阿尔萨斯或者服务器的控制台去查看jvm的具体情况,这时候再判断内存是否需要调优了
怎样调优呢?
-xss:设置线程栈的内存
-xms:设置堆的初始内存
-xmx:设置堆的最大内存
-xmn:设置新生代的大小
-xx:new设置新生代的老年代的比例(默认1:2)
-xx:serviver新生代伊甸园区的比例(默认8:1:1)