蚩尤后裔 2017-05-05
jstackisareallyhelpfulutilitythatcomesstandardwithmostlinuxJDKversions.Itallowsyoutogeneratejavathreaddumpsinsituationswherekill-3won'twork.kill-3(akakill-QUIT)willdumpajavaprocess'sthreadstostderr—butthis,ofcourse,worksonlywhenyoustillhaveaccesstostderr.Ifyou'rerunningajavaprocessasadaemon(likeajettyortomcatorjbossetcserver),stderrusuallyisinaccessible.
Fortunately,jstackallowsyoutogeneratethreaddumpswithoutneedingtoreadstderrfromtheoriginaljavaprocess.jstackwilldumpthethreadstojstack'sownstdout,whichyoucanpipetoafile,orthroughapager,orjustsenddirectlytoyourterminial.Thereafewtrickstousingit,however,whichdon'tseemtobedocumentedanywhere:
1.Usetherightjstackexecutable
jstackusuallywillworkonlyifitcamewiththesameexactJDKversionasthetargetJVMprocessisrunning.SincealotofserversenduphavingseveraldifferentJVMversionsinstalledonthem,it'simportanttomakesurethattheversionofjstackyou'retryingtouseistherightone—thejstackexecutableat/usr/bin/jstackwon'tnecessarilybecorrect.Andsincejstackdoesn'taccepta-versionflag,it'sprettyhardtotellwhichversion/usr/bin/jstackactuallyis.
SothemostreliablewaytorunjstackisfromthebindirectoryoftheJDKwhichyou'reusingtorunthetargetJVMprocess.Onubuntu,thisusuallywillbeasubdirectoryofoneoftheJDKsinthe/usr/lib/jvmdirectory(like/usr/lib/jvm/java-6-openjdk-amd64forthe64-bitversionofthejava6JDK).Inthatcase,youmightrunjstacklikethis(whenthetargetJVM'sprocessIDis12345):
/usr/lib/jvm/java-6-openjdk-amd64/bin/jstack12345
2.RunjstackasthesameuserasthetargetJVM
YouneedtorunjstackasthesameuseraswhichthetargetJVMisrunning.Forexample,ifyou'rerunningjettyasausernamedjetty,(andthejettyprocessIDis12345)usesudotoexecutejstackasthejettyuser:
sudo-ujettyjstack12345
(IlearnedthistrickfromMichaelMoser'sjstack-themissingmanualblogpost—apparentlyjstackusesanamedpipetocommunicatewiththetargetJVMprocess,andthatpipe'spermissionsallowonlytheuserwhocreatedthetargetJVMprocesstoreadorwritethepipe.)
3.Try,tryagain
Sometimes,evenifyoudothosefirsttwothings,jstackwillstilltellyoutogogetbent(orsomeotherinscrutableerrormessageofsimilarintent).I'vefoundthatifIjusttryrunningitagainacoupleoftimes,jstackmagicallywillworkonthesecondorthirdtry.
4.Don'tuse-F
Eventhoughjstacksometimesitselfwillsuggestthatyoutry-F(particularlyifyou'vegotaversionmismatchbetweenjstackandthetargetJVM),resistthetemptationto"force"it.Whenyouusejstackwiththe-Foption,jstackwillactuallystopthetargetprocess(iekill-STOP).Onlyusethe-Foptionifyourappisalreadygoodandhung(becauseitcertainlywillbeonceyouuse-F).
PostedbyJustinLudwigat11:21AM
Labels:daemon,debug,java,jstack,linux,threads
Nocomments:
PostaComment
摘自:http://blog.swwomm.com/2013/10/java-thread-dumps-for-daemons-with.html