【发布时间】:2016-07-15 17:54:53
【问题描述】:
问题:我有间歇性的内存不足问题,但 WebSphere 正在恢复。我正在尝试确定如何找出占用大部分内存的内容。我有应用程序动态,但它不适用于 Websphere。
确定是什么耗尽了大部分内存以从内存不足崩溃中进行堆转储的唯一方法是什么?
服务器: WebSphere 7.5
JAVA 版本:IBM 1.6
【问题讨论】:
标签: java websphere websphere-7
问题:我有间歇性的内存不足问题,但 WebSphere 正在恢复。我正在尝试确定如何找出占用大部分内存的内容。我有应用程序动态,但它不适用于 Websphere。
确定是什么耗尽了大部分内存以从内存不足崩溃中进行堆转储的唯一方法是什么?
服务器: WebSphere 7.5
JAVA 版本:IBM 1.6
【问题讨论】:
标签: java websphere websphere-7
IBM JVM 具有转储触发器,允许您非常灵活地触发转储。例如,您可以将 JVM 配置为在输入给定方法时转储:
-Xtrace:trigger=method{java/lang/String.substring,coredump}
您也可以指定计数,以便在输入方法 1000 次和 1001 次时生成转储:
-Xtrace:trigger=method{java/lang/String.getBytes,coredump,,1000,2}
获得转储后,使用带有 IBM 扩展 (http://www.ibm.com/developerworks/java/jdk/tools/memoryanalyzer/) 的 Eclipse Memory Analyzer 是进行分析的好选择。 IBM 扩展知道如何解析 IBM 转储(正如您所期望的那样),并且还具有关于哪些内存使用模式指示潜在问题的智能。
【讨论】:
您可以在 WebSphere Application Server 运行时生成 Heap Dump(某个时间点的堆快照)和一个 Thread Dump/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 一起使用。
您认为您有内存泄漏或负载问题吗?
【讨论】: