问题:我的内存不稳定,但WebSphere正在恢复。我正在尝试确定如何找出大部分内存使用情况。我有应用动态,但它不适用于Websphere。WebSphere 7 - 如何确定哪些对象在运行时使用了堆内存?
确定什么是用尽大部分内存以使堆转储内存不足崩溃的唯一途径?
服务器:的WebSphere 7.5
JAVA版本: IBM 1.6
问题:我的内存不稳定,但WebSphere正在恢复。我正在尝试确定如何找出大部分内存使用情况。我有应用动态,但它不适用于Websphere。WebSphere 7 - 如何确定哪些对象在运行时使用了堆内存?
确定什么是用尽大部分内存以使堆转储内存不足崩溃的唯一途径?
服务器:的WebSphere 7.5
JAVA版本: IBM 1.6
在WebSphere Application Server运行时,您可以生成堆转储(某个时间点的堆的快照)以及线程转储/ Javacore(某个时间点的JVM中的线程列表)。您需要使用wsadmin
工具。启动wsadmin
工具并执行以下命令。
JACL版本:
set jvm [$AdminControl queryNames WebSphere:type=JVM,process=<servername>,node=<nodename>,*]
$AdminControl invoke $jvm generateHeapDump
$AdminControl invoke $jvm dumpThreads
Jython的版本(未测试):
jvm = AdminControl.queryNames ('WebSphere:type=JVM,process=<servername>,node=<nodename>,*')
AdminControl.invoke(jvm, 'generateHeapDump')
AdminControl.invoke(jvm, 'dumpThreads')
更换servername
& nodename
与你的价值观。确保在错误之前和恢复之后进行多次转储。
一旦命令完成,文件名将被返回。将这些文件移到不同的工作站(因为分析是一个资源密集型的过程),并使用您选择的任何工具分析它们。
你需要一个Java监测工具。 Dynatrace是我的最爱。它不是免费的(而且对个人来说并不便宜),但它会告诉你你的内存是如何管理的。我已经使用它与Websphere。
你认为你有内存泄漏或负载问题?
IBM JVM具有转储触发器,它允许您非常灵活地触发转储。例如,您可以配置JVM转储当进入一个给定的方法:
-Xtrace:trigger=method{java/lang/String.substring,coredump}
您可以指定计数,也因此产生当进入1000倍和1001倍的方法转储:
-Xtrace:trigger=method{java/lang/String.getBytes,coredump,,1000,2}
转储完成后,使用Eclipse内存分析器和IBM扩展(http://www.ibm.com/developerworks/java/jdk/tools/memoryanalyzer/)进行分析是一个很好的选择。 IBM扩展知道如何解析IBM转储(如您所期望的那样),并且还了解哪些内存使用模式表明存在潜在问题。
基于确定的负载。我不认为它是泄漏。对于对象而言,我无法确定内存中的内容。我希望可能有一种WebSphere方法来捕捉内存或强制转储它在命令上进行调查。 – haju