1. 程式人生 > 實用技巧 >JVM 學習筆記記錄

JVM 學習筆記記錄

JVM 學習筆記記錄

Sun JDK 監控和故障處理工具

名稱 主要作用
jps JVM Process Status Tool, 顯示指定系統內所有的HotSpot虛擬機器程序
jstat JVM Statistics Moitoring Tool,用於收集HotSpot虛擬機器各方面的執行資料
jinfo Configuration info for java,顯示虛擬機器配置資訊
jmap Memory Map for java,生成虛擬機器的記憶體轉儲快照(heapdump檔案)
jhat JVM Heap Dump Browser,用於分析heapdump檔案,它會建立一個HTTP/HTML伺服器,讓使用者可以在瀏覽器上檢視分析結果
jstack Stack Trace for java,顯示虛擬機器的執行緒快照

常用命令:

1. jps -l 查詢LVMID,及主類的名稱

    C:\Users\Harry>jps -l
    11856 com.ssm.common.jvm.JvmTest
    14368 com.ddc.template.TemplateApplication
    16848
    19664
    6640 org.jetbrains.jps.cmdline.Launcher
    7732 sun.tools.jps.Jps
    2168 org.apache.zookeeper.server.quorum.QuorumPeerMain

2. jps -v 輸出虛擬機器程序引數

    C:\Users\Harry>jps -v
    11856 JvmTest -agentlib:jdwp=transport=dt_socket,suspend=y,address=localhost:49232 -verbose:gc -Xms20M -Xmx20M -Xmn10M -XX:+PrintGCDetails -XX:SurvivorRatio=8 -Dfile.encoding=utf8
    
3. jstat -gc 11856 250 5 每250毫秒查詢一次程序11856垃圾收集情況狀況,一共查詢5次

    C:\Users\Harry>jstat -gc 11856 250 20
     S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT
    1024.0 1024.0  0.0    0.0    8192.0   7619.8   10240.0      0.0     4480.0 780.5  384.0   75.8       0    0.000   0      0.000    0.000
    1024.0 1024.0  0.0    0.0    8192.0   7619.8   10240.0      0.0     4480.0 780.5  384.0   75.8       0    0.000   0      0.000    0.000
    1024.0 1024.0  0.0    0.0    8192.0   7619.8   10240.0      0.0     4480.0 780.5  384.0   75.8       0    0.000   0      0.000    0.000
    1024.0 1024.0  0.0    0.0    8192.0   7619.8   10240.0      0.0     4480.0 780.5  384.0   75.8       0    0.000   0      0.000    0.000
    1024.0 1024.0  0.0    0.0    8192.0   7619.8   10240.0      0.0     4480.0 780.5  384.0   75.8       0    0.000   0      0.000    0.000
    
4. jstat -gc 11856 只查詢一次

    C:\Users\Harry>jstat -gc 11856
     S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT
    1024.0 1024.0  0.0    0.0    8192.0   7619.8   10240.0      0.0     4480.0 780.5  384.0   75.8       0    0.000   0      0.000    0.000

5. jstat -gcutil 11856 查詢各JVM記憶體使用百分比
   
    C:\Users\Harry>jstat -gcutil 11856
      S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT
      0.00   0.00  93.01   0.00  17.42  19.75      0    0.000     0    0.000    0.000

6. jstat -gcnew 11856 查詢新生代GC狀況
   
    C:\Users\Harry>jstat -gcnew 11856
     S0C    S1C    S0U    S1U   TT MTT  DSS      EC       EU     YGC     YGCT
    1024.0 1024.0    0.0    0.0 15  15    0.0   8192.0   7619.8      0    0.000

7. jstat -gcold 11856 查詢老年代GC狀況
   
    C:\Users\Harry>jstat -gcold 11856
       MC       MU      CCSC     CCSU       OC          OU       YGC    FGC    FGCT     GCT
      4480.0    780.5    384.0     75.8     10240.0         0.0      0     0    0.000    0.000

8. jinfo -flag CMSInitiatingOccupancyFraction 11856 查詢JVM引數的值
    
    C:\Users\Harry>jinfo -flag CMSInitiatingOccupancyFraction 11856
    -XX:CMSInitiatingOccupancyFraction=-1

9. jinfo -sysprops 11856 

可以把System.getProperties()資訊打印出來
    C:\Users\Harry>jinfo -sysprops 11856
    Attaching to process ID 11856, please wait...
    Debugger attached successfully.
    Server compiler detected.
    JVM version is 25.92-b14
    java.runtime.name = Java(TM) SE Runtime Environment
    java.vm.version = 25.92-b14
    ......

10. jmap -dump:format=b,file=eclipse.bin 11856 生成java堆轉儲快照
    
    C:\Users\Harry>jmap -dump:format=b,file=eclipse.bin 11856
    Dumping heap to C:\Users\Harry\eclipse.bin ...
    Heap dump file created

11. jhat eclipse.bin 分析dump檔案,瀏覽器中訪問http://localhost:7000
    
    C:\Users\Harry>jhat eclipse.bin
    Reading from eclipse.bin...
    Dump file created Sun Jul 22 11:55:08 CST 2018
    Snapshot read, resolving...
    Resolving 11914 objects...
    Chasing references, expect 2 dots..
    Eliminating duplicate references..
    Snapshot resolved.
    Started HTTP server on port 7000
    Server is ready.

11. jmap -heap 11856 檢視堆中jvm引數情況
    
	Attaching to process ID 11856, please wait...
	Debugger attached successfully.
	Server compiler detected.
	JVM version is 25.131-b11

	using thread-local object allocation.
	Parallel GC with 8 thread(s)

	Heap Configuration:
		 MinHeapFreeRatio         = 0
		 MaxHeapFreeRatio         = 100
		 MaxHeapSize              = 1073741824 (1024.0MB)
		 NewSize                  = 357564416 (341.0MB)
		 MaxNewSize               = 357564416 (341.0MB)
		 OldSize                  = 716177408 (683.0MB)
		 NewRatio                 = 2
		 SurvivorRatio            = 8
		 MetaspaceSize            = 21807104 (20.796875MB)
		 CompressedClassSpaceSize = 1073741824 (1024.0MB)
		 MaxMetaspaceSize         = 17592186044415 MB
		 G1HeapRegionSize         = 0 (0.0MB)

	Heap Usage:
	PS Young Generation
	Eden Space:
		 capacity = 310902784 (296.5MB)
		 used     = 90540600 (86.34624481201172MB)
		 free     = 220362184 (210.15375518798828MB)
		 29.121836361555385% used
	From Space:
		 capacity = 23068672 (22.0MB)
		 used     = 11927744 (11.37518310546875MB)
		 free     = 11140928 (10.62481689453125MB)
		 51.70537775213068% used
	To Space:
		 capacity = 22544384 (21.5MB)
		 used     = 0 (0.0MB)
		 free     = 22544384 (21.5MB)
		 0.0% used
	PS Old Generation
		 capacity = 716177408 (683.0MB)
		 used     = 82475416 (78.6546859741211MB)
		 free     = 633701992 (604.3453140258789MB)
		 11.516059439842035% used
    
13. jmap -dump:live,format=b,file=heap.hprof 11856
    將heap.hprof傳輸出來到window電腦上使用mat工具分析。

14. jhat -heap 11856 顯示java堆詳細資訊,如使用哪種回收器、引數配置、分代狀況等,只在linux平臺才可以測試

15. jstack -l 11856 除堆疊外,顯示鎖的附加資訊
    
    "Finalizer" #3 daemon prio=8 os_prio=1 tid=0x00000000152da800 nid=0x18b4 in Object.wait() [0x000000001664e000]
       java.lang.Thread.State: WAITING (on object monitor)
            at java.lang.Object.wait(Native Method)
            - waiting on <0x00000000ff608ee0> (a java.lang.ref.ReferenceQueue$Lock)
            at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:143)
            - locked <0x00000000ff608ee0> (a java.lang.ref.ReferenceQueue$Lock)
            at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:164)
            at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:209)
    
       Locked ownable synchronizers:
            - None
    
    "Reference Handler" #2 daemon prio=10 os_prio=2 tid=0x00000000152b9000 nid=0x444c in Object.wait() [0x000000001654f000]
       java.lang.Thread.State: WAITING (on object monitor)
            at java.lang.Object.wait(Native Method)
            - waiting on <0x00000000ff606b50> (a java.lang.ref.Reference$Lock)
            at java.lang.Object.wait(Object.java:502)
            at java.lang.ref.Reference.tryHandlePending(Reference.java:191)
            - locked <0x00000000ff606b50> (a java.lang.ref.Reference$Lock)
            at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:153)
    
       Locked ownable synchronizers:
            - None

本文由部落格群發一文多發等運營工具平臺 OpenWrite 釋出