IBM AIX平台的内存储器溢出案例分析

IBM AIX平台的内存溢出案例分析

问题描述

同样,某客户Oracle Agile PLM的集群服务器中的一个节点突然crash掉,在javacore(Thread Dump)中记录了java/lang/OutOfMemoryError错误,没有Heap Dump,只有GC日志。

问题分析

系统环境如下:

  • OS: AIX 5.3 64bit
  • Middleware: Weblogic 10.3.0.0
  • JDK: IBM JDK pap6460sr5-20090529_04 (SR5)
  • App: Agile PLM 9.3.0, 9.3.0.1

javacore的头部信息显示为 systhrow,运行时错误捕获为OutOfMemory,注意,不是异常。

1TISIGINFO     Dump Event "systhrow" (00040000) Detail "java/lang/OutOfMemoryError" received 

线程日志记录了GC的产生,至于Heap Dump日志因为文件太庞大,客户没有提供。在分析GC之前,先查看内存堆的分配。

0SECTION       MEMINFO subcomponent dump routine
NULL           =================================
1STHEAPFREE    Bytes of Heap Space Free: 1276948 
1STHEAPALLOC   Bytes of Heap Space Allocated: 80000000 

分配给JVM的内存堆有80000000即2G,而可用的空闲heap只有1276948即19M,理所当然的内存溢出。

GC分析

借助GC分析工具,可以查看free heap的分配情况。在内存回收之前 IBM AIX平台的内存储器溢出案例分析

回收之后 IBM AIX平台的内存储器溢出案例分析

再看回收之后所持有的内存 IBM AIX平台的内存储器溢出案例分析

虽然heap有所缓解,但是free heap整体在减少,而且减少的相当快。大量被占用的内存无法回收。

结论

客户没有提供Heap Dump日志,但是基本上已经找出内存为何泄漏的原因。客户的集群服务中有一台node,同时部署了其他的application,而内存泄漏正是由这个application产生,这也就是为什么分配的JVM为2G,但该application最高占用才900M的原因。

建议客户产生Heap Dump,自行分析究竟是哪条java线程耗用内存。具体方法如下:

1. 设置Heap Dump变量

export IBM_HEAPDUMP=true
export IBM_HEAP_DUMP=true
export IBM_HEAPDUMP_OUTOFMEMORY=true
export IBM_HEAPDUMPDIR=[directory path here]

2. 发送User事件

kill -3 [PID]

在相应的路径下会有*.phd文件记录各java线程的内存分配。

附件

  • Thread Dump文件: javacore.20100606.020003.409744.0011.zip
  • GC文件: urlpx_02.gc
  • Heap Dump文件: 无