1.概述
在日常维护工作中,发现bssframe_194_0的状态为空白,下面对其存在的问题进行分析。
2.问题分析
2.1.检查服务响应
使用weblogic自带检测工具查看,发现该服务已无法响应,如下:
2.2.检查线程快照
通过kill -3 获取线程快照,并未发现死锁线程,只是线程处于获取内存阶段。
2.3.检查堆内存
通过jmap获取当前堆内存使用情况,如下所示:
Heap Usage:
PS Young Generation
Eden Space:
capacity = 79560704 (75.875MB)
used = 74917464 (71.44686126708984MB)
free = 4643240 (4.428138732910156MB)
94.16390282318267% used
From Space:
capacity = 79495168 (75.8125MB)
used = 0 (0.0MB)
free = 79495168 (75.8125MB)
0.0% used
To Space:
capacity = 79495168 (75.8125MB)
used = 0 (0.0MB)
free = 79495168 (75.8125MB)
0.0% used
PS Old Generation
capacity = 1908932608 (1820.5MB)
used = 1908930808 (1820.4982833862305MB)
free = 1800 (0.00171661376953125MB)
99.99990570646693% used
PS Perm Generation
capacity = 82182144 (78.375MB)
used = 82000104 (78.2013931274414MB)
free = 182040 (0.17360687255859375MB)
99.77849202863338% used
经查看当前服务堆内存已经占用到99.9%,如上图黄色显示。可以看出服务发生了内存溢出错误,导致JVM内部频繁进行GC导致JVM hang无法响应请求。
从服务日志中也出现了大量的内存溢出错误日志,如下所示:
####<2013-2-21 上午10时27分54秒 CST> <Info> <WebLogicServer> <crmweb2> <bssframe_194_01> <[STUCK] ExecuteThread: '44' for queue: 'weblogic.kernel.Default (self-tuning)'> <<WLS Kernel>> <> <> <1361413674052> <BEA-000339> <[STUCK] ExecuteThread: '44' for queue: 'weblogic.kernel.Default (self-tuning)' has become "unstuck".>
####<2013-2-21 上午10时27分12秒 CST> <Error> <HTTP> <crmweb2> <bssframe_194_01> <[ACTIVE] ExecuteThread: '41' for queue: 'weblogic.kernel.Default (self-tuning)'> <<WLS Kernel>> <> <> <1361413632963> <BEA-101017> <[weblogic.servlet.internal.WebAppServletContext@1c4f6f6 - appName: 'bssframe', name: 'bssframe', context-path: '', spec-version: 'null'] Root cause of ServletException.
java.lang.OutOfMemoryError: GC overhead limit exceeded
>
####<2013-2-21 上午10时27分00秒 CST> <Error> <Server> <crmweb2> <bssframe_194_01> <DynamicListenThread[Default]> <<WLS Kernel>> <> <> <1361413620854> <BEA-002608> <The ListenThread because of an error: java.lang.OutOfMemoryError: GC overhead limit exceeded
java.lang.OutOfMemoryError: GC overhead limit exceeded
>
####<2013-2-21 上午10时25分55秒 CST> <Error> <HTTP> <crmweb2> <bssframe_194_01> <[STUCK] ExecuteThread: '10' for queue: 'weblogic.kernel.Default (self-tuning)'> <<WLS Kernel>> <> <> <1361413555219> <BEA-101017> <[weblogic.servlet.internal.WebAppServletContext@1c4f6f6 - appName: 'bssframe', name: 'bssframe', context-path: '', spec-version: 'null'] Root cause of ServletException.
java.lang.OutOfMemoryError: GC overhead limit exceeded
>
3.结论及建议
3.1分析结果
从上述分析确定为内存溢出错误导致堆内存占用较多,导致频繁进行垃圾回收从而导致服务hang无法响应,但是由于该服务处于集群中,因此并未对业务造成影响。
而分析产生的堆内存快照并未发现产生内存泄漏情况,推断为当时业务较为繁忙而该服务响应了几个会产生较大数据的请求,导致该服务比其他服务的堆内存占用高而出现内存溢出。
3.2.相关建议
在2.3中堆内存的PERM区占用99%,该问题已提出很多次,希望可以对该参数进行调整。
查看配置信息可以看出,初始的PERMSIZE是16M,当启动Weblogic时如果有PERMSIZE不足,会逐渐增大,但是当启动完成时如果出现PERMSIZE不足时,会引起FULL GC,而FULL GC会出现应用的短暂的业务停滞情况。这种情况应该尽量避免。
因此建议将PERMSIZE增加到128M,在启动参数修改即可。
具体修改的方法为(以custmanm_201_01为例):
点击custmanm_201_01进入statserv_206_01配置页面:
点击进入Server Start进入启动参数设置界面,主要修改的参数为:
将上图中的-XX:MaxPermSize=256m参数修改为-XX:PermSize=256m,或者在-XX:MaxPermSize=256m前面添加-XX:PermSize=256m。
该贴被funny编辑于2014-2-20 11:07:06该贴被funny编辑于2014-2-20 11:08:04