• JVM工具使用(jstat + jmap)


    jstack:

    jstack是java虚拟机自带的一种堆栈跟踪工具

    命令格式:

    jstack [-l] pid (pid 可以使用jps查看)

    例:jstack 44076 &>$(date +%H%M)_44076.jstack.log

    线程状态:

    • NEW,未启动的。不会出现在Dump中
    • RUNNABLE,在虚拟机内执行的。运行中状态,可能里面还能看到locked字样,表明它获得了某把锁
    • BLOCKED,受阻塞并等待监视器锁。被某个锁(synchronizers)给block住了
    • WATING,无限期等待另一个线程执行特定操作。等待某个condition或monitor发生,一般停留在park(), wait(), sleep(), join() 等语句里
    • TIMED_WATING,有时限的等待另一个线程的特定操作。和WAITING的区别是wait() 等语句加上了时间限制 wait(timeout)
    • TERMINATED,已退出的


    以下表示线程在方法调用时,额外的重要的操作。线程Dump分析的重要信息。修饰上方的方法调用。

    • locked <地址> 目标:使用synchronized申请对象锁成功,监视器的拥有者。
    • waiting to lock <地址> 目标:使用synchronized申请对象锁未成功,在迚入区等待。
    • waiting on <地址> 目标:使用synchronized申请对象锁成功后,释放锁幵在等待区等待。
    • parking to wait for <地址> 目标


    线程状态产生的原因:

    • runnable:状态一般为RUNNABLE
    • in Object.wait():等待区等待,状态为WAITING或TIMED_WAITING
    • waiting for monitor entry:进入区等待,状态为BLOCKED
    • waiting on condition:等待区等待、被park
    • sleeping:休眠的线程,调用了Thread.sleep()

    jstat

    jstat利用JVM内建的指令对Java应用程序的资源和性能进行实时的命令行的监控,包括了对进程的classloader,compiler,gc情况;

    特别的,一个极强的监视内存的工具,可以用来监视VM内存内的各种堆和非堆的大小及其内存使用量,以及加载类的数量。

    命令格式:

    jstat -gcutil pid interval(ms)

    举例:

    jstat -gcutil  16361 1000

    线上服务器的GC情况如下:

    参数说明如下:

    • S0: 新生代中Survivor space 0区已使用空间的百分比
    • S1: 新生代中Survivor space 1区已使用空间的百分比
    • E: 新生代已使用空间的百分比
    • O: 老年代已使用空间的百分比
    • P: 永久带已使用空间的百分比

    • YGC: 从应用程序启动到当前,发生Yang GC 的次数
    • YGCT: 从应用程序启动到当前,Yang GC所用的时间【单位秒】
    • FGC: 从应用程序启动到当前,发生Full GC的次数
    • FGCT: 从应用程序启动到当前,Full GC所用的时间
    • GCT: 从应用程序启动到当前,用于垃圾回收的总时间【单位秒】

    参考:jstat -gcutil 命令使用-CSDN博客


    jmap

    jmap命令是一个可以输出所有内存中对象的工具,甚至可以将VM 中的heap,以二进制输出成文本。打印出某个java进程(使用pid)内存内的,所有“对象”的情况(如:产生那些对象,及其数量)

    命令格式:

    jamp -heap pid:查看java堆使用情况

    jmap -histo pid:查看堆内存中的对象数量,大小

    jmap -histo:live pid:可以观察heap中所有对象的情况(heap中所有生存的对象的情况)。包括对象数量和所占空间大小。 可以将其保存到文本中去,在一段时间后,使用文本对比工具,可以对比出GC回收了哪些对象。jmap -histo:live 这个命令 JVM会先触发gc,然后再统计信息

    jmap -finalizerinfo pid:打印正在等候回收的对象信息

    jmap -dump:live,format=b,file=a.log pid

    内存信息dump到a.log文件中,这个命令执行,JVM会将整个heap的信息dump写入到一个文件,heap如果比较大的话,就会导致这个过程比较耗时,并且执行的过程中为了保证dump的信息是可靠的,所以会暂停应用

    案例:

    1. jmap -heap 15
    2. 结果
    3. Attaching to process ID 15, please wait...
    4. Debugger attached successfully.
    5. Server compiler detected.
    6. JVM version is 25.262-b10
    7. using parallel threads in the new generation. ##新生代采用的是并行线程处理方式
    8. using thread-local object allocation.
    9. Concurrent Mark-Sweep GC ##同步并行垃圾回收
    10. Heap Configuration: ##堆配置情况,也就是JVM参数配置的结果[平常说的tomcat配置JVM参数,就是在配置这些]
    11. MinHeapFreeRatio = 40 ##最小堆使用比例
    12. MaxHeapFreeRatio = 70 ##最大堆可用比例
    13. MaxHeapSize = 536870912 (512.0MB) ##最大堆空间大小
    14. NewSize = 268435456 (256.0MB) ##新生代分配大小
    15. MaxNewSize = 268435456 (256.0MB) ##最大可新生代分配大小
    16. OldSize = 268435456 (256.0MB) ##老年代大小
    17. NewRatio = 2 ##新生代比例
    18. SurvivorRatio = 8 ##新生代与suvivor的比例
    19. MetaspaceSize = 21807104 (20.796875MB) ##元空间大小 元空间本质跟永久代类似,元空间与永久代最大的区别在于:元空间并不在虚拟机中,而是使用本机内存,因此,元空间大小仅受本地内存限制
    20. CompressedClassSpaceSize = 1073741824 (1024.0MB)
    21. MaxMetaspaceSize = 17592186044415 MB
    22. G1HeapRegionSize = 0 (0.0MB)
    23. Heap Usage: ##堆使用情况【堆内存实际的使用情况】
    24. New Generation (Eden + 1 Survivor Space): ##新生代(伊甸区Eden区 + 幸存区survior(1+2)空间)
    25. capacity = 241631232 (230.4375MB) ##伊甸区容量
    26. used = 191127136 (182.27304077148438MB) ##已经使用大小
    27. free = 50504096 (48.164459228515625MB) ##剩余容量
    28. 79.09868869931516% used ##使用比例
    29. Eden Space: ##伊甸区
    30. capacity = 214827008 (204.875MB)
    31. used = 170204912 (162.32005310058594MB)
    32. free = 44622096 (42.55494689941406MB)
    33. 79.22882396611882% used
    34. From Space: ##survior1
    35. capacity = 26804224 (25.5625MB)
    36. used = 20922224 (19.952987670898438MB)
    37. free = 5882000 (5.6095123291015625MB)
    38. 78.05569749006723% used
    39. To Space: ##survior2
    40. capacity = 26804224 (25.5625MB)
    41. used = 0 (0.0MB)
    42. free = 26804224 (25.5625MB)
    43. 0.0% used
    44. concurrent mark-sweep generation: ##老年代使用情况
    45. capacity = 268435456 (256.0MB)
    46. used = 146936152 (140.12923431396484MB)
    47. free = 121499304 (115.87076568603516MB)
    48. 54.73798215389252% used
    49. 36399 interned Strings occupying 4146712 bytes.

    histo的参数说明:

                    instances(实例数)、bytes(大小)、classs name(类名)

    它基本是按照使用使用大小逆序排列的

    1. jmap -histo:live 15
    2. num #instances #bytes class name
    3. ----------------------------------------------
    4. 1: 11717 55996520 [Ljava.util.HashMap$Node;
    5. 2: 142072 17500168 [C
    6. 3: 20197 16779088 [B
    7. 4: 141493 3395832 java.lang.String
    8. 5: 104965 3358880 java.util.concurrent.ConcurrentHashMap$Node
    9. 6: 50269 2495760 [Ljava.lang.Object;
    10. 7: 51898 2491104 java.util.HashMap
    11. 8: 20599 2270160 java.lang.Class
    12. 9: 24224 2131712 java.lang.reflect.Method
    13. 10: 12309 1717872 [I
    14. 11: 52769 1266456 java.util.ArrayList
    15. 12: 29598 1183920 java.util.LinkedHashMap$Entry
    16. 13: 434 987264 [Ljava.util.concurrent.ConcurrentHashMap$Node;
    17. 14: 51193 819088 java.lang.Object
    18. ...
    19. Total 1189759 129611872
    1. #instance 是对象的实例个数
    2. #bytes 是总占用的字节数
    3. #class name 对应的就是 Class 文件里的 class 的标识
    4. B 代表 byte
    5. C 代表 char
    6. D 代表 double
    7. F 代表 float
    8. I 代表 int
    9. J 代表 long
    10. Z 代表 boolean
    11. 前边有 [ 代表数组, [I 就相当于 int[]
    12. 对象用 [L+ 类名表示

    注意:

    (1)jmap -histo命令 只知道某个class name占用了那么大的内存,但不知道由什么对象创建的。下一步需要将其他dump出来,使用内存分析工具进一步明确它是由谁引用的、由什么对象。

    (2)jmap -histo:live 这个命令执行,JVM会先触发gc,然后再统计信息

    • -F 强迫.在pid没有响应的时候使用-dump或者-histo参数. 在这个模式下,live子参数无效.
    • -h | -help 打印辅助信息
    • -J 传递参数给jmap启动的jvm

     jmap使用举例:

    1. 使用jps查看线程ID
    2. 使用jstat -gc 3331 250 20 查看gc情况,一般比较关注PERM区的情况,查看GC的增长情况。
    3. 使用jstat -gccause pid:额外输出上次GC原因
    4. 使用jmap -dump:format=b,file=heapDump 3331生成堆转储文件

    内存泄露定位过程(Memory Analyzer Tool :MAT)

    打dump:jmap -dump:format=b file=yarn.dump.log 1590   

    之后用MemoryAnalyzer.exe分析(Memory Analyzer Tool)

    利用内存分析工具(Memory Analyzer Tool,MAT)分析java项目内存泄露_java内存泄露分析插件-CSDN博客​

    参考:利用内存分析工具(Memory Analyzer Tool,MAT)分析java项目内存泄露_java内存泄露分析插件-CSDN博客

  • 相关阅读:
    web前端期末大作业——餐品后台管理系统(html+css+javascript)
    模型轻量化、模型减面、模型压缩、模型优化合集
    上海市青少年算法2023年8月月赛(丙组)
    day-49 代码随想录算法训练营(19) 动态规划 part 10
    【愚公系列】2022年10月 微信小程序-优购电商项目-首页设计
    Ubuntu 下载安装包到本地
    IP地址查询在社交行业中的崭新应用
    一文带你搞懂sklearn.metrics混淆矩阵
    SkyWalking分布式系统应用程序性能监控工具-中
    一维数组、二维数组学习内容
  • 原文地址:https://blog.csdn.net/victorzzzz/article/details/108579231