相信大家都遇到过内存溢出的情况,内存溢出一般会使系统崩溃,甚至还会使服务卡死。所以规避内存溢出和及时解决内存溢出尤为重要。
问题出现
之前所在的项目连续几天出现系统无法登录。查看服务器监控,发现系统CPU在某个点飙升。
将系统重启后,CPU开始降下来,过了一段时间后又开始上升。发现在频繁的进行GC
系统打出内存溢出日志:
这里目测是JSON转对象出现了内存溢出。因此我们在系统启动的时候添加内存溢出命令:
添加之后系统如果又出现内存溢出,就会在/tmp
目录下面生成文件java_pidXXX.hprof
。XXX为系统的进程id。我们用MAT或者Java自带的内存分析软件VisualVM
加载hprof
文件。
问题分析
我们发现还有个类创建的对象非常多,实列数六千万多个。结合内存溢出的日志,很有可能是JSON转对象出了问题。
这里使用的是2.0.8的fastjson
。开始以为是转换的对象是树形结构导致。
这里XXXConclusionTreeOptionsDto
中嵌套了XXXConclusionTreeOptionsDto
,前端给这个值传了null,可能递归创建对象了。后面发现只要是对象里面嵌对象(不一定是同一个对象)。前端给这个对象传null都会出现内存溢出。
本地测试必现。
因此很可能是fastjson
的bug。在github
上面,发现内存溢出的issue有很多。
问题解决
源码太过复杂,没有分析出原因。因此决定使用Jackson
。
没有出现内存溢出的情况。或者我们升级fastjson
版本
同样没有出现内存溢出。
问题思考
我们发现,当短时间内创建了大量对象,垃圾回收器无法及时回收,这是对象会进入老年代,当老年代空间满了,会触发fullGC
,fullGC
触发后,其他线程会被挂起,导致CPU资源全给垃圾回收器了,频繁的fullGC
就会造成CPU 100%了。
原文始发于微信公众号(Lvshen的技术小屋):什么?线上服务器CPU100%了
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/261681.html