GC线程占满CPU问题定位

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

线上有个java进行cpu达到400%(4核服务器),通过日志查看,用户线程出现各种异常,接口响应速度非常慢。

#怀疑是线程死循环 在top命令下,按shift+H查看cpu占用最高线程 详见 记一次java性能问题

结果发现是GC线程一直占用了cpu

#引起GC占用cpu的原因 补习了下java GC原理,总结下大致是堆内存占满,新创建对象时无法分配足够的内存,引起频繁GC (我的应用中有多个线程会定时查询一组json数据回来,通过fastjson转换成对象,故存在频繁创建对象的场景)。

尝试提高了最大内存,但是在运行一段时间后,仍出现GC问题;那么问题出在fastjson创建的对象中,有部分一直未被回收,占用着堆内存,而且每次查询转换后都会持续增长。

找到占着内存的对象

  1. 使用jmap -histo 输出堆内存情况
  2. 发现有个不应该在GC后还留在堆内存对象 xxx
  3. 导出dump文件,通过eclipse memory analysis 分析该对象的GC root路径

重新检查代码逻辑

根据GC root 路径的分析结果,再仔细核对代码逻辑,发现有处地方确实存在问题,对象都被存到一个queue中,修复即可。

#未解决疑惑点 为何不是直接内存溢出,而是CPU打满呢,可能会是以下情况,尚未验证

  1. queue中的对象不是强引用?在堆内存满的情况下,会回收部分以腾出空间?

转载于:https://my.oschina.net/jianfengz/blog/879280

你可能感兴趣的:(GC线程占满CPU问题定位)