java自带工具_深入了解Java JDK自带工具,包括javac、jar、jstack等,实用~
在Java JDK的安用裝目錄bin下,有一些有非常實(shí)用的小工具,可用于分析JVM初始配置、內(nèi)存溢出異常等問(wèn)題,我們接下來(lái)將對(duì)些常用的工具進(jìn)行一些說(shuō)明。
JDK小工具簡(jiǎn)介
在JDK的bin目錄下面有一些小工具,如javac、jar、jstack、jstat等,在日常編譯運(yùn)行過(guò)程中有著不少的“額外”功能,那么它們是怎么工作的呢?雖然這些文件本身已經(jīng)被編譯成可執(zhí)行二進(jìn)制文件了,但是其實(shí)它們的功能都是由tools.jar這個(gè)工具包(配合一些dll或者so本地庫(kù))完成的,每個(gè)可執(zhí)行文件都對(duì)應(yīng)一個(gè)包含main函數(shù)入口的java類(有興趣可以閱讀openJDK相關(guān)的源碼(時(shí)代Java的JDK8/Java8源碼在線閱讀),它們的對(duì)應(yīng)關(guān)系如下(更多可去openJDK查閱):
javac com.sun.tools.javac.Main
jar sun.tools.jar.Main
jps sun.tools.jps.Jps
jstat sun.tools.jstat.Jstat
jstack sun.tools.jstack.JStack
...
工具/命令簡(jiǎn)要說(shuō)明
javac - Java代碼編譯命令。
jar - 打包工具命令。
jstack - 查看和跟蹤Java堆棧信息的工具。
jstat - 于監(jiān)控虛擬機(jī)各種運(yùn)行狀態(tài)信息。
tools.jar的使用
我們一般開(kāi)發(fā)機(jī)器上都會(huì)安裝JDK+jre,這時(shí)候,要用這些工具,直接運(yùn)行二進(jìn)制可執(zhí)行文件就行了,但是有時(shí)候,機(jī)器上只有jre而沒(méi)有JDK,我們就無(wú)法用了么?
如果你知道如上的對(duì)應(yīng)關(guān)系的話,我們就可以"構(gòu)造"出這些工具來(lái)(當(dāng)然也可以把JDK安裝一遍,本篇只是介紹另一種選擇),比如我們編寫(xiě)
//Hello.java
public class Hello{
public static void main(String[] args)throws Exception{
while(true){
test1();
Thread.sleep(1000L);
}
}
public static void test1(){
test2();
}
public static void test2(){
System.out.println("invoke test2");
}
}
可以驗(yàn)證如下功能轉(zhuǎn)換關(guān)系
1.編譯源文件:
javac Hello.java => java -cp tools.jar com.sun.tools.javac.Main Hello.java
結(jié)果一樣,都可以生成Hello.class文件
然后我們開(kāi)始運(yùn)行java -cp . Hello
2.查看java進(jìn)程:
jps => java -cp tools.jar sun.tools.jps.Jps
結(jié)果一樣,如下:
4615 Jps
11048 jar
3003 Hello
3.jstat動(dòng)態(tài)查看內(nèi)存:
jstat -gcutil 3003 100 3 => java -cp tools.jar sun.tools.jstat.Jstat -gcutil 3003 100 3
發(fā)現(xiàn)結(jié)果是一樣的
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
0.00 0.00 4.00 0.00 17.42 19.65 0 0.000 0 0.000 0.000
0.00 0.00 4.00 0.00 17.42 19.65 0 0.000 0 0.000 0.000
0.00 0.00 4.00 0.00 17.42 19.65 0 0.000 0 0.000 0.000
4.查看當(dāng)前運(yùn)行棧信息
正常情況,執(zhí)行如下命令結(jié)果也是一樣,可以正常輸出
jstack 3003 =》 java -cp tools.jar sun.tools.jstack.JStack 3003
但是有的jre安裝不正常的時(shí)候,會(huì)報(bào)如下錯(cuò)誤
Exception in thread "main" java.lang.UnsatisfiedLinkError: no attach in java.library.path
這是因?yàn)閖stack的運(yùn)行需要attach本地庫(kù)的支持,我們需要在系統(tǒng)變量里面配置上其路徑,假如路徑為/home/JDK/jre/bin/libattach.so
命令轉(zhuǎn)換成
jstack 3003 =》 java -Djava.library.path=/home/JDK/jre/bin -cp tools.jar sun.tools.jstack.JStack 3003
就可以實(shí)現(xiàn)了
在linux系統(tǒng)中是libattach.so,而在windows系統(tǒng)中是attach.dll,它提供了一個(gè)與本機(jī)jvm通信的能力,利用它可以與本地的jvm進(jìn)行通信,許多java小工具就可能通過(guò)它來(lái)獲取jvm運(yùn)行時(shí)狀態(tài),也可以對(duì)jvm執(zhí)行一些操作。
jstack命令詳解
jstack用于打印出給定的java進(jìn)程ID或core file或遠(yuǎn)程調(diào)試服務(wù)的Java堆棧信息,如果是在64位機(jī)器上,需要指定選項(xiàng)"-J-d64",
Windows的jstack使用方式只支持以下的這種方式:jstack [-l] pid
如果java程序崩潰生成core文件,jstack工具可以用來(lái)獲得core文件的java stack和native stack的信息,從而可以輕松地知道java程序是如何崩潰和在程序何處發(fā)生問(wèn)題。另外,jstack工具還可以附屬到正在運(yùn)行的java程序中,看到當(dāng)時(shí)運(yùn)行的java程序的java stack和native stack的信息, 如果現(xiàn)在運(yùn)行的java程序呈現(xiàn)hung的狀態(tài),jstack是非常有用的。
需要注意的問(wèn)題:
l 不同的 JAVA虛機(jī)的線程 DUMP的創(chuàng)建方法和文件格式是不一樣的,不同的 JVM版本, dump信息也有差別。
l 在實(shí)際運(yùn)行中,往往一次 dump的信息,還不足以確認(rèn)問(wèn)題。建議產(chǎn)生三次 dump信息,如果每次 dump都指向同一個(gè)問(wèn)題,我們才確定問(wèn)題的典型性。
2、命令格式
$jstack [ option ] pid
$jstack [ option ] executable core
$jstack [ option ] [server-id@]remote-hostname-or-IP
參數(shù)說(shuō)明:
pid: java應(yīng)用程序的進(jìn)程號(hào),一般可以通過(guò)jps來(lái)獲得;
executable:產(chǎn)生core dump的java可執(zhí)行程序;
core:打印出的core文件;
remote-hostname-or-ip:遠(yuǎn)程debug服務(wù)器的名稱或IP;
server-id: 唯一id,假如一臺(tái)主機(jī)上多個(gè)遠(yuǎn)程debug服務(wù);
--
知識(shí)分享,時(shí)代前行!~~ 時(shí)代Java還有更多好文章……請(qǐng)查看歷史文章和官網(wǎng),有分享,有收獲!
總結(jié)
以上是生活随笔為你收集整理的java自带工具_深入了解Java JDK自带工具,包括javac、jar、jstack等,实用~的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: python barrier optio
- 下一篇: gnome mysql client_解