记一次jvm内存优化

内存优化是老话题了。此次优化历时2周,克服几个没遇到过的问题,也算最后得到了解决。现复原一下过程:
1、运维发现服务断了,经查看java进程被kill
2、查询linux日志(whereis message),默认为message文件,发现java进程被kill,日志内容为:out of memory: Kill process 9136 (mysqld) score 409 or sacrifice child (此条日志为mysql被kill ,生产实际为java)
3、网上方案很多,其中一条为降低进程score,linux会根据score顺序kill。当内存不够时,强制kill得分高的进程。这个方案被否,治标不治本。
4、调整JVM参数,主要 为堆大小。无效。原因:后经分析,用jstact、jmap等监控gc情况,并未发生频繁gc。可知内存增加与堆无关。
5、经过分析,应用内存在启动时占用较少,随着启动时长(请求增多)推移而逐渐增加。判断内存主要为堆外内存。此处请稳步了解JVM内存相关知识。
6、调整CompressdClassSpaceSize。有效。但仍然没有完全解决,内存仍然缓慢增长。此参数的作用请稳步另一篇文章:metaspace概述(与compressedClassPointer的关系)
7、经过分析堆外内存结构,得出结论:内存增长与线程相关,随着线程增多而增加。
8、jstack -l PID | grep ‘java.lang.Thread.State’ | wc -l,查看线程数量。得到验证。最初启动时约50线程,逐渐增大至100左右。
9、jstack -l PID,打印线程信息。分别打印不同时间的线程信息,经过对比,发现增加的线程名称统一为:taskExcutor-22格式。
10、根据经验得出为线程池默认线程名称,于是找到相关代码,发现项目中异步线程池参数配置为:coreSize:50,maxSize:100。分别修改为5、10。

以上,彻底解决。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值