Java WebSphere 7-如何确定哪些对象在运行时正在使用堆内存?
问题:我有间歇性内存不足问题,但WebSphere正在恢复。我正在努力确定如何找出占用大部分内存的内容。我有应用程序动态,但它不适用于Websphere 确定内存不足崩溃导致的堆转储占用了大部分内存的唯一方法是什么 服务器:WebSphere 7.5Java WebSphere 7-如何确定哪些对象在运行时正在使用堆内存?,java,websphere,websphere-7,Java,Websphere,Websphere 7,问题:我有间歇性内存不足问题,但WebSphere正在恢复。我正在努力确定如何找出占用大部分内存的内容。我有应用程序动态,但它不适用于Websphere 确定内存不足崩溃导致的堆转储占用了大部分内存的唯一方法是什么 服务器:WebSphere 7.5 JAVA版本:ibm1.6您需要一个JAVA监控工具。Dynatrace是我的最爱。它不是免费的(个人也负担不起),但它会准确地告诉你如何管理你的内存。我在Websphere中使用了它 您认为您有内存泄漏或负载问题吗?您需要一个java监控工具。D
JAVA版本:ibm1.6您需要一个JAVA监控工具。Dynatrace是我的最爱。它不是免费的(个人也负担不起),但它会准确地告诉你如何管理你的内存。我在Websphere中使用了它
您认为您有内存泄漏或负载问题吗?您需要一个java监控工具。Dynatrace是我的最爱。它不是免费的(个人也负担不起),但它会准确地告诉你如何管理你的内存。我在Websphere中使用了它
您认为您有内存泄漏或负载问题吗?您可以在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
set jvm[$AdminControl queryNames WebSphere:type=jvm,process=,node=,*]
$AdminControl调用$jvm generateHeapDump
$AdminControl调用$jvm转储线程
Jython版本(未经测试):
jvm=AdminControl.queryNames('WebSphere:type=jvm,process=,node=,*'))
invoke(jvm,“generateHeapDump”)
invoke(jvm,'dumpThreads')
用您的值替换servername
和nodename
。确保在错误发生之前和恢复之后进行多次转储
命令完成后,将返回文件名。将这些文件移动到不同的工作站(因为分析是一个资源密集型的过程),并使用您选择的任何工具对其进行分析。您可以在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
set jvm[$AdminControl queryNames WebSphere:type=jvm,process=,node=,*]
$AdminControl调用$jvm generateHeapDump
$AdminControl调用$jvm转储线程
Jython版本(未经测试):
jvm=AdminControl.queryNames('WebSphere:type=jvm,process=,node=,*'))
invoke(jvm,“generateHeapDump”)
invoke(jvm,'dumpThreads')
用您的值替换servername
和nodename
。确保在错误发生之前和恢复之后进行多次转储
命令完成后,将返回文件名。将这些文件移动到不同的工作站(因为分析是一个资源密集型过程),并使用您选择的任何工具对其进行分析。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 extensions()进行分析是一个很好的选择。IBM扩展知道如何解析IBM转储(正如您所期望的那样),并且还具有关于内存使用模式指示潜在问题的智能 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 extensions()进行分析是一个很好的选择。IBM扩展知道如何解析IBM转储(正如您所期望的那样),并且还具有关于内存使用模式指示潜在问题的智能 当然是基于负载的。我不认为这是个漏洞。我只是不能确定从对象的角度来看,记忆中保存着什么。我希望有一种WebSphere方法可以抓取内存快照,或者强制将其转储到命令上以进行调查。当然是基于负载的。我不认为这是个漏洞。我只是不能确定从对象的角度来看,记忆中保存着什么。我希望有一种WebSphere方式可以抓拍内存或强制将其转储到命令上进行调查。