`
ayufox
  • 浏览: 273377 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

JVM Java HeapSpace到达临界值的高CPU问题

    博客分类:
  • JVM
阅读更多

     本周有同事反馈,IDC环境出现了CPU非常高的问题,如下图:

     
     看一下HeapSpace的情况,如下图,很明显,HeapSpace已经到达了一个临界值:

    
     看一下GC数据统计,短短1个小时,竟然FullGC了946次:

    
     猜想:在HeapSpace逼近临界值的时候,分配小块内存(譬如创建一个对象,如果是分配大块内存,实际上JVM直接就报OutOfMemory了),JVM发现内存不足,会尝试去FullGC出空闲内存,每次还真能挤出一点点,但很快又得重新FullGC,我们知道,实际上FullGC是非常消耗CPU的操作。但为啥不报OutOfMemory呢?因为每次总能够释放出一点点内存,因此竟然就这么维持下去了。这里非常郁闷,JVM直接报OutOfMemory还好过一点,至少直接知道原因。
     JVM一般启动参数有一个GCTimeRatio参数,表示目标吞吐量,JVM会自动调整各内存区大小去达到该吞吐量值,如果吞吐量低于某个值,是会自动OutOfMemory,目前该值默认是1,表示GC时间占总时间不超过1%,但目前来看,要通过这种方式去让JVM直接报告OutOfMemory而不是持续维持高CPU看起来是不行的。
     已经可以定位到是内存达到临界值的问题,接下来问题就简单了,dump出HeapSpace空间,使用Eclipse Memory Analyzer分析一下,原因一目了然,有点讶异,竟然是BlackStar的detail工作模式导致的,这里是因为使用的时候策略没有调整好,调整detail策略,重新启动JVM,问题解决,当然这里BlackStar的detail工作模式的自我保护方式也不好,实际上当发现使用内存过多的时候,应该调整自动放弃。

     

     

1
0
分享到:
评论
2 楼 teager 2010-09-30  
查到了
jmap -heap
1 楼 teager 2010-09-30  
不错!学习了.
请教一下,怎么得到HeapSpace这张图里的信息? 谢谢

相关推荐

Global site tag (gtag.js) - Google Analytics