问题:我有间歇性的内存不足问题,但WebSphere正在恢复。我试图确定如何找出占用大部分内存的东西。我有应用程序动态但它不适用于Websphere。
唯一的方法是确定占用大部分内存的内存是否会因内存崩溃而导致堆转储?
服务器: WebSphere 7.5
JAVA版本: IBM 1.6
答案 0 :(得分:2)
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转储(正如您所期望的那样),并且还了解内存使用的哪种模式表明存在潜在问题。
答案 1 :(得分:0)
您需要一个java监控工具。 Dynatrace是我的最爱。它不是免费的(并且个人负担不起),但它会准确地告诉您如何管理您的记忆。我已经将它与Websphere一起使用了。
你认为你有内存泄漏或负载问题吗?
答案 2 :(得分:0)
在WebSphere Application Server运行时,您可以生成堆转储(在某个时间点堆的快照)和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
&amp; nodename
与您的价值观。确保在错误发生之前和恢复之后进行多次转储。
命令完成后,将返回文件名。将这些文件移动到不同的工作站(因为分析是一个资源密集型过程)并使用您选择的任何工具进行分析。