排查Java服务CPU使用率高达100%的原因

排查Java服务CPU使用率高达100%的原因

Java服务在服务器运行一段时间,有一天CPU使用率突然高达100%,通过jstack工具分别在CPU使用率为100%时执行了一次堆线程dump和cpu使用率降下来后执行了一次堆线程dump

一、环境信息

NO名称信息
1操作系统Linux_64bit
2CPU-
3内存32G
4Java应用服务-Xmx3072m -Xmx3072m

二、采集到的jstack堆内存信息

1、第一次Dump的堆内存信息

Heap
 PSYoungGen      total 801920K, used 278058K [0x00000007c0000000, 0x0000000800000000, 0x0000000800000000)
  eden space 715008K, 26% used [0x00000007c0000000,0x00000007cbaaa868,0x00000007eba40000)
  from space 86912K, 100% used [0x00000007fab20000,0x0000000800000000,0x0000000800000000)
  to   space 166784K, 0% used [0x00000007eba40000,0x00000007eba40000,0x00000007f5d20000)
 ParOldGen       total 2097152K, used 1904581K [0x0000000740000000, 0x00000007c0000000, 0x00000007c0000000)
  object space 2097152K, 90% used [0x0000000740000000,0x00000007b43f1550,0x00000007c0000000)
 PSPermGen       total 85120K, used 84495K [0x0000000730000000, 0x0000000735320000, 0x0000000740000000)
  object space 85120K, 99% used [0x0000000730000000,0x0000000735283f18,0x0000000735320000)

2、第二次Dump的堆内存信息

Heap
 PSYoungGen      total 876864K, used 468625K [0x00000007c0000000, 0x0000000800000000, 0x0000000800000000)
  eden space 707456K, 53% used [0x00000007c0000000,0x00000007d725c7d8,0x00000007eb2e0000)
  from space 169408K, 52% used [0x00000007f5a90000,0x00000007fb1d8000,0x0000000800000000)
  to   space 170560K, 0% used [0x00000007eb2e0000,0x00000007eb2e0000,0x00000007f5970000)
 ParOldGen       total 2097152K, used 1067610K [0x0000000740000000, 0x00000007c0000000, 0x00000007c0000000)
  object space 2097152K, 50% used [0x0000000740000000,0x0000000781296a80,0x00000007c0000000)
 PSPermGen       total 85056K, used 84406K [0x0000000730000000, 0x0000000735310000, 0x0000000740000000)
  object space 85056K, 99% used [0x0000000730000000,0x000000073526d998,0x0000000735310000)

三、故障分析

1、故障原因分析

  • 通过两次Dump堆内存的比对,第一次Dump操作JVM堆内存中的老年代内存使用率高达90%(ParOldGen total 2097152K, used 1904581K [xxx] object space 2097152K, 90% used),第二次dump后显示JVM堆内存中的老年代内存使用率降到了50%(ParOldGen total 2097152K, used 1067610K [xxx] object space 2097152K, 50% used)。

  • 导致此次故障的原因是老年代内存不断上涨,直到90%后触发了完全GC,使CPU使用率高达100%;当第二次Dump出堆线程信息显示,老年代的内存被完全GC回收了部分内存,使用率由回收前的90%降到了50%;

2、原理分析

下图为JVM内存结构模型(注意图中每个内存区域占用的比例y/x,y表示当前区域的分子,x表示堆内存分母)
在这里插入图片描述
根据内存模型,EIMServer的堆内存分配情况如下:

NO内存区内存大小
1堆内存3072MB
2Yong区(新生代)1024MB
3Eden区819.2MB
4Survivor区204.8MB
5Old区(老年代)2048MB

JVM堆内存中创建一个对象是会先在Eden区申请并分配内存,如果新生代内存不足时会触发一次普通GC(内存回收),普通GC只释放Yong区的内存,通过扫描Eden区的对象,如果对象还有被引用,就将对象移入S0或S1区,如果Eden中的对象较大就会直接被移入老年代,然后将Eden区中所有不在被引用的对象全部释放;老年代内存区使用率达到90%时就会触发完全GC,完全GC时才会释放老年代内存区的内存,由于扫描的对象都是大对象,且引用数较大,所以会消耗大量的CPU资源,还会造成JVM短暂的无响应;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老杜095

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值