表題にあるように、稼動しているJVMからHeapDumpを取り出したい時って
断片化が進んできて連続領域確保できずに、Heapが拡張してしまっているのが
ログから見て取れるのに、HeapDumpからオブジェクトの配置状況をマップして「見える化」するという
果てしなく無駄な作業とか、ありませんか?そうですか。
前置きが長かったですな。
(ええと、以下はIBMのJVMに関しての話です。SUN(現Oracle)についてはちゃうかもしれませんので
各自自習。普通jmapとか使うんじゃないかな)
このHeapDump、普通はOOM(OutOfMemory)発生時にしかでません。オプション、IBM_HEAP_DUMP=trueが入ってないから
kill -3 (QUIT)で出ます、って記事もたまーにありますが、このオプションの説明が
はしょってあるだけです。デフォルトでは出ません。(←ここ、よくハマるので注意)
概ねは これの http://www-01.ibm.com/support/docview.wss?uid=jpn1J1006976
要するに、オプション入れとかなきゃ OOM時しか出ません、って話なんだけど
http://publib.boulder.ibm.com/infocenter/javasdk/v6r0/topic/com.ibm.java.doc.diagnostics.60/diag/tools/heapdump_env.html
で、これを設定してないAPPServerのHeapDumpが欲しい今すぐ。設定変更、再起動は許さん!
という「そんなご無体な・・・」「うるさい、今すぐやれあqswでfrgthyじゅきぉ」
と来るのが世の常。Dumpが要求されるような時っていうのは、まぁ大抵トラブル発生中なうな極限状態であることが多いので
普段冷静なお客様や上役達も目の前にブロックを落とされたぐっすんおよよ状態なわけでして。
で、うん、よし落ち着け。
WebSphereのJVMに限って言えば方法はある。だから落ち着け
やり方はwsadminで、該当ASのJVMのmbeanをとってきて
Admincontrolで、generateHeapDumpするだけ。
で、毎回毎回毎回jython書くのも面倒なので、ここに保存しておく
以下のjythonは入力値のASの存在確認をしたのち、heapdumpを出力させる
WASのFPが低いと、ぬるぽが出る既存の問題を踏む可能性がある
http://www-01.ibm.com/support/docview.wss?uid=swg1PK77235
----------
import sys
import os
def task_heapDump(id,asName):
print "APPServer : %s " % asName
NodeName=findNode(asName)
if(NodeName==None):
#don't Enter ...
print "Huh?"
sys.exit(8)
print "Node : %s " % NodeName
jvmbean = AdminControl.queryNames('type=JVM,process=' + asName +',node=' + NodeName + ',*')
print "enter heapdump..."
print ""
AdminControl.invoke(jvmbean, "generateHeapDump")
print ""
print "done."
def findNode(asName):
nodes = AdminConfig.list("Node").splitlines()
for node in nodes:
nodeServers = AdminConfig.list("Server", node).splitlines()
for nodeServer in nodeServers:
sname = AdminConfig.showAttribute(nodeServer, "name")
if sname == asName:
nname = AdminConfig.showAttribute(node, "name")
return nname
return None
if(len(sys.argv) != 1 ):
print "usage : wsadmin.sh -user -password -lang jython -f memDmp.py "
sys.exit(0)
TargetName=sys.argv[0]
Servers=AdminConfig.list("Server")
for sv in Servers.splitlines():
ServerType = AdminConfig.showAttribute(sv,"serverType")
if(ServerType == "APPLICATION_SERVER"):
Cname = AdminConfig.showAttribute(sv,"name")
if(Cname==TargetName):
task_heapDump(sv,Cname)
sys.exit(0)
print "if you see this message, check your input. script can't found APP Server %s " % TargetName


