jse經常使用工具

javase 工具指導html

1. 工具、命令指導java

JDK工具和命令能讓開發者處理一些任務,好比, 編譯、運行project, 將文件打包成.JAR文件, 並在.JAR文件上應用安全策略等等。。。。算法

本章節的JDK 工具命令列舉並描述了JDK的工具, 這些JDK工具依據相關功能被分紅下面2個部分。你用到的JDK工具和命令的細節被包含在相應的章節中。docker

2. 主要的工具設計模式

下面的基礎工具命令可讓碼農建立和構建應用:
    2.1 javac:用它和命令的options 讀取class 和 interface的定義而且能夠把這些文件編譯成字節碼和.class文件
    2.2 javap: 反編譯!!可使用javap命令降解一個或多個.class文件。
    2.3 jar 打包、解包工具
    2.4 jcmd 可使用jcmd對正在運行的jvm發送診斷命令的請求。
    2.5 jdb 你可使用jdb和options在java平臺程序中發現並找到bugs。
    2.6 jmap(troubleshooting tool) 可使用jmap打印特定進程在內存中的詳細信息。 這個命令是experimental and unsupported。。。。(試驗性的而且不受支持。。。。那你搞這個工具幹啥!!!???) 常規用法: jmap <options> pid。pid -> jvm進程id,若是jvm進程沒有運行在分離的docker container裏, 須要使用jps 來肯定jvm進程。
    2.7 jstack(troubleshooting tool) 可使用jstack命令打印指定jvm進程中全部java threads 的java 棧跟蹤, (試驗性、不受支持的。。。。)
    2.8 jconsole(monitor tool) 使用jconsole工具開啓一個圖形化控制檯用來監控和管理java應用。Jsonsole使用JVM擴展的指令 針對運行中的JVM進程 提供關於性能和資源(內存、CPU)消耗的狀況。 命令使用方法很簡單, 直接jconsole或者若是知道jvm pid 可以使用jconsole pid,便可彈出監控的Swing窗口。 Jconsole入門: https://docs.oracle.com/javase/8/docs/technotes/guides/management/jconsole.html
    jconsole的Tab:
    概覽:展現關於JVM和被監控資源的概覽信息;
    內存:展現內存的使用狀況
    線程:展現線程的使用狀況
    Classes:展現被加載的全部類的狀況(已加載、已卸載、總計類的個數)
    VM: 展現JVM的信息
    MBeans: 展現MBeans的信息 -> 一個MBean是一個帶有管理特性的java對象, 相思雨JavaBeans組件, 遵循JMX規範的設計模式。一個MBean能夠展現一個設備、應用、或者須要被管理你的任何資源。MBeans暴露一個管理接口,該接口主要包含: 一組可讀或者可寫的屬性;一組可調用的操做;一個自描述信息。這個接口的定義不會改變一個MBean實例的整個生命週期。MBeans 也能夠在特定的預約義事件發生時,發送通知。JMX規範定義了5種類型的MBean: Standard MBeans, Dynamic MBeans, Open MBeans, Model MBeans, MXBeans。數組

    2.9 查看概覽信息
    概覽tab展現了圖標監控信息,包含CPU用法,內存使用狀況,線程數, 被加載到JVM中的類數目。
    2.10 保存圖表數據: 以.CSV文件導出圖表。
    2.11 監控內存消耗:能夠在任什麼時候候, 執行GC。這個圖表展現的是 隨着時間JVM 的內存使用狀況, 包括堆和非堆的內存,還有特殊的內存池。注意:內存池是否可用依賴於當前你所使用的JVM的版本。對於HostSpot Java VM, 內存池中的一系列的gc以下:安全

    Eden Space(heap): 這個池子中的內存, 對大多數對象是初始化的內存分配
    Survivor Space(heap): 這個池子包含的對象是已經在Eden Space經GC後,轉移的內存分配。
    Tenured Generation(heap): 又名老年代, 這個池子包含全部JVM他本身的反射數據, 例如 class 和 method 對象。 Java VM                                 使用class 相關信息做爲全局共享數據, 這個類型的內存池會被分爲只讀和可讀可寫的2個區域。
    Code Cache(non-heap): HotSpot VM 也包含了 'code cache', 它所屬的內存塊被用於編譯和保存native code.oracle

    能夠選擇下拉框,來展現不一樣類型的內存池隨時間消耗內存的狀況, 固然也能夠選擇給定時間內的內存池變化。
    當前內存指標:jvm

        Used: 當前已經佔用你的內存量,包含被全部對象佔用的內存, (可達到 和 不可達到)
        Committed: 保證JVM 可以足夠須要的內存量。這個Committed memory 用量隨時間變化。JVM可能會釋放內存而且committed 內存可能少於在JVM啓動的時候所分配的內存量。committed 內存量老是大於或者等於used 內存使用量。
        Max: JVM 內存管理最大的內存使用量。這個value可能會改變或者未定義的。 若是JVM 試圖增長used 內存量到大於committed 內存量,那麼這樣的內存分配可能會失敗, 儘管used內存量小於或者等max 內存量設置(例如, 當系統虛擬內存不足時)
        GG time: 累計花費在gc上的時間和調用調用gc的次數。這個統計項有行, 每個表明JVM 的gc算法。
    右下角的圖表示堆和非堆的內存消耗狀況。當內存使用量大於JVM 設置的閾值,這個柱狀圖會變成紅色。能夠經過MemoryMXBean屬性設置內存量閾值(話說這個屬性在哪兒???)
    2.12 堆和非堆內存
    JVM管理2類內存:堆和非堆,它們都是在JVM 啓動的時候才建立。
    heap memory:它是運行時的數據區域, 這個區域裏分配的是全部的類實例和數組。這個堆有固定或者變化的內存大小。gc是一個可以回收堆內存對象的自動內存管理系統。ide

    non-heap memory: 非堆內存包含一個方法域,這個方法域會在全部的線程和(用於JVM在內部處理或者優化所必需的)內存之間被共享使用。它存儲每一個類結構, 例如, 一個運行時常量池、域、方法數據和(全部方法和構造器的)代碼。這個方法域在邏輯上屬於heap的一部分, 可是這依賴於JVM實現 -> 一個JVM的實現可能沒有gc功能或者內嵌了gc功能。像heap memory 同樣, 方法域所使用的內存大小多是固定的或者變化的。方法域的內存並不須要是連續的。在非堆裏除了方法域外,JVM 可能還須要額外的內存用來作JVM的內部處理或者優化。好比 JIT(just in time)編譯器,爲了代碼執行高效,須要內存來存儲由JVM編譯的本地機器碼(native machine code).

    2.13 內存池和內存管理者
    內存池和內存管理者是JVM內存管理系統中比較關鍵的一部分。

    內存池就是JVM管理的一個內存區域。JVM 至少有一個內存池, 而且在JVM工做(執行任務)過程當中,可能建立或者移除內存池。內存池能夠屬於堆或者非堆內存。

    內存管理者管理一個或者多個內存池。gc 屬於內存管理者的角色,衆所周知, gc用來回收不可達對象所佔用的內存。JVM 有一個或者多個內存管理者。JVM在工做(執行任務)期間能夠添加或者移除內存管理者。一個內存池能夠被多個內存管理者來管理。

    2.14 垃圾處理(garbage collection)

    gc 就是JVM 要釋放那些再也不被引用的對象所佔用的內存。一般被引用的對象成爲alive(活着),而那些再也不被引用的對象稱爲dead(死翹翹) GC 用來釋放再也不被引用的對象所佔用的內存。被GC用的算法和參數在性能上有戲劇性的效果。

    HotSpot VM 的gc 採用'代式'的GC。 '代式'GC 利用了大多數程序遵循通用規則的監測(我理解的是,根據對象生存長短來決定是否啓用GC), 通用規則以下:
        他們建立了不少'短命'對象,例如, 遍歷器和局部變量(本地變量)
        他們建立了一些'長壽'對象, 例如,高級別的持久化對象。

    '代式'GC 把內存分爲幾個年代, 而且每一個年代被分配一個或者多個內存池。當其中一個年代用完了分配給他的內存容量, JVM會對爆滿的內存池執行一部分GC(也被稱爲最小化回收) -> 回收dead objects佔用的內存。 這個部分GC 一般比全GC(full GC)更快。

    java HotSpot VM 定義了2個年代: 年輕代(有時也稱做 'nursery'(幼兒園....)) 和老年代。年輕代由 一個'Eden space'和2個 'survivor space'組成。 起初,JVM會把全部對象分配給 'Eden space', 同時在 'Eden space' 中的大部分對象都會在這個space中die(死翹翹)。當JVM 執行最小化GC時, JVM 會把留存在 'Eden space'中的對象移動到 'survivor space'中的一個(Survivor space 有2個內存池)。隨着時間的推移,JVM 會把留存在'Survivor space'裏的足夠長時間的對象移動到老年代的'tenured space'中。隨着時間的推移, 老年代也被填滿了, 就會執行比較低效率的full GC, 爲啥full GC 比 partial GC 更慢尼? -> 由於老年代裏的 'tenured space'包含了全部存活的對象。 permanent generation 則包含全部JVM他本身反射性的數據, 請問, 啥是reflective data? -> class 和 method objects.

    若是GC性能遇到瓶頸, 能夠經過調節年代的內存大小來提升GC性能。用JConsole, 能夠經過調整(試驗)GC參數來調查性能指標的靈敏度。欲知詳情, 參考 'Tuning Garbage Collection with the 5.0 HotSpot VM'.

    2.15 監測應用的線程

    OK 開始掃盲Thread這一部分怎麼解讀, 這一部分提供了關於線程使用的信息。

    在線程的圖表裏左下方列出了全部活躍的線程。 能夠在filter 輸入框裏輸入不完整的線程名稱來過濾顯示符合條件的線程。線程列表裏點擊任何一個線程,均可以在右側顯示出具體的線程信息, 線程信息包含: 線程名稱、線程狀態、棧跟蹤(棧路徑)。

    圖表裏顯示了隨時間而變化的活躍線程數目。 圖表中的2條線:
    紅色: 線程數目的最大峯值
    藍色:活躍的線程數目

    線程MXBean 提供了其餘有用的操做, 這些操做並無在線程Tab裏出現,這些操做以下: 

    findMonitorDeadlockedThreads: 檢測是否有線程死鎖。這個操做會返回一個由死鎖線程組成的數組。
    
    getThreadInfo: 返回線程信息。線程信息: 線程名稱、棧跟蹤信息、當前線程在哪一個鎖上阻塞着, 哪一個線程得到鎖, 線程競爭統計。
    
    getThreadCpuTime: 返回給定線程所消耗的CPU時間。

    你能夠用JConsole 裏的tab: MBeans 來獲取這些額外的特徵。 MBeans 裏邊列舉了全部的屬性和操做用來獲取被監測的JVM中的線程信息。欲知更多詳情, 參考 Monitoring and Managing MBeans.

    檢測死鎖線程
    爲了檢測運行的應用是否存在死鎖(例如, 你的應用看起來好像掛掉了), 點擊 '檢測死鎖' 按鈕就能夠檢測是否存在死鎖線程。若是任意的死鎖線程被檢測到, 那麼就會被過濾出來。

    '檢測死鎖'按鈕會檢測死鎖週期,包含對象鎖和juc中的aqs。對JUC中的Lock的監測已經在Java SE6中提供了支持。若是JConsole鏈接Java SE 5.0 VM, 那麼這個檢測死鎖機制僅僅會尋找與對象鎖相關的死鎖檢測。JConsole將不會展現任何與本身相關的同步鎖。

    2.16 檢測類加載

    Tab Class 顯示類加載信息

    圖表展現了隨時間加載的類數目。

    紅線用來標識類加載的總數目(包括被卸載的類)
    藍線用來標識當前加載的類數目。

    底部顯示自JVM啓動以後,類加載的總數目、當前加載的總數目、已卸載的類的總數目。選擇右上角的詳細輸出能夠設置關於類加載的跟蹤的冗餘輸出

    2.17 總覽VM概要

    VM summary Tab 提供了JVM 的概覽信息。

        概述

            運行時間(Uptime): 從JVM啓動開始, 運行的總時間

            CUP處理時間(Process CPU Time); 從JVM啓動開始, 它消耗的總的CPU time。

            總編譯時間(Total Compile Time): JIT(just in time)花費的總時間。JVM 決定何時能夠進行JIT 編譯。HotSpot VM 使用了兼容的編譯策略, VM會在HotSpot VM中使用標準的解析器發佈應用, 在應用運行的時候, HotSpot VM 分析代碼檢測性能瓶頸, 或者 '熱點'。

        線程

            活躍線程(live threads): 當前活躍的守護線程數目+ 非守護線程數目

            峯值(Peak): 自JVM啓動以來, 最多的線程活躍數目

            守護線程(daemon threads): 當前活躍的守護線程

            總線程數目(Total threads started): 自JVM 啓動以來, 總共啓動的線程數目, 包含守護線程、非守護線程、終止線程

        類

            當前加載的類(current loaded classes): 當前被加載到內存中的類數目

            總共加載的類(Total classes loaded):自JVM 啓動之後, 總共被加載的類數目, 包含已經陸續被卸載的類

            已被卸載的類(Total classes unloaded): 自JVM 啓動之後, 被卸載的類數目

        內存

            當前堆大小(current heap size): 當前對佔用內存量,以kb計量

            提交的內存大小(Committed memory): 被分配使用的總的內存量

            最大堆內存大小(Maximum heap size): 堆可以使用的最大的內存量,以kb計量

            即將被kill掉的對象(Objects pending for finalization): 即將被kill掉的對象

            垃圾回收(Garbage collection): 關於垃圾回收的信息, 包含垃圾回收的名字,執行垃圾回收的次數, 執行GC總時間

        操做系統

            總的物理內存(Total physical memory): 操做系統的物理內存

            空閒的物理內存(free physical memory): 操做系統中空閒的內存大小

            提交的虛擬內存(Committed virtual memory):保證當前java 進程運行的虛擬內存。

        其餘信息

            VM 參數(VM arguments): 應用程序傳遞給JVM 的輸入參數, 不包含main 方法參數。

            類路徑(class path): 被系統的class loader使用的類路徑,classpath 衆所周知, 用來搜索類文件的路徑

            庫路徑(library path): 加載庫的時候要搜索的路徑列表

            啓動類路。徑(boot class path);啓動類路徑, 啓動類加載器會用到這些啓動類的路徑, 即 啓動類加載器會在啓動類(庫)路徑里加載類文件。


    2.18 監控並管理MBeans

    點開Tab 中的MBeans,這裏邊包含了關於全部以通用方式註冊到MBean Server中的信息, 在這裏能夠獲取完整的MXBean 基礎信息, 包含在其餘Tab中不可見的東東。 除此以外, 你能夠監控並管理應用的MBeans。

    左側數列出了當前運行的全部的MBean. 當你選擇其中一個MBean時, MBeanInfo 和他的MBean 描述符等詳細信息都被展現在右側, 而且任何屬性、操做或者通知都會出如今每一個MBean下。

    全部平臺級別的MBeans和它們的各類操做、屬性均可以用JConsole 裏的MBean來獲取。

3. 最受歡迎的java監控工具則是JProfiler.

相關文章
相關標籤/搜索