<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          JDK 14 里的調(diào)試神器了解一下?

          共 4139字,需瀏覽 9分鐘

           ·

          2020-07-27 19:22


          點擊上方藍色“程序猿DD”,選擇“設為星標”

          回復“資源”獲取獨家整理的學習資料!

          來源 |?8rr.co/z4R2
          jcmd是JDK自帶的調(diào)試工具,具有非常強大的功能。jcmd是JDK7中正式引入的,有了jcmd,完全可以替換很多常用的其他工具,比如jstak和jmap。
          jcmd可以將具體的診斷命令發(fā)送給JVM。為了安全起見,使用jcmd的用戶必須跟運行的java程序具有同樣的用戶和用戶組。
          jcmd的調(diào)試命令有很多種,每一種調(diào)試命令又有自己的參數(shù)。
          本文將會結合具體的例子詳細講解jcmd的使用。


          jcmd的語法
          jcmd的語法比較簡單:
          jcmd [pid | main-class] command... | PerfCounter.print | -f filename
          jcmd [-l]
          jcmd -h
          pid和main-class是二選一:
          其中pid表示要發(fā)送診斷命令的java進程id。
          也可以指定main-class,表示要發(fā)送診斷命令給運行該main-class的java進程。
          command表示可以在jcmd中運行的命令,我們看下jcmd支持哪些命令:
          ./jcmd 93989 help93989:The following commands are available:Compiler.CodeHeap_AnalyticsCompiler.codecacheCompiler.codelistCompiler.directives_addCompiler.directives_clearCompiler.directives_printCompiler.directives_removeCompiler.queueGC.class_histogramGC.class_statsGC.finalizer_infoGC.heap_dumpGC.heap_infoGC.runGC.run_finalizationJFR.checkJFR.configureJFR.dumpJFR.startJFR.stopJVMTI.agent_loadJVMTI.data_dumpManagementAgent.startManagementAgent.start_localManagementAgent.statusManagementAgent.stopThread.printVM.class_hierarchyVM.classloader_statsVM.classloadersVM.command_lineVM.dynlibsVM.eventsVM.flagsVM.infoVM.logVM.metaspaceVM.native_memoryVM.print_touched_methodsVM.set_flagVM.stringtableVM.symboltableVM.system_propertiesVM.systemdictionaryVM.uptimeVM.versionhelp
          Perfcounter.print表示要打印java進程暴露的performance counters。


          • -f filename表示從文本文件中讀取要運行的命令。

          • -l 列出不是運行在docker中JVM。

          • -h 表示幫助。

          下面我們舉幾個常用的例子。


          列出運行的JVM
          ./jcmd -l98109 jdk.jcmd/sun.tools.jcmd.JCmd -l
          通過使用jcmd -l可以列出所有正在運行的JVM進程。跟jps是一樣的。
          打印stack信息
          使用jcmd pid Thread.print -l可以打印出java程序的stack信息。其中-l表示輸出java.util.concurrent的lock信息。
          下面看個簡單的例子:

          ./jcmd 93989 Thread.print -l
          Full thread dump Java HotSpot(TM) 64-Bit Server VM (14.0.1+7 mixed mode, sharing):
          Threads class SMR info:_java_thread_list=0x00007fbeb1c4cb10, length=12, elements={0x00007fbeb282a800, 0x00007fbeb282d800, 0x00007fbeb282e800, 0x00007fbeb2830800,0x00007fbeb2831800, 0x00007fbeb2832000, 0x00007fbeb2833000, 0x00007fbeb3831000,0x00007fbeb3822000, 0x00007fbeb3174000, 0x00007fbeb3815000, 0x00007fbeb226f800}
          "Reference Handler" #2 daemon prio=10 os_prio=31 cpu=0.64ms elapsed=8996.59s tid=0x00007fbeb282a800 nid=0x4703 waiting on condition [0x000070000440d000] java.lang.Thread.State: RUNNABLE at java.lang.ref.Reference.waitForReferencePendingList([email protected]/Native Method) at java.lang.ref.Reference.processPendingReferences([email protected]/Reference.java:241) at java.lang.ref.Reference$ReferenceHandler.run([email protected]/Reference.java:213)
          Locked ownable synchronizers:??-?None
          打印heap info
          使用jcmd pid GC.heap_info可以獲得heap info。
          ./jcmd 93989 GC.heap_dump heap_dump.out93989:Dumping heap to heap_dump.out ...Heap dump file created [27727979 bytes in 0.643 secs]
          打印heap dump
          如果想知道heap里面到底有什么,則可以通過下面的命令將heap dump出來:
          ./jcmd 93989 GC.heap_dump heap_dump.out93989:Dumping heap to heap_dump.out ...Heap dump file created [27727979 bytes in 0.643 secs]
          heap dump需要傳入一個文件名,存放dump出來的信息。
          統(tǒng)計heap使用情況
          有時候我們需要統(tǒng)計一下heap中各個對象的使用情況,則可以下面方法:
          ./jcmd 93989 GC.class_histogram
          93989: num #instances #bytes class name (module)------------------------------------------------------- 1: 25826 11748304 [B (java.base@14.0.1) 2: 2233 1971800 [I (java.base@14.0.1) 3: 5154 614928 java.lang.Class (java.base@14.0.1) 4: 24757 594168 java.lang.String (java.base@14.0.1) 5: 4491 439432 [Ljava.lang.Object; (java.base@14.0.1) 6: 13177 421664 java.util.concurrent.ConcurrentHashMap$Node (java.base@14.0.1) 7: 5025 160800 java.util.HashMap$Node (java.base@14.0.1) 8: 8793 140688 java.lang.Object (java.base@14.0.1)???9:???????????212?????????103584??[Ljava.util.concurrent.ConcurrentHashMap$Node;?(java.base@14.0.1)
          上面的結果非常有用,在一些性能調(diào)試方法可以起到意想不到的作用。


          JFR功能
          jcmd還支持jfr功能。JFR的全稱叫做Java Flight Recorder。你可以將其看做是JVM中一些事件的記錄器。
          jcmd還有很多其他的功能,大家可以多用多探索。

          往期推薦

          有理有據(jù):一篇來自前端同學對后端接口的吐槽!

          面試:如何決定使用 HashMap 還是 TreeMap?

          面試:一個Java字符串到底有多少個字符?

          后端開發(fā)必知必學的 Linux 命令行大全

          揚言要干掉 RESTful API 的 GraphQL 是什么鬼?


          掃一掃,關注我

          一起學習,一起進步

          瀏覽 50
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  精品一区二区久久久久久久网站 | 就要看日逼网站 | 综合中文字幕 | www视频免费看 | 国产激情123区 |