2016-07-15 63 views
0

问题:我的内存不稳定,但WebSphere正在恢复。我正在尝试确定如何找出大部分内存使用情况。我有应用动态,但它不适用于Websphere。WebSphere 7 - 如何确定哪些对象在运行时使用了堆内存?

确定什么是用尽大部分内存以使堆转储内存不足崩溃的唯一途径?

服务器:的WebSphere 7.5

JAVA版本: IBM 1.6

回答

0

在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与你的价值观。确保在错误之前和恢复之后进行多次转储。

一旦命令完成,文件名将被返回。将这些文件移到不同的工作站(因为分析是一个资源密集型的过程),并使用您选择的任何工具分析它们。

0

你需要一个Java监测工具。 Dynatrace是我的最爱。它不是免费的(而且对个人来说并不便宜),但它会告诉你你的内存是如何管理的。我已经使用它与Websphere。

你认为你有内存泄漏或负载问题?

+0

基于确定的负载。我不认为它是泄漏。对于对象而言,我无法确定内存中的内容。我希望可能有一种WebSphere方法来捕捉内存或强制转储它在命令上进行调查。 – haju

2

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转储(如您所期望的那样),并且还了解哪些内存使用模式表明存在潜在问题。

相关问题