日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

JDK内置工具使用

發(fā)布時(shí)間:2023/11/30 编程问答 53 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JDK内置工具使用 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

JDK內(nèi)置工具使用

一、javah命令(C?Header?and?Stub?File?Generator)

二、jps命令(Java?Virtual?Machine?Process?Status?Tool)

三、jstack命令(Java?Stack?Trace)

四、jstat命令(Java?Virtual?Machine?Statistics?Monitoring?Tool)

五、jmap命令(Java?Memory?Map)

六、jinfo命令(Java?Configuration?Info)

七、jconsole命令(Java?Monitoring?and?Management?Console)

八、jvisualvm命令(Java?Virtual?Machine?Monitoring,?Troubleshooting,?and?Profiling?Tool)

九、jhat命令(Java?Heap?Analyse?Tool)

十、Jdb命令(The?Java?Debugger)

1、介紹

jstack用于打印出給定的java進(jìn)程IDcore?file或遠(yuǎn)程調(diào)試服務(wù)的Java堆棧信息,如果是在64位機(jī)器上,需要指定選項(xiàng)"-J-d64"Windowsjstack使用方式只支持以下的這種方式:

jstack?[-l]?pid

果java程序崩潰生成core文件,jstack工具可以用來獲得core文件的java?stacknative?stack的信息,從而可以輕松地知道java程序是如何崩潰和在程序何處發(fā)生問題。另外,jstack工具還可以附屬到正在運(yùn)行的java程序中,看到當(dāng)時(shí)運(yùn)行的java程序的java?stacknative?stack的信息,?如果現(xiàn)在運(yùn)行的java程序呈現(xiàn)hung的狀態(tài),jstack是非常有用的。

2、命令格式
jstack?[?option?]?pid
jstack?[?option?]?executable?core
jstack?[?option?]?[server-id@]remote-hostname-or-IP

3、常用參數(shù)說明

1)、options?

executable?Java?executable?from?which?the?core?dump?was?produced.

(可能是產(chǎn)生core?dumpjava可執(zhí)行程序)

core?將被打印信息的core?dump文件

remote-hostname-or-IP?遠(yuǎn)程debug服務(wù)的主機(jī)名或ip

server-id?唯一id,假如一臺主機(jī)上多個(gè)遠(yuǎn)程debug服務(wù)?

2)、基本參數(shù):

-F當(dāng)’jstack?[-l]?pid’沒有相應(yīng)的時(shí)候強(qiáng)制打印棧信息

-l長列表.?打印關(guān)于鎖的附加信息,例如屬于java.util.concurrentownable?synchronizers列表.

-m打印javanative?c/c++框架的所有棧信息.

-h?|?-help打印幫助信息

pid?需要被打印配置信息的java進(jìn)程id,可以用jps查詢.

4、使用示例


一、jstatd?
啟動jvm監(jiān)控服務(wù)。它是一個(gè)基于rmi的應(yīng)用,向遠(yuǎn)程機(jī)器提供本機(jī)jvm應(yīng)用程序的信息。默認(rèn)端口1099。?
實(shí)例:jstatd -J-Djava.security.policy=my.policy?

my.policy文件需要自己建立,內(nèi)如如下:?
Java代碼??
  • grant?codebase?"file:${java.home}/../lib/tools.jar"?{??
  • ?permission?java.security.AllPermission;??
  • };??

  • 這是安全策略文件,因?yàn)閖dk對jvm做了jaas的安全檢測,所以我們必須設(shè)置一些策略,使得jstatd被允許作網(wǎng)絡(luò)操作?

    二、jps?
    列出所有的jvm實(shí)例?
    實(shí)例:?
    jps?
    列出本機(jī)所有的jvm實(shí)例?

    jps 192.168.0.77?
    列出遠(yuǎn)程服務(wù)器192.168.0.77機(jī)器所有的jvm實(shí)例,采用rmi協(xié)議,默認(rèn)連接端口為1099?
    (前提是遠(yuǎn)程服務(wù)器提供jstatd服務(wù))?

    輸出內(nèi)容如下:?
    jones@jones:~/data/ebook/java/j2se/jdk_gc$ jps?
    6286 Jps?
    6174? Jstat?

    詳細(xì)請看連接:http://www.blogjava.net/aoxj/archive/2007/12/29/171447.html?

    三、jconsole?

    用法: jconsole [ -interval=n ] [ -notile ] [ -pluginpath? ] [ -version ] [ connection ...]?

    ? -interval?? 將更新間隔時(shí)間設(shè)置為 n 秒(默認(rèn)值為 4 秒)?
    ? -notile???? 最初不平鋪顯示窗口(對于兩個(gè)或更多連接)?
    ? -pluginpath 指定 jconsole 用于查找插件的路徑?
    ? -version??? 輸出程序版本?

    ? connection = pid || host:port || JMX URL (service:jmx:://...)?

    ? pid?????? 目標(biāo)進(jìn)程的進(jìn)程 ID?
    ? host????? 遠(yuǎn)程主機(jī)名或 IP 地址?
    ? port????? 用于遠(yuǎn)程連接的端口號?

    ? -J????????? 對正在運(yùn)行 jconsole 的 Java 虛擬機(jī)指定輸入?yún)?shù)
    ?

    在cmd中輸入命令:jconsole 3980[java進(jìn)程號] 彈出下圖?


    四、jinfo?
    用法:?
    jinfo [ option ] pid?
    jinfo [ option ] executable core?
    jinfo [ option ] [server-id@]remote-hostname-or-IP?

    參數(shù):?

    pid?? 進(jìn)程號?
    executable?? 產(chǎn)生core dump的java executable?
    core?? core file?
    remote-hostname-or-IP? 主機(jī)名或ip?
    server-id??? 遠(yuǎn)程主機(jī)上的debug server的唯一id?

    選項(xiàng):?
    no option? 打印命令行參數(shù)和系統(tǒng)屬性?
    -flags? 打印命令行參數(shù)?
    -sysprops? 打印系統(tǒng)屬性?
    -h? 幫助
    ?

    觀察運(yùn)行中的java程序的運(yùn)行環(huán)境參數(shù):參數(shù)包括Java System屬性和JVM命令行參數(shù)?
    實(shí)例:?
    jinfo 2083?
    其中2083就是java進(jìn)程id號,可以用jps得到這個(gè)id號。我在windows上嘗試輸入這個(gè)命令,但是不管用,于是我輸入了下面這個(gè)命令:?
    jinfo -flag MaxPermSize 3980?
    顯示如下:?
    -XX:MaxPermSize=67108864?

    五、jstack?
    該命令應(yīng)該如何使用呢?首先需要用jstack命令產(chǎn)生java進(jìn)程的dump文件,然后分析dump文件中的數(shù)據(jù),下面的連接是一篇講述如何分析jstack產(chǎn)生的dump文件數(shù)據(jù)的文章,寫的非常不錯(cuò):?
    http://www.blogjava.net/jzone/articles/303979.html?

    六、jmap(linux下特有,也是很常用的一個(gè)命令)?
    觀察運(yùn)行中的jvm物理內(nèi)存的占用情況。?
    參數(shù)如下:?
    -heap:打印jvm heap的情況?
    -histo:打印jvm heap的直方圖。其輸出信息包括類名,對象數(shù)量,對象占用大小。?
    -histo:live :同上,但是只答應(yīng)存活對象的情況?
    -permstat:打印permanent generation heap情況
    ?

    命令使用:?
    jmap -heap 2083?
    可以觀察到New Generation(Eden Space,From Space,To Space),tenured generation,Perm Generation的內(nèi)存使用情況?

    jmap -histo 2083 | jmap -histo:live 2083?
    可以觀察heap中所有對象的情況(heap中所有生存的對象的情況)。包括對象數(shù)量和所占空間大小。?

    jmap -histo java進(jìn)程id?
    可以查看java進(jìn)程中的所有實(shí)例、實(shí)例的個(gè)數(shù),可用于查詢單例對象是否真的只生成了一個(gè)實(shí)例。?

    在控制臺,輸入命令“jmap -histo 7329 > histo_dump”,得到如下結(jié)果:?
    Java代碼??
  • num?????#instances?????????#bytes??class?name??
  • ---------------------------------------------??
  • ??1:????????605348???????68849960??[C??
  • ??2:???????1609734???????51511488??java.util.concurrent.ConcurrentHashMap$Segment??
  • ??3:???????1610022???????38640528??java.util.concurrent.locks.ReentrantLock$NonfairSync??
  • ??4:?????????70784???????31478168??[I??
  • ??5:????????218224???????27628072??<constMethodKlass>??
  • ??6:???????1609734???????26423552??[Ljava.util.concurrent.ConcurrentHashMap$HashEntry;??
  • ??7:?????????40379???????24430792??[B??
  • ??8:????????218224???????19211544??<methodKlass>??
  • ??9:????????602848???????14468352??java.lang.String??
  • ?10:?????????19374???????11640184??<constantPoolKlass>??
  • ?11:????????236950???????11451216??<symbolKlass>??
  • ?12:????????283746???????11349840??java.util.concurrent.ConcurrentHashMap$ValueIterator??
  • ?13:?????????19374????????8826272??<instanceKlassKlass>??
  • ?14:????????100613????????8048728??[Ljava.util.concurrent.ConcurrentHashMap$Segment;??
  • ?15:?????????85036????????7332664??[Ljava.lang.Object;??
  • ?16:?????????15559????????6614824??<constantPoolCacheKlass>??
  • ?17:?????????78919????????6313520??java.lang.reflect.Method??
  • ?18:????????103377????????4962096??com.sun.tools.javac.zip.ZipFileIndexEntry??
  • ?19:?????????51998????????4324096??[Ljava.util.HashMap$Entry;??
  • ?20:????????100613????????4024520??java.util.concurrent.ConcurrentHashMap??
  • ?21:????????157136????????3771264??java.util.concurrent.ConcurrentHashMap$HashEntry??
  • ?22:?????????35932????????3736928??com.asiainfo.dbm.core.bean.monitor.FlowService??
  • ?23:?????????35932????????3736928??com.asiainfo.dbm.core.bean.monitor.FlowService??


  • 七、jstat?
    最后要重點(diǎn)介紹下這個(gè)命令,這是jdk命令中比較重要,也是相當(dāng)實(shí)用的一個(gè)命令,可以觀察到classloader,compiler,gc相關(guān)信息。?
    具體參數(shù)如下:?
    -class:統(tǒng)計(jì)class loader行為信息?
    -compile:統(tǒng)計(jì)編譯行為信息?
    -gc:統(tǒng)計(jì)jdk gc時(shí)heap信息?
    -gccapacity:統(tǒng)計(jì)不同的generations(不知道怎么翻譯好,包括新生區(qū),老年區(qū),permanent區(qū))相應(yīng)的heap容量情況?
    -gccause:統(tǒng)計(jì)gc的情況,(同-gcutil)和引起gc的事件?
    -gcnew:統(tǒng)計(jì)gc時(shí),新生代的情況?
    -gcnewcapacity:統(tǒng)計(jì)gc時(shí),新生代heap容量?
    -gcold:統(tǒng)計(jì)gc時(shí),老年區(qū)的情況?
    -gcoldcapacity:統(tǒng)計(jì)gc時(shí),老年區(qū)heap容量?
    -gcpermcapacity:統(tǒng)計(jì)gc時(shí),permanent區(qū)heap容量?
    -gcutil:統(tǒng)計(jì)gc時(shí),heap情況?
    -printcompilation:不知道干什么的,一直沒用過。
    ?

    一般比較常用的幾個(gè)參數(shù)是:?
    Java代碼??
  • jstat?-class?27629?3000?10?//每隔1秒監(jiān)控一次,一共做10次??

  • 輸出內(nèi)容含義如下:?
    Loaded Bytes Unloaded Bytes Time
    49955 49701.5??? 35528 32456.1????? 34.71
    49955 49701.5??? 35528 32456.1????? 34.71
    49955 49701.5??? 35528 32456.1????? 34.71
    49955 49701.5??? 35528 32456.1????? 34.71
    49963 49708.8??? 35528 32456.1????? 34.71
    49963 49708.8??? 35528 32456.1????? 34.71
    49963 49708.8??? 35528 32456.1????? 34.71
    49971 49716.1??? 35528 32456.1????? 34.71
    49971 49716.1??? 35528 32456.1????? 34.71
    49971 49716.1??? 35528 32456.1????? 34.71


    jstat -gc 2083 2000 20(每隔2秒監(jiān)控一次,共做10)?
    輸出內(nèi)容含義如下:?
    S0C Current survivor(存活的) space 0 capacity (KB).
    EC Current eden space capacity (KB).
    EU Eden space utilization (KB).
    OC Current old space capacity (KB).
    OU Old space utilization (KB).
    PC Current permanent space capacity (KB).
    PU Permanent space utilization (KB).
    YGC Number of young generation GC Events.
    YGCT Young generation garbage collection time.
    FGC Number of full GC events.
    FGCT Full garbage collection time.
    GCT Total garbage collection time.


    監(jiān)控內(nèi)存使用情況 參數(shù) (查看內(nèi)存溢出相對有用)?
    jstat -gccause 2083 5000?(每隔5秒監(jiān)控一次)?
    輸出內(nèi)容含義如下:?
    S0 Survivor space 0 utilization as a percentage of the space's current capacity.
    S1 Survivor space 1 utilization as a percentage of the space's current capacity.
    E Eden space utilization as a percentage of the space's current capacity.
    O Old space utilization as a percentage of the space's current capacity.
    P Permanent space utilization as a percentage of the space's current capacity.
    YGC Number of young generation GC events.
    YGCT Young generation garbage collection time.
    FGC Number of full GC events.
    FGCT Full garbage collection time.
    GCT Total garbage collection time.
    LGCC Cause of last Garbage Collection.
    GCC Cause of current Garbage Collection.


    八、jvisualvm?
    java visualvm 是visualvm的一個(gè)針對java vm的發(fā)布版本。 關(guān)于visualvm的更多信息可以訪問 visualvm.java.net.jvisualvm 工具從jdk 6 update7 (apple的java 是從 mac os x 10.5 update 4)之后,默認(rèn)就已經(jīng)存在jdk工具里。?
    java visualvm是一個(gè)穩(wěn)定的工具,用每一個(gè)jdk發(fā)布版本測試過。 最新的jdk請到oracle(sun)公司的網(wǎng)上進(jìn)行下載。

    jvisualvm 的功能及ui比jconsole還要強(qiáng)大。我們先來看下jvisualvm的用法。 他是一個(gè)gui(圖形界面)的工具,所以上手應(yīng)該會很快。?

    官網(wǎng)上關(guān)于jvisualvm的用法介紹 http://docs.oracle.com/javase/6/docs/technotes/tools/share/jvisualvm.html?

    簡單來說,我們不需要傳遞任何參數(shù)就可以啟動jvisualvm。?

    我們可以把jvisualvm也放到j(luò)dk的path里, 然后加到環(huán)境的path里。 這時(shí)候我們在windows的運(yùn)行或者cmd里運(yùn)行?
    jvisualvm就可以啟動該工具了。 或者我們直接雙擊點(diǎn)擊該軟件?
    在cmd中輸入命令:jvisualvm 彈出下圖?


    具體用法可以參考下面這個(gè)鏈接:http://www.iteye.com/topic/516447?

    下面我們來講解如何利用visualvm對遠(yuǎn)程的主機(jī)進(jìn)行監(jiān)控?
    首先,我們可以在用戶目錄下的任何地方(比如說:用戶根目錄,或者是jdk根目錄)新建一個(gè)名稱為jstatd.all.policy的文件,文件內(nèi)容如下:?
    Java代碼??
  • grant?codebase?"file:${java.home}/../lib/tools.jar"?{?????
  • ??permission?java.security.AllPermission;?????
  • };??


  • 新建完文件后,我們給這個(gè)文件賦予執(zhí)行權(quán)限,命令如下:?
    Java代碼??
  • chmod?755?jstatd.all.policy??


  • 然后,我們在我們運(yùn)行如下命令,啟動jstatd服務(wù)(jstatd服務(wù)的默認(rèn)端口為1099):?
    Java代碼??
  • jstatd?-J-Djava.security.policy=/sw/bes/jstatd.all.policy??

  • 記住jstatd.all.policy文件必須為絕對路徑,防止出現(xiàn)java.security.AccessControlException: access denied (java.util.PropertyPermission java.rmi.server.ignoreSubClasses write)錯(cuò)誤。?

    最后,我們可以用jps命令查看是否啟動成功:?
    Java代碼??
  • jps?-l??

  • 得到如下結(jié)果:?
    • 9481 com.bes.enterprise.ee.nodeagent.NodeAgentMain
    • 7329 com.bes.enterprise.server.Entry
    • 18968 com.bes.enterprise.server.Entry
    • 15802 sun.tools.jstatd.Jstatd
    • 16075 sun.tools.jps.Jps
    • 9328 com.bes.enterprise.server.Entry

    總結(jié)

    以上是生活随笔為你收集整理的JDK内置工具使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。