如何在不同jvm底下生成heapdump

  • 格式:doc
  • 大小:36.50 KB
  • 文档页数:2

如何在不同jvm底下生成heapdump
问题分析:
发现在AppSvr01下面有heapdump.***.phd和javacore.***.txt文件产生,有时会很快将空间充满
产生的原因:
生产这两个文件,说明有OutOfMemory发生,可以查看SystemErr.log
确定发送的愿意,是参数设置有问题,还是程序有内存泄露。

首先查看SystemErr.log”确定内存溢出的原因,是PermSize太小,还是Nativethread无法创建,前者用MaxPermSize调整(IBM JDK没有这个参数),后者调小最大堆大小或者Xss调整每个线程非配内存的大小。

如果是常见的堆溢出,确保OutOfMemory时能生成heapdump文件,用Dumpanalyzer或者MDD4J分析dump文件,找到堆中占用空间总数最大的(或数量最多的)对象。

然后调整堆范围到一个比较小的区间,比如256M至384M,重新启动服务器,在运行1小时后手动做一次heapdump,运行4小时后做一次heapdump,运行8小时后做一次(间隔仅做参考)。

然后分析一下三者的区别,看看那个对象数据增长很多,占用空间增加很大。

结果OutOfMemory时候的分析,应该能锁定问题的源头。

1、IBM JDK for weblogic
用ibm的jvm应该在startWebLogic.sh上加入以下的代码
IBM_HEAPDUMP=true
export IBM_HEAPDUMP
IBM_HEAPDUMP_OUTOFMEMORY=true
export HEAPDUMP_OUTOFMEMORY
如何生成WAS的heapdump文件
WAS6.1中,在使用IBM JDK的平台上,可以直接使用以下的方法,随时生成所需的heapdump文件。

如果在性能诊断顾问程序配置里面选中了"启用自动堆转储收集,则可以自动在WebSphere profile所在的路径下(例如/opt/IBM/WebSphere/WAS6.1/profiles/AppSrv01)生成heapdump文件,备用户进行分析。

在使用IBM SDK的平台上,例如AIX, Linux和Windows,在启用了性能诊断顾问工具后,如果探测到有内存泄漏发生,WebSphere会自动生成两个heapdump文件,供后续分析使用。

我们在任何时候,可以随时手动生成所需的heap dump文件。

在WAS6.1 profile的bin目录下,首先运行wsadmin 脚本客户端,然后可以调用generateHeapDump操作来完成。

关键步骤:
1.找到JVM对象名字。

<wsadmin> set objectName
WebSphere:type=JVM,process=<WebSphere服务器
名字>,node=<节点名字>,*]
2.对JVM MBean调用generateHeapDump操作。

<wsadmin> $AdminControl invoke $objectName
generateHeapDump
例如:
[root@csspvm bin]# pwd
/opt/IBM/WebSphere/WAS6.1/profiles/AppSrv01/bin
[root@csspvm bin]# ./wsadmin.sh -username root -password demo4you
WASX7209I: Connected to process "server1" on node csspvmNode02 using SOAP
connector; The type of process is: UnManagedProcess
WASX8011W: AdminTask object is not available.
WASX7029I: For help, enter: "$Help help"
wsadmin>set objectName [$AdminControl queryNames
WebSphere:type=JVM,process=server1, node=csspvmNode02,*]
WebSphere:name=JVM,process=server1,platform=proxy,node=csspvmNode02,
j2eeType=JVM,J2EEServer=server1,
version=6.1.0.0,type=JVM,mbeanIdentifier=JVM,cell=csspvmNode02Cell,spec=1.0
wsadmin>$AdminControl invoke $ objectName generateHeapDump
/opt/IBM/WebSphere/WAS6.1/profiles/AppSrv01/./heapdump.20060904.075650.3576.phd
wsadmin>quit
理想情况下,在探测到问题时,尽快生成一个初始的heap dump,然后密切监控内存使用情况,等到泄漏了足够的内存的时候,再生成另外一个heap dump,这样可以对比分析以更准确地找到泄漏的原因。

注:生成HeapDump文件的过程是比较耗资源的,所以请只在必须的时候做这样的操作。

2、问题是不是JVM –xms –xmx 设置
另外很多人习惯把JVM的最大内存大小和最小内存大小设置成一样,其实这样只会增加内存碎片的产生
还有一个就是内存的设置并不是越大越好,我们都知道内存越大那么GC的时间就越长,而GC这个过程是一个STW的过程也就是Stop The World不对外做任何响应的过程。

一般来讲GC的过程最好控制在0.2-0.5s之间比较合适,不过对Sun的Jdk 要另当别论因为他采用的是复制和分代的策略,所以它不会存在这种问题。

3、查看was我们要用的东西
∙systemErr
∙systemOut
∙native_stderr
∙native_stdout
∙heapdump*.txt or heapdump*.phd
∙javacore*.txt。