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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java虚拟机常用命令工具

發布時間:2023/12/2 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java虚拟机常用命令工具 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

java虛擬機常用命令工具

  • 博客分類:
  • 虛擬機
虛擬機jvmjava? 一、概述???
??????? 程序運行中經常會遇到各種問題,定位問題時通常需要綜合各種信息,如系統日志、堆dump文件、線程dump文件、GC日志等。通過虛擬機監控和診斷工具可以幫忙我們快速獲取、分析需要的數據,進而提高問題解決速度。 本文將介紹虛擬機常用監控和問題診斷命令工具的使用方法,主要包含以下工具:
jps顯示系統中所有Hotspot虛擬機進程
jstat收集Hotspot虛擬機各方面運行數據
jstack顯示虛擬機的線程棧信息
jinfo顯示虛擬機的配置信息
jmap用于生成虛擬機的內存快照信息

以上工具的官方文檔地址: http://docs.oracle.com/javase/1.5.0/docs/tooldocs/
圖形化工具如jconsole,jvisualvm將另文介紹。

二、示例代碼
為方便大家使用各工具進行實戰,提供樣例代碼如下:

Java代碼 ?
  • package?com.leanworld;??
  • ??
  • import?java.util.ArrayList;??
  • import?java.util.List;??
  • ??
  • /**?
  • ?*?虛擬機常用工具使用示例代碼?啟動參數:?-Xmn10m?-Xms40m?-Xmx40m?
  • ?*??
  • ?*?@author?learnworld?2012-1-30?下午01:37:14?
  • ?*/??
  • public?class?JVMTools?{??
  • ??
  • ????public?static?void?createList(int?count)?throws?InterruptedException?{??
  • ????????for?(int?j?=?0;?j?<?count;?j++)?{??
  • ????????????List<_1MObject>?list?=?new?ArrayList<_1MObject>();??
  • ????????????Thread.sleep(100);??
  • ????????????list.add(new?_1MObject());??
  • ????????}??
  • ????}??
  • ??
  • ????public?static?void?main(String[]?args)?throws?InterruptedException?{??
  • ????????createList(5000);??
  • ????}??
  • ??
  • }??
  • ??
  • /**?
  • ?*?一個大約1M的對象?
  • ?*/??
  • class?_1MObject?{??
  • ??
  • ????public?byte[]?_1M?=?new?byte[1024?*?1024];??
  • }??


  • 三、工具介紹
    1.? jps
    JVM Process Status Tool,該命令用于列出正在運行的虛擬機進程,顯示main類的名稱和虛擬機進程id。該命令受當前用戶的訪問權限影響,比如linux下非root用戶只列出當前用戶啟動的虛擬機進程。

    命令格式:
    jps? [options]? [hostid]

    執行示例:
    $ jps -l
    3733 sun.tools.jps.Jps
    3700 com.leanworld.JVMTools
    com.leanworld.JVMTools即為上面的示例代碼執行類。

    常用參數:
    -l輸出主類全名
    -v輸出虛擬機進程啟動的jvm參數
    -m輸出啟動時傳遞給main函數的參數


    2.? jstat
    JVM Statistics Monitoring Tool,用于監控各種運行狀態信息的命令。在只有文本控制臺的環境中(如企業中的生產環境),該工具非常有用。 可以用來顯示系統中類裝載、垃圾回收、運行期編譯狀況等運行數據。

    命令格式:
    jstat [ generalOption | outputOptions vmid [interval[s|ms] [count]] ]
    vmid表示虛擬機唯一標識符,如果是本地虛擬機進程,與LVMID一致,通常為本地虛擬機進程號。 interval表示查詢間隔時間,count表示查詢次數。如果省略interval和count參數,表示查詢一次。

    執行示例:
    $ jstat -gcutil 3700 500 4
    ? S0???? S1???? E????? O????? P???? YGC???? YGCT??? FGC??? FGCT???? GCT??
    50.00?? 0.00? 60.78?? 0.50? 12.76??? 214??? 0.049???? 0??? 0.000??? 0.049
    ? 0.00? 25.00? 20.27?? 0.50? 12.76??? 215??? 0.049???? 0??? 0.000??? 0.049
    ? 0.00? 25.00? 70.91?? 0.50? 12.76??? 215??? 0.049???? 0??? 0.000??? 0.049
    50.00?? 0.00? 20.27?? 0.50? 12.76??? 216??? 0.049???? 0??? 0.000??? 0.049

    S0和S1表示Survivor0和Survivor1,E表示新生代Eden,O表示老年代Old,P表示持久代Permanent,以上各參數值表示已使用空間占比。 YGC表示young gc次數,YGCT表示young gc總耗時。FGC表示Full gc次數,FGCT表示full gc總耗時。GCT表示所有gc總耗時時間。

    常用參數:
    class類裝載相關信息.
    compilerJIT編譯器編譯過的方法、耗時等.
    gcjava堆信息和垃圾回收狀況.
    gccapacity關注java堆各個區的最大和最小空間.
    gccause類似gcutil,額外輸出導致上一次gc的原因.
    gcnew新生代gc狀況.
    gcnewcapacity關注新生代gc使用的最大和最小空間.
    gcold老年代gc狀況.
    gcoldcapacity關注老年代gc使用的最大和最小空間.
    gcpermcapacity關注持久代gc使用的最大和最小空間.
    gcutil關注已使用空間占總空間比例.
    printcompilation輸出已經被JIT編譯的方法.


    3.? jstack
    Stack Trace for Java,用于生成虛擬機當前的線程快照信息,包含每一條線程的堆棧信息。該命令通常用于定位線程停頓原因,當出現線程停頓時,可通過stack查看每個線程的堆棧信息,進而分析停頓原因。
    命令格式:
    jstack [ option ] pid

    執行示例:
    $ jstack 3700
    2012-01-30 16:36:05
    Full thread dump Java HotSpot(TM) Server VM (17.0-b16 mixed mode):

    "Attach Listener" daemon prio=10 tid=0xaca16c00 nid=0x1384 waiting on condition [0x00000000]
    ?? java.lang.Thread.State: RUNNABLE

    "Low Memory Detector" daemon prio=10 tid=0xaca00c00 nid=0x1366 runnable [0x00000000]
    ?? java.lang.Thread.State: RUNNABLE

    "CompilerThread1" daemon prio=10 tid=0x08e58800 nid=0x1365 waiting on condition [0x00000000]
    ?? java.lang.Thread.State: RUNNABLE

    "CompilerThread0" daemon prio=10 tid=0x08e56800 nid=0x1364 waiting on condition [0x00000000]
    ?? java.lang.Thread.State: RUNNABLE

    "Signal Dispatcher" daemon prio=10 tid=0x08e54c00 nid=0x1363 runnable [0x00000000]
    ?? java.lang.Thread.State: RUNNABLE

    "Finalizer" daemon prio=10 tid=0x08e39000 nid=0x1361 in Object.wait() [0xac943000]
    ?? java.lang.Thread.State: WAITING (on object monitor)
    at java.lang.Object.wait(Native Method)
    - waiting on <0xb10e0230> (a java.lang.ref.ReferenceQueue$Lock)
    at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:118)
    - locked <0xb10e0230> (a java.lang.ref.ReferenceQueue$Lock)
    at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:134)
    at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:159)

    "Reference Handler" daemon prio=10 tid=0x08e34400 nid=0x1360 in Object.wait() [0xacb94000]
    ?? java.lang.Thread.State: WAITING (on object monitor)
    at java.lang.Object.wait(Native Method)
    - waiting on <0xb10e30d0> (a java.lang.ref.Reference$Lock)
    at java.lang.Object.wait(Object.java:485)
    at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:116)
    - locked <0xb10e30d0> (a java.lang.ref.Reference$Lock)

    "main" prio=10 tid=0x08d7bc00 nid=0x135a waiting on condition [0xb6a8a000]
    ?? java.lang.Thread.State: TIMED_WAITING (sleeping)
    at java.lang.Thread.sleep(Native Method)
    at com.leanworld.JVMTools.createList(JVMTools.java:23)
    at com.leanworld.JVMTools.main(JVMTools.java:29)

    "VM Thread" prio=10 tid=0x08e31c00 nid=0x135f runnable

    "GC task thread#0 (ParallelGC)" prio=10 tid=0x08d83800 nid=0x135b runnable

    "GC task thread#1 (ParallelGC)" prio=10 tid=0x08d85000 nid=0x135c runnable

    "GC task thread#2 (ParallelGC)" prio=10 tid=0x08d86400 nid=0x135d runnable

    "GC task thread#3 (ParallelGC)" prio=10 tid=0x08d87c00 nid=0x135e runnable

    "VM Periodic Task Thread" prio=10 tid=0xaca02c00 nid=0x1367 waiting on condition

    JNI global references: 854
    通過輸出信息可以看出當前main線程處于TIMED_WAITING狀態,因為執行到示例代碼中Thread.sleep(100);這行的緣故。

    常用參數:
    -l除堆棧外,顯示鎖的附加信息
    -F當請求不被響應時,強制輸出線程堆棧
    -m混合模式,打印java和本地C++調用的堆棧信息


    4. jinfo
    Configuration Info for Java,用于查看和修改虛擬機的各項參數信息。
    命令格式:
    jinfo [ option ] pid

    執行示例:
    $jinfo 3700
    Attaching to process ID 5081, please wait...
    Debugger attached successfully.
    Server compiler detected.
    JVM version is 17.0-b16
    Java System Properties:

    java.runtime.name = Java(TM) SE Runtime Environment
    sun.boot.library.path = /home/learnworld/software/jdk1.6.0_21/jre/lib/i386
    java.vm.version = 17.0-b16
    java.vm.vendor = Sun Microsystems Inc.
    java.vendor.url = http://java.sun.com/
    path.separator = :
    java.vm.name = Java HotSpot(TM) Server VM
    file.encoding.pkg = sun.io
    sun.java.launcher = SUN_STANDARD
    user.country = CN
    sun.os.patch.level = unknown
    java.vm.specification.name = Java Virtual Machine Specification
    user.dir = /home/learnworld/workspace/concurrency
    java.runtime.version = 1.6.0_21-b06
    java.awt.graphicsenv = sun.awt.X11GraphicsEnvironment
    java.endorsed.dirs = /home/learnworld/software/jdk1.6.0_21/jre/lib/endorsed
    os.arch = i386
    java.io.tmpdir = /tmp
    line.separator =

    ...

    VM Flags:
    -Xmn10m -Xms40m -Xmx40m -Dfile.encoding=GBK -Xbootclasspath:/home/learnworld/software/jdk1.6.0_21/lib/tools.jar:/home/learnworld/software/jdk1.6.0_21/lib/sa-jdi.jar:/home/learnworld/software/jdk1.6.0_21/lib/jconsole.jar:/home/learnworld/software/jdk1.6.0_21/lib/htmlconverter.jar:/home/learnworld/software/jdk1.6.0_21/lib/dt.jar:/home/learnworld/software/jdk1.6.0_21/jre/lib/rt.jar:/home/learnworld/software/jdk1.6.0_21/jre/lib/resources.jar:/home/learnworld/software/jdk1.6.0_21/jre/lib/plugin.jar:/home/learnworld/software/jdk1.6.0_21/jre/lib/management-agent.jar:/home/learnworld/software/jdk1.6.0_21/jre/lib/jsse.jar:/home/learnworld/software/jdk1.6.0_21/jre/lib/jce.jar:/home/learnworld/software/jdk1.6.0_21/jre/lib/javaws.jar:/home/learnworld/software/jdk1.6.0_21/jre/lib/deploy.jar:/home/learnworld/software/jdk1.6.0_21/jre/lib/charsets.jar:/home/learnworld/software/jdk1.6.0_21/jre/lib/alt-rt.jar
    可以看出,該命令可以方便我們查找需要的虛擬機信息,包含System.getProperties()信息。

    常用參數:
    -flag name打印虛擬機該參數對應的值.
    -flag [+\-]name使該參數生效或失效.
    -flag name=value修改相應參數的值.
    -flags打印傳給jvm的參數值.
    -sysprops打印System.getProperties()信息.


    5. jmap
    Memory Map for Java,可以產生堆dump文件,查詢堆和持久代的詳細信息等。
    命令格式:
    jmap [ option ] pid

    執行示例:
    $ jmap -dump:format=b,file=dump.tmp 3700
    Dumping heap to /home/learnworld/dump.tmp ...
    Heap dump file created
    上面這個命令生成了dump.tmp這個dump文件。生成的dump文件可以使用Eclipse Memory Analyzer/jhat等工具進行分析。

    $ jmap -permstat 3700
    Attaching to process ID 3700, please wait...
    Debugger attached successfully.
    Server compiler detected.
    JVM version is 17.0-b16
    1355 intern Strings occupying 183024 bytes.
    finding class loader instances ..Finding object size using Printezis bits and skipping over...
    done.
    computing per loader stat ..done.
    please wait.. computing liveness....done.
    class_loader classes bytes parent_loader alive? type

    <bootstrap> 320 1437208 ? null? live <internal>
    0xb1170250 10 77120 0xb11706b8 live sun/misc/Launcher$AppClassLoader@0xad34eb70
    0xb11706b8 0 0 ? null? live sun/misc/Launcher$ExtClassLoader@0xad303d40

    total = 3 330 1514328 ??? N/A??? alive=3, dead=0 ??? N/A

    常用參數:
    -dump生成堆dump文件,格式為: -dump:[live,]format=b,file=<filename>
    -heap顯示java堆的詳細信息,包括垃圾回收期、堆配置和分代信息等
    -histo顯示堆中對象的統計信息,包括類名稱,對應的實例數量和總容量
    -permstat統計持久代中各ClassLoader的統計信息。


    四、遇到的問題
    我的操作系統為ubuntu10.10,初次使用jinfo和jmap時出現以下錯誤:
    引用 Attaching to process ID 3538, please wait...
    Error attaching to process: sun.jvm.hotspot.debugger.DebuggerException: Can't attach to the process
    解決方法:
    1. echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope
    該方法在下次重啟前有效。

    2. 永久有效方法
    sudo vi /etc/sysctl.d/10-ptrace.conf
    編輯下面這行:
    kernel.yama.ptrace_scope = 1
    修改為:
    kernel.yama.ptrace_scope = 0
    重啟系統,使修改生效。
    該bug詳細信息請參考官方文檔: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7050524

    總結

    以上是生活随笔為你收集整理的java虚拟机常用命令工具的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。