JVM中jmap、jhat、jstack 使用

文章目录

jmap

  • jmap(memory map for java) 该命令用于生成java 堆转储快照,配置-XX:+HeapDumpOnOutOfMemeryError 发生OOM时生成快照,-XX:+HeapDumpOnCtrlBreak 按ctrl+break 生产快照,linux 下使用 kill -3 pid 退出命令“吓一吓”虚拟机,也会生成dump 文件。
  • jmap 除获取堆转储快照,还可以查询 finalize 执行队列、java堆和方法区详细信息(空间使用率,使用GC垃圾回收器等)
  • 命令

    jmap [option] pid

  • dump

    生成java 转储快照,格式 -dump:[live,] format=b, file=, live 是否只dump存储对象

    [root@guanzc-206 jar]# jmap -dump:format=b,file=dumpName.bin 38820  -F 
    Dumping heap to /root/jar/dumpName ...
    
  • finalizerinfo

    在F-Queue 中等待Finalizer线程执行 finalize 方法的对象,仅用于window 无效

    [root@guanzc-206 jar]# jmap -finalizerinfo 39649
    Attaching to process ID 39649, please wait...
    Debugger attached successfully.
    Server compiler detected.
    JVM version is 25.131-b11
    Number of objects pending for finalization: 0
    [root@guanzc-206 jar]# 
    
  • heap

    堆的详细信息,垃圾回收器、参数配置、分代状况等。window无效

    [root@guanzc-206 jar]# jmap -heap 39649
    Attaching to process ID 39649, please wait...
    Debugger attached successfully.
    Server compiler detected.
    JVM version is 25.131-b11
    
    using thread-local object allocation.
    Mark Sweep Compact GC  #标记回收
    
    Heap Configuration:  #堆配置
       MinHeapFreeRatio         = 40   #-XX:MinHeapFreeRatio设置JVM堆最小空闲比率  
       MaxHeapFreeRatio         = 70 #-XX:MaxHeapFreeRatio设置JVM堆最大空闲比率  
       MaxHeapSize              = 478150656 (456.0MB)  #-XX:MaxHeapSize=设置JVM堆的最大大小
       NewSize                  = 10485760 (10.0MB)  #-XX:NewSize=设置JVM堆的‘新生代’的默认大小
       MaxNewSize               = 159383552 (152.0MB) #-XX:MaxNewSize=设置JVM堆的‘新生代’的最大大小
       OldSize                  = 20971520 (20.0MB)  #-XX:OldSize=设置JVM堆的‘老生代’的大小
       NewRatio                 = 2  #-XX:NewRatio=:‘新生代’和‘老生代’的大小比率
       SurvivorRatio            = 8 #-XX:SurvivorRatio=设置年轻代中Eden区与Survivor区的大小比值
       MetaspaceSize            = 21807104 (20.796875MB)  # -XX:+MetaspaceSize= 元空间大小
       CompressedClassSpaceSize = 1073741824 (1024.0MB)  # 压缩类空间大侠
    Heap Usage:
       MaxMetaspaceSize         = 17592186044415 MB # -XX:+MaxMetaspaceSize= 最大元空间
       G1HeapRegionSize         = 0 (0.0MB) # G1在堆中分区大小,垃圾回收用
    
    Heap Usage:
    New Generation (Eden + 1 Survivor Space):
       capacity = 9502720 (9.0625MB)
       used     = 1858248 (1.7721633911132812MB)
       free     = 7644472 (7.290336608886719MB)
       19.554906384698278% used
    Eden Space:
       capacity = 8454144 (8.0625MB)
       used     = 1507784 (1.4379348754882812MB)
       free     = 6946360 (6.624565124511719MB)
       17.8348511688469% used
    From Space:
       capacity = 1048576 (1.0MB)
       used     = 350464 (0.334228515625MB)
       free     = 698112 (0.665771484375MB)
       33.4228515625% used
    To Space:
       capacity = 1048576 (1.0MB)
       used     = 0 (0.0MB)
       free     = 1048576 (1.0MB)
       0.0% used
    tenured generation:  #老年代
       capacity = 20971520 (20.0MB)
       used     = 12342320 (11.770553588867188MB)
       free     = 8629200 (8.229446411132812MB)
       58.85276794433594% used
    
    12566 interned Strings occupying 1050904 bytes.
    
  • histo

    显示堆中统计信息,类,实例数量、合计容量

    num     #instances         #bytes  class name
    ----------------------------------------------
       1:         37279        3740984  [C
       2:          5771        1720144  [I
       3:         35585         854040  java.lang.String
       4:          3607         824480  [B
       5:          8529         750552  java.lang.reflect.Method
       6:          6479         717720  java.lang.Class
       7:         20414         653248  java.util.concurrent.ConcurrentHashMap$Node
       8:          6628         370872  [Ljava.lang.Object;
       9:          7478         299120  java.util.LinkedHashMap$Entry
      10:          3121         278896  [Ljava.util.HashMap$Node;
      11:           131         265648  [Ljava.util.concurrent.ConcurrentHashMap$Node;
      12:         13575         217200  java.lang.Object
      13:          6741         215712  java.util.HashMap$Node
      14:          7779         175592  [Ljava.lang.Class;
      15:          2989         167384  java.util.LinkedHashMap
      16:          4451         142432  java.util.concurrent.locks.AbstractQueuedSynchronizer$Node
      ...
      
    
  • permstat

    以Classloader 为统计口经显示永久代内存状态,window 有效

  • F

    虚拟机执行-dump 无响应时,强制生成dump 快照,window 无效

    [root@guanzc-206 jar]# jmap -dump:format=b,file=dup.bin -F 41262 
    

jhat

jhat(JVM Heap Analysis Tool) 虚拟机堆存储快照分析工具,与jmap 结合使用,分析jmap 生成的转储快照。内置了HTTP/WEB服务器,结果能在浏览器查看,默认端口7000 。建议不在应用服务器上执行 jhat ,会损耗服务器性能。

[root@guanzc-206 jar]# jhat dump.bin  
Reading from dump.bin...
Dump file created Sat Sep 19 21:54:58 CST 2020
Snapshot read, resolving...
Resolving 271309 objects...
Chasing references, expect 54 dots......................................................
Eliminating duplicate references......................................................
Snapshot resolved.
Started HTTP server on port 7000
Server is ready.

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0bPdkmWe-1600525392491)(C:\Users\qinxiaoran\AppData\Roaming\Typora\typora-user-images\image-20200919215640241.png)]

以包的形式显示

jstack

jstack(Stack Trace For Java) java堆跟踪工具。生成虚拟机当前时刻的线程快照(threaddump或者javacore 文件)。当前这在执行每一条线程堆栈集合,定位线程停顿原因,排查死锁,挂起,外部调用等

  • F

    正常输入不被响应时,强制输出堆栈

  • l

    除堆栈外,锁信息

    [root@guanzc-206 jar]# jstack -l 41262
    "41" #70 daemon prio=5 os_prio=0 tid=0x00007f952c150800 nid=0xa188 waiting on condition [0x00007f950d196000]
       java.lang.Thread.State: TIMED_WAITING (sleeping)
            at java.lang.Thread.sleep(Native Method)
            at java.lang.Thread.sleep(Thread.java:340)
            at java.util.concurrent.TimeUnit.sleep(TimeUnit.java:386)
            at com.ikang.service.ThreadService.lambda$testThread$0(ThreadService.java:15)
            at com.ikang.service.ThreadService$$Lambda$477/503680309.run(Unknown Source)
            at java.lang.Thread.run(Thread.java:748)
    
       Locked ownable synchronizers:
            - None
    
    
  • m

    调用外部方法时,显示C/C++堆栈

    [root@guanzc-206 jar]# jstack -m 41262 >mstack
    [root@guanzc-206 jar]# vim mstack  
    Attaching to process ID 41262, please wait...
    Debugger attached successfully.
    Server compiler detected.
    JVM version is 25.131-b11
    Deadlock Detection:
    
    No deadlocks found.
    
    ----------------- 41263 -----------------
    0x00007f9547e9ea35      __pthread_cond_wait + 0xc5
    0x00007f9546f99037      _ZN7Monitor5IWaitEP6Threadl + 0xf7
    0x00007f9546f99800      _ZN7Monitor4waitEblb + 0x100
    0x00007f954712e621      _ZN7Threads10destroy_vmEv + 0x51
    0x00007f9546d878e1      jni_DestroyJavaVM + 0x81
    0x00007f9547c8463d      JavaMain + 0x27d
    ----------------- 41265 -----------------
    ...
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值