前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >什么?线上服务器CPU100%了

什么?线上服务器CPU100%了

作者头像
Lvshen
发布2023-03-08 11:36:35
1.4K0
发布2023-03-08 11:36:35
举报

相信大家都遇到过内存溢出的情况,内存溢出一般会使系统崩溃,甚至还会使服务卡死。所以规避内存溢出和及时解决内存溢出尤为重要。

问题出现

之前所在的项目连续几天出现系统无法登录。查看服务器监控,发现系统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版本

同样没有出现内存溢出。

问题思考

我们发现,当短时间内创建了大量对象,垃圾回收器无法及时回收,这是对象会进入老年代,当老年代空间满了,会触发fullGCfullGC触发后,其他线程会被挂起,导致CPU资源全给垃圾回收器了,频繁的fullGC就会造成CPU 100%了。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-12-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Lvshen的技术小屋 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 问题出现
  • 问题分析
  • 问题解决
  • 问题思考
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档