开心六月综合激情婷婷|欧美精品成人动漫二区|国产中文字幕综合色|亚洲人在线成视频

    1. 
      
        <b id="zqfy3"><legend id="zqfy3"><fieldset id="zqfy3"></fieldset></legend></b>
          <ul id="zqfy3"></ul>
          <blockquote id="zqfy3"><strong id="zqfy3"><dfn id="zqfy3"></dfn></strong></blockquote>
          <blockquote id="zqfy3"><legend id="zqfy3"></legend></blockquote>
          打開APP
          userphoto
          未登錄

          開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

          開通VIP
          關(guān)于 Java 性能監(jiān)控您不知道的 5 件事,第 2 部分

          關(guān)于 Java 性能監(jiān)控您不知道的 5 件事,第 2 部分

          利用 JDK 內(nèi)置分析器進(jìn)行 Java 進(jìn)程監(jiān)控

          Ted Neward, 主管, Neward & Associates

           

          簡介: 如果 JDK 中配置有全功能分析器 JConsole 對于您還是條新聞的話,本文中將介紹的 5 個(gè)獨(dú)立分析實(shí)用程序可能會(huì)使您感到更加驚奇。您將了解輕量級(有時(shí)是實(shí)驗(yàn)型)Java? 進(jìn)程監(jiān)控和分析工具如何幫助您應(yīng)對線程饑餓、死鎖及對象泄露等性能瓶頸問題。

           

          發(fā)布日期: 2010 年 9 月 03 日
          級別: 初級其他語言版本: 英文
          訪問情況 4045 次瀏覽
          建議: 0 (添加評論)

          平均分 (共 5 個(gè)評分 )

           

          關(guān)于該系列

          您覺得自己懂 Java 編程?事實(shí)上,大多數(shù)程序員對于 Java 平臺都是淺嘗輒止,只學(xué)習(xí)了足以完成手頭上任務(wù)的知識而已。在 本系列 中,Ted Neward Ted Neward 深入挖掘 Java 平臺的核心功能,揭示一些鮮為人知的事實(shí),幫助您解決最棘手的編程困難。

          全功能內(nèi)置分析器,如 JConsole 和 VisualVM 的成本有時(shí)比它們的性能費(fèi)用還要高 —尤其是在生產(chǎn)軟件上運(yùn)行的系統(tǒng)中。因此,在聚焦 Java 性能監(jiān)控的第 2 篇文章中,我將介紹 5 個(gè)命令行分析工具,使開發(fā)人員僅關(guān)注運(yùn)行的Java 進(jìn)程的一個(gè)方面。

          JDK 包括很多命令行實(shí)用程序,可以用于監(jiān)控和管理 Java 應(yīng)用程序性能。雖然大多數(shù)這類應(yīng)用程序都被標(biāo)注為 “實(shí)驗(yàn)型”,在技術(shù)上不受支持,但是它們很有用。有些甚至是特定用途工具的種子材料,可以使用 JVMTI 或 JDI(參見 參考資料)建立。

          1. jps (sun.tools.jps)

          很多命令行工具都要求您識別您希望監(jiān)控的 Java 進(jìn)程。這與監(jiān)控本地操作系統(tǒng)進(jìn)程、同樣需要一個(gè)程序識別器的同類工具沒有太大區(qū)別。

          “VMID” 識別器與本地操作系統(tǒng)進(jìn)程識別器(“pid”)并不總是相同的,這就是我們需要 JDK jps 實(shí)用程序的原因。

          在 Java 進(jìn)程中使用 jps

          與配置 JDK 的大部分工具及本文中提及的所有工具一樣,可執(zhí)行 jps 通常是一個(gè)圍繞 Java類或執(zhí)行大多數(shù)工作的類集的一個(gè)薄包裝。在 Windows? 環(huán)境下,這些工具是 .exe 文件,使用 JNI Invocation API直接調(diào)用上面提及的類;在 UNIX? 環(huán)境下,大多數(shù)工具是一個(gè) shell 腳本的符號鏈接,該腳本采用指定的正確類名稱開始一個(gè)普通啟動(dòng)程序。

          如果您希望在 Java 進(jìn)程中使用 jps(或者任何其他工具)的功能 — Ant 腳本 — 僅在每個(gè)工具的 “主” 類上調(diào)用 main() 相對容易。為了簡化引用,類名稱出現(xiàn)在每個(gè)工具名稱之后的括號內(nèi)。

          jps— 名稱反映了在大多數(shù) UNIX 系統(tǒng)上發(fā)現(xiàn)的 ps 實(shí)用程序 — 告訴我們運(yùn)行 Java 應(yīng)用程序的 JVMID。顧名思義,jps 返回指定機(jī)器上運(yùn)行的所有已發(fā)現(xiàn)的 Java 進(jìn)程的 VMID。如果 jps 沒有發(fā)現(xiàn)進(jìn)程,并不意味著無法附加或研究 Java 進(jìn)程,而只是意味著它并未宣傳自己的可用性。

          如果發(fā)現(xiàn) Java 進(jìn)程,jps 將列出啟用它的命令行。這種區(qū)分 Java 進(jìn)程的方法非常重要,因?yàn)橹灰婕安僮飨到y(tǒng),所有的 Java 進(jìn)程都被統(tǒng)稱為 “java”。在大多數(shù)情況下,VMID 是值得注意的重要數(shù)字。

          使用分析器開始

          使用分析實(shí)用程序開始的最簡單方法是使用一個(gè)如在 demo/jfc/SwingSet2 中發(fā)現(xiàn)的 SwingSet2 演示一樣的演示程序。這樣就可以避免程序作為背景/監(jiān)控程序運(yùn)行時(shí)出現(xiàn)掛起的可能性。當(dāng)您了解工具及其費(fèi)用后,就可以在實(shí)際程序中進(jìn)行試用。

          加載演示應(yīng)用程序后,運(yùn)行 jps 并注意返回的 vmid。為了獲得更好的效果,采用 -Dcom.sun.management.jmxremote 屬性集啟動(dòng) Java 進(jìn)程。如果沒有使用該設(shè)置,部分下列工具收集的部分?jǐn)?shù)據(jù)可能不可用。

          2. jstat (sun.tools.jstat)

          jstat 實(shí)用程序可以用于收集各種各樣不同的統(tǒng)計(jì)數(shù)據(jù)。jstat 統(tǒng)計(jì)數(shù)據(jù)被分類到 “選項(xiàng)” 中,這些選項(xiàng)在命令行中被指定作為第一參數(shù)。對于 JDK 1.6 來說,您可以通過采用命令 -options 運(yùn)行 jstat 查看可用的選項(xiàng)清單。清單 1 中顯示了部分選項(xiàng):


          清單 1. jstat 選項(xiàng)
                      -class            -compiler            -gc            -gccapacity            -gccause            -gcnew            -gcnewcapacity            -gcold            -gcoldcapacity            -gcpermcapacity            -gcutil            -printcompilation            

          實(shí)用程序的 JDK 記錄(參見 參考資料)將告訴您清單 1 中每個(gè)選項(xiàng)返回的內(nèi)容,但是其中大多數(shù)用于收集垃圾的收集器或者其部件的性能信息。-class 選項(xiàng)顯示了加載及未加載的類(使其成為檢測應(yīng)用程序服務(wù)器或代碼中 ClassLoader 泄露的重要實(shí)用程序,且 -compiler-printcompilation 都顯示了有關(guān) Hotspot JIT 編譯程序的信息。

          默認(rèn)情況下,jstat 在您核對信息時(shí)顯示信息。如果您希望每隔一定時(shí)間拍攝快照,請?jiān)?-options 指令后以毫秒為單位指定間隔時(shí)間。jstat 將持續(xù)顯示監(jiān)控進(jìn)程信息的快照。如果您希望 jstat 在終止前進(jìn)行特定數(shù)量的快照,在間隔時(shí)間/時(shí)間值后指定該數(shù)字。

          如果 5756 是幾分鐘前開始的運(yùn)行 SwingSet2 程序的 VMID,那么下列命令將告訴 jstat 每 250 毫秒為 10 個(gè)佚代執(zhí)行一次 gc 快照轉(zhuǎn)儲(chǔ),然后停止:

          jstat -gc 5756 250 10            

          請注意 Sun(現(xiàn)在的 Oracle)保留了在不進(jìn)行任何預(yù)先通知的情況下更改各種選項(xiàng)的輸出甚至是選項(xiàng)本身的權(quán)利。這是使用不受支持實(shí)用程序的缺點(diǎn)。請參看 Javadocs 了解 jstat 輸出中每一列的全部細(xì)節(jié)。

          3. jstack (sun.tools.jstack)

          了解 Java 進(jìn)程及其對應(yīng)的執(zhí)行線程內(nèi)部發(fā)生的情況是一種常見的診斷挑戰(zhàn)。例如,當(dāng)一個(gè)應(yīng)用程序突然停止進(jìn)程時(shí),很明顯出現(xiàn)了資源耗盡,但是僅通過查看代碼無法明確知道何處出現(xiàn)資源耗盡,且為什么會(huì)發(fā)生。

          jstack 是一個(gè)可以返回在應(yīng)用程序上運(yùn)行的各種各樣線程的一個(gè)完整轉(zhuǎn)儲(chǔ)的實(shí)用程序,您可以使用它查明問題。

          采用期望進(jìn)程的 VMID 運(yùn)行 jstack 會(huì)產(chǎn)生一個(gè)堆轉(zhuǎn)儲(chǔ)。就這一點(diǎn)而言,jstack 與在控制臺窗口內(nèi)按 Ctrl-Break 鍵起同樣的作用,在控制臺窗口中,Java 進(jìn)程正在運(yùn)行或調(diào)用 VM 內(nèi)每個(gè) Thread 對象上的 Thread.getAllStackTraces()Thread.dumpStack()jstack 調(diào)用也轉(zhuǎn)儲(chǔ)關(guān)于在 VM 內(nèi)運(yùn)行的非 Java 線程的信息,這些線程作為 Thread 對象并不總是可用的。

          jstack-l 參數(shù)提供了一個(gè)較長的轉(zhuǎn)儲(chǔ),包括關(guān)于每個(gè) Java 線程持有鎖的更多詳細(xì)信息,因此發(fā)現(xiàn)(和 squash)死鎖或可伸縮性 bug 是極其重要的。

          4. jmap (sun.tools.jmap)

          有時(shí),您正在處理的問題是一個(gè)對象泄露,如一個(gè) ArrayList (可能持有成千上萬個(gè)對象)該釋放時(shí)沒有釋放。另一個(gè)更普遍的問題是,看似從不會(huì)壓縮的擴(kuò)展堆,卻有活躍的垃圾收集。

          當(dāng)您努力尋找一個(gè)對象泄露時(shí),在指定時(shí)刻對堆及時(shí)進(jìn)行拍照,然后審查其中內(nèi)容非常有用。jmap 通過對堆拍攝快照來提供該功能的第一部分。然后您可以采用下一部分中描述的 jhat 實(shí)用程序分析堆數(shù)據(jù)。

          與這里描述的其他所有實(shí)用程序一樣,使用 jmap 非常簡單。將 jmap 指向您希望拍快照的 Java 進(jìn)程的 VMID,然后給予它部分參數(shù),用來描述產(chǎn)生的結(jié)果文件。您要傳遞給 jmap 的選項(xiàng)包括轉(zhuǎn)儲(chǔ)文件的名稱以及是否使用一個(gè)文本文件或二進(jìn)制文件。二進(jìn)制文件是最有用的選項(xiàng),但是只有當(dāng)與某一種索引工具 結(jié)合使用時(shí) — 通過十六進(jìn)制值的文本手動(dòng)操作數(shù)百兆字節(jié)不是最好的方法。

          隨意看一下 Java 堆的更多信息,jmap 同樣支持 -histo 選項(xiàng)。-histo 產(chǎn)生一個(gè)對象文本柱狀圖,現(xiàn)在在堆中大量引用,由特定類型消耗的字節(jié)總數(shù)分類。它同樣給出了特定類型的總示例數(shù)量,支持部分原始計(jì)算,并猜測每個(gè)實(shí)例的相對成本。

          不幸的是,jmap 沒有像 jstat 一樣的 period-and-max-count 選項(xiàng),但是將 jmap(或 jmap.main())調(diào)用放入 shell 腳本或其他類的循環(huán),周期性地拍攝快照相對簡單。(事實(shí)上,這是加入 jmap 的一個(gè)好的擴(kuò)展,不管是作為 OpenJDK 本身的源補(bǔ)丁,還是作為其他實(shí)用程序的擴(kuò)展。)

          5. jhat (com.sun.tools.hat.Main)

          將堆轉(zhuǎn)儲(chǔ)至一個(gè)二進(jìn)制文件后,您就可以使用 jhat 分析二進(jìn)制堆轉(zhuǎn)儲(chǔ)文件。jhat 創(chuàng)建一個(gè) HTTP/HTML 服務(wù)器,該服務(wù)器可以在瀏覽器中被瀏覽,提供一個(gè)關(guān)于堆的 object-by-object 視圖,及時(shí)凍結(jié)。根據(jù)對象引用草率處理堆可能會(huì)非常可笑,您可以通過對總體混亂進(jìn)行某種自動(dòng)分析而獲得更好的服務(wù)。幸運(yùn)的是,jhat 支持 OQL 語法進(jìn)行這樣的分析。

          例如,對所有含有超過 100 個(gè)字符的 String 運(yùn)行 OQL 查詢看起來如下:

          select s from java.lang.String s where s.count >= 100            

          結(jié)果作為對象鏈接顯示,然后展示該對象的完整內(nèi)容,字段引用作為可以解除引用的其他鏈接的其他對象。OQL 查詢同樣可以調(diào)用對象的方法,將正則表達(dá)式作為查詢的一部分,并使用內(nèi)置查詢工具。一種查詢工具,referrers() 函數(shù),顯示了引用指定類型對象的所有引用。下面是尋找所有參考 File 對象的查詢:

          select referrers(f) from java.io.File f            

          您可以查找 OQL 的完整語法及其在 jhat 瀏覽器環(huán)境內(nèi) “OQL Help” 頁面上的特性。將 jhat 與 OQL 相結(jié)合是對行為不當(dāng)?shù)亩堰M(jìn)行對象調(diào)查的有效方法。

          結(jié)束語

          當(dāng)您需要近距離觀察 Java 進(jìn)程內(nèi)發(fā)生的事情時(shí),JDK的分析擴(kuò)展會(huì)非常有用。本文中介紹的所有工具都可以從命令行中由其自己使用。它們還可以與 JConsole 或 VisualVM有力地結(jié)合使用。JConsole 和 VisualVM 提供 Java 虛擬機(jī)的總體視圖,jstatjmap 等有針對性的工具支持您對研究進(jìn)行微調(diào)。

          走進(jìn) 5 件事 系列: 編寫腳本。


          參考資料

          學(xué)習(xí)

          本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊舉報(bào)。
          打開APP,閱讀全文并永久保存 查看更多類似文章
          猜你喜歡
          類似文章
          干貨:java之jdk命令行工具詳解。
          JDK的命令行工具
          JDK的幾種分析工具
          性能測試必備監(jiān)控技能jvm之jdk命令行工具篇16
          JVM性能監(jiān)控與如何解決故障
          JVM學(xué)習(xí)(5)-- JVM參數(shù)及分析工具
          更多類似文章 >>
          生活服務(wù)
          分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
          綁定賬號成功
          后續(xù)可登錄賬號暢享VIP特權(quán)!
          如果VIP功能使用有故障,
          可點(diǎn)擊這里聯(lián)系客服!

          聯(lián)系客服