你如何在java中获取线程堆_如何在Windows上获取未在控制台中运行的Java进程的线程和堆转储...
問題
我有一個(gè)Java應(yīng)用程序,我從控制臺(tái)運(yùn)行,然后控制臺(tái)執(zhí)行另一個(gè)Java進(jìn)程。我想獲得該子進(jìn)程的線程/堆轉(zhuǎn)儲(chǔ)。
在Unix上,我可以做akill -3 但是在Windows AFAIK上獲取線程轉(zhuǎn)儲(chǔ)的唯一方法是在控制臺(tái)中使用Ctrl-Break。但這只會(huì)讓我轉(zhuǎn)移父進(jìn)程,而不是孩子。
是否有另一種方法來(lái)獲得堆轉(zhuǎn)儲(chǔ)?
#1 熱門回答(326 贊)
假設(shè)你知道pid,你可以使用jmap獲取正在運(yùn)行的任何進(jìn)程的轉(zhuǎn)儲(chǔ)。
使用任務(wù)管理器或資源監(jiān)視器獲取pid。然后
jmap -dump:format=b,file=cheap.bin
獲取該進(jìn)程的堆。
#2 熱門回答(98 贊)
你混淆了兩個(gè)不同的java轉(zhuǎn)儲(chǔ).kill -3生成一個(gè)線程轉(zhuǎn)儲(chǔ),而不是一個(gè)堆轉(zhuǎn)儲(chǔ)。
線程轉(zhuǎn)儲(chǔ)=將JVM輸出中的每個(gè)線程的堆棧跟蹤作為文本輸出到stdout。堆轉(zhuǎn)儲(chǔ)= JVM進(jìn)程輸出到二進(jìn)制文件的內(nèi)存內(nèi)容。
要在Windows上進(jìn)行線程轉(zhuǎn)儲(chǔ),CTRL BREAK如果你的JVM是前臺(tái)進(jìn)程是最簡(jiǎn)單的方法。如果你在像Cygwin或MobaXterm這樣的Windows上有類似unix的shell,你可以像在Unix中一樣使用2146767290。
要在Unix中進(jìn)行線程轉(zhuǎn)儲(chǔ),只要為JVM獲得正確的PID,CTRL Cif你的JVM就是前臺(tái)進(jìn)程orkill -3 {pid}會(huì)工作。
只是為了完成轉(zhuǎn)儲(chǔ)問題:堆轉(zhuǎn)儲(chǔ)不常用,因?yàn)樗鼈兒茈y解釋。但是,如果你知道在哪里/如何看待它們,它們中有很多有用的信息。最常見的用法是查找內(nèi)存泄漏。最好在java命令行中設(shè)置-D,以便在OutOfMemoryError上自動(dòng)生成堆轉(zhuǎn)儲(chǔ),但也可以手動(dòng)觸發(fā)堆轉(zhuǎn)儲(chǔ)。最常見的方法是使用java utilityjmap。
**注意:**此實(shí)用程序并非在所有平臺(tái)上都可用。從JDK 1.6,jmap開始,在Windows上可用。
一個(gè)示例命令行看起來(lái)像
jmap -dump:file=myheap.bin {pid of the JVM}
輸出"myheap.bin"不是人類可讀的(對(duì)于我們大多數(shù)人來(lái)說(shuō)),你需要一個(gè)工具來(lái)分析它。我的偏好是MAT.http://www.eclipse.org/mat/
#3 熱門回答(24 贊)
我認(rèn)為在Linux進(jìn)程中創(chuàng)建.hprof文件的最佳方法是使用jmap命令。例如:jmap -dump:format=b,file=filename.hprof {PID}
總結(jié)
以上是生活随笔為你收集整理的你如何在java中获取线程堆_如何在Windows上获取未在控制台中运行的Java进程的线程和堆转储...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Windows Server 2008
- 下一篇: 电商扣减库存_电商后台系统产品逻辑全解析