WebSphere 7 - 如何确定哪些对象在运行时用完了堆内存?

WebSphere 7 - How can I determine which objects are using up heap memory at runtime?

问题: 我遇到间歇性内存不足问题,但 WebSphere 正在恢复。我正在尝试确定如何找出耗尽大部分内存的内容。我有应用程序动态,但它不适用于 Websphere。

是确定什么正在用尽大部分内存以从内存不足崩溃中进行堆转储的唯一方法吗?

服务器: WebSphere 7.5

JAVA版本:IBM 1.6

您需要一个 java 监控工具。 Dynatrace 是我的最爱。它不是免费的(个人也负担不起),但它会准确告诉您内存是如何管理的。我已经将它与 Websphere 一起使用了。

你认为你有内存泄漏,还是加载问题?

当 WebSphere Application Server 是 运行.

要获取转储,您需要使用 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')

用您的值替换 servernamenodename。确保在错误发生之前和恢复之后进行多次转储。

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

IBM JVM 有转储触发器,可以很灵活地触发转储。例如,您可以将 JVM 配置为在输入给定方法时进行转储:

-Xtrace:trigger=method{java/lang/String.substring,coredump}

您也可以指定计数,以便在方法输入 1000 次和 1001 次时生成转储:

-Xtrace:trigger=method{java/lang/String.getBytes,coredump,,1000,2}

获得转储后,使用 Eclipse Memory Analyzer 和 IBM 扩展 (http://www.ibm.com/developerworks/java/jdk/tools/memoryanalyzer/) 是进行分析的不错选择。 IBM 扩展知道如何解析 IBM 转储(正如您所期望的那样),并且还知道哪些内存使用模式表明存在潜在问题。