jvm 调优

阿里巴巴开源Arthas
dashboard
查看cpu 内存信息
有block waiting
thread + 编号查询具体哪里消耗cpu
thread -b 查看死锁
反编译代码 查看发布的代码是不是最新的
修改内存里的变量值

调优 终极目标
减少stw
调优实战
线上问题
几分钟一次full gc
问题在于内存分配 假设为8g 堆3g 栈2g
刚好产生的垃圾回收不了 伊甸园区又放不下 直接放进老年代
30个g的伊甸园区 stw的时间同样接受不了 使用g1回收器 分格回收 大量减少stw的时间

OOM问题
分析流程:
第一步:进程分析,分析老年代回收次数和消耗时间
第二步:日志分析,找出OOM发生时间的日志来锁定执行方法,对应的机器ip
第三步:找到对应的ip机器查看,进一步分析
第四步:下载的dump,使用mat分析堆内存,找到堆占用率前3,查看堆指向

问题产生:
例如查看新生代最高600M,如果大数据量调用,jvm会把产生的大对象分配在新生代,新生代full gc后放到老年代,老年代gc后触发OOM,就会像类似死循环一样,一直full gc了

解决方案:
1、临时方法:

    ① 先进行扩容

    ② 先将任务先降下来

2、后续解决问题方案:
 ① 计算密集型服务与 IO/ 存储密集型服务分割开来,这样做的一个主要原因是提高资源利用率,方便分配资源的时候做到定向调拨,通过全链路压测环节精准定位各项性能指标
 ② 新生代放设置,设置老年代是新生代的 2 倍大;换句话说,新生代是堆大小的 1/3。
 ③ 大数据量存储进行报警,比如,我们去分配一个超大对象,类似一个超大数组超过堆的最大值,JVM 可以判断出垃圾收集并不能解决这个问题,所以直接抛出 OutOfMemoryError。
健康检查发现 鉴权服务stw 重启了服务
6g堆分配空间 实际占用100m 频繁minorgc 两次fullgc
原因分析 原空间扩容产生的full gc造成stw 目前没有结果

posted @ 2024-03-28 10:24  磊子9527  阅读(20)  评论(0)    收藏  举报