5款强大的JVM 性能调优监控工具 !,撸了大神写的spring源码笔记

本文详细介绍了Java内存分析工具jmap、jstat和hprof的使用方法,包括内存状态检查、堆内存配置、GC信息跟踪以及性能优化。作者还分享了如何通过这些工具进行问题诊断和性能提升,强调了提升程序员技能的重要性。
摘要由CSDN通过智能技术生成

jmap [option] [server-id@]remote-hostname-or-ip

如果运行在64位JVM上,可能需要指定-J-d64命令选项参数。

jmap -permstat pid

打印进程的类加载器和类加载器加载的持久代对象信息,输出:类加载器名称、对象是否存活(不可靠)、对象地址、父类加载器、已加载的类大小等信息,如下图:

使用jmap -heap pid查看进程堆内存使用情况,包括使用的GC算法、堆配置参数和各代中堆内存使用情况。比如下面的例子:

root@ubuntu:/# jmap -heap 21711

Attaching to process ID 21711, please wait…

Debugger attached successfully.

Server compiler detected.

JVM version is 20.10-b01

using thread-local object allocation.

Parallel GC with 4 thread(s)

Heap Configuration:

MinHeapFreeRatio = 40

MaxHeapFreeRatio = 70

MaxHeapSize = 2067791872 (1972.0MB)

NewSize = 1310720 (1.25MB)

MaxNewSize = 17592186044415 MB

OldSize = 5439488 (5.1875MB)

NewRatio = 2

SurvivorRatio = 8

PermSize = 21757952 (20.75MB)

MaxPermSize = 85983232 (82.0MB)

Heap Usage:

PS Young Generation

Eden Space:

capacity = 6422528 (6.125MB)

used = 5445552 (5.1932830810546875MB)

free = 976976 (0.9317169189453125MB)

84.78829520089286% used

From Space:

capacity = 131072 (0.125MB)

used = 98304 (0.09375MB)

free = 32768 (0.03125MB)

75.0% used

To Space:

capacity = 131072 (0.125MB)

used = 0 (0.0MB)

free = 131072 (0.125MB)

0.0% used

PS Old Generation

capacity = 35258368 (33.625MB)

used = 4119544 (3.9287033081054688MB)

free = 31138824 (29.69629669189453MB)

11.683876009235595% used

PS Perm Generation

capacity = 52428800 (50.0MB)

used = 26075168 (24.867218017578125MB)

free = 26353632 (25.132781982421875MB)

49.73443603515625% used

使用jmap -histo[:live] pid查看堆内存中的对象数目、大小统计直方图,如果带上live则只统计活对象,如下:

root@ubuntu:/# jmap -histo:live 21711 | more

num #instances #bytes class name----------------------------------------------

1: 38445 5597736

2: 38445 5237288

3: 3500 3749504

4: 60858 3242600

5: 3500 2715264

6: 2796 2131424

7: 5543 1317400 [I

8: 13714 1010768 [C

9: 4752 1003344 [B

10: 1225 639656

11: 14194 454208 java.lang.String

12: 3809 396136 java.lang.Class

13: 4979 311952 [S

14: 5598 287064 [[I

15: 3028 266464 java.lang.reflect.Method

16: 280 163520

17: 4355 139360 java.util.HashMap$Entry

18: 1869 138568 [Ljava.util.HashMap$Entry;

19: 2443 97720 java.util.LinkedHashMap$Entry

20: 2072 82880 java.lang.ref.SoftReference

21: 1807 71528 [Ljava.lang.Object;

22: 2206 70592 java.lang.ref.WeakReference

23: 934 52304 java.util.LinkedHashMap

24: 871 48776 java.beans.MethodDescriptor

25: 1442 46144 java.util.concurrent.ConcurrentHashMap$HashEntry

26: 804 38592 java.util.HashMap

27: 948 37920 java.util.concurrent.ConcurrentHashMap$Segment

28: 1621 35696 [Ljava.lang.Class;

29: 1313 34880 [Ljava.lang.String;

30: 1396 33504 java.util.LinkedList$Entry

31: 462 33264 java.lang.reflect.Field

32: 1024 32768 java.util.Hashtable$Entry

33: 948 31440 [Ljava.util.concurrent.ConcurrentHashMap$HashEntry;

class name是对象类型,说明如下:

B byte

C char

D double

F float

I int

J long

Z boolean

[ 数组,如[I表示int[]

[L+类名 其他对象

还有一个很常用的情况是:用jmap把进程内存使用情况dump到文件中,再用jhat分析查看。jmap进行dump命令格式如下:

jmap -dump:format=b,file=dumpFileName pid

我一样地对上面进程ID为21711进行Dump:

root@ubuntu:/# jmap -dump:format=b,file=/tmp/dump.dat 21711

Dumping heap to /tmp/dump.dat …

Heap dump file created

dump出来的文件可以用MAT、VisualVM等工具查看,这里用jhat查看:

root@ubuntu:/# jhat -port 9998 /tmp/dump.dat

Reading from /tmp/dump.dat…

Dump file created Tue Jan 28 17:46:14 CST 2014Snapshot read, resolving…

Resolving 132207 objects…

Chasing references, expect 26 dots…

Eliminating duplicate references…

Snapshot resolved.

Started HTTP server on port 9998Server is ready.

注意如果Dump文件太大,可能需要加上-J-Xmx512m这种参数指定最大堆内存,即jhat -J-Xmx512m -port 9998 /tmp/dump.dat。然后就可以在浏览器中输入主机地址:9998查看了:

上面红线框出来的部分大家可以自己去摸索下,最后一项支持OQL(对象查询语言)。

四、jstat(JVM统计监测工具):

看看各个区内存和GC的情况

语法格式如下:

jstat [ generalOption | outputOptions vmid [interval[s|ms] [count]] ]

vmid是Java虚拟机ID,在Linux/Unix系统上一般就是进程ID。interval是采样时间间隔。count是采样数目。比如下面输出的是GC信息,采样时间间隔为250ms,采样数为4:

root@ubuntu:/# jstat -gc 21711 250 4

S0C S1C S0U S1U EC EU OC OU PC PU YGC YGCT FGC FGCT GCT

192.0 192.0 64.0 0.0 6144.0 1854.9 32000.0 4111.6 55296.0 25472.7 702 0.431 3 0.218 0.649

192.0 192.0 64.0 0.0 6144.0 1972.2 32000.0 4111.6 55296.0 25472.7 702 0.431 3 0.218 0.649

192.0 192.0 64.0 0.0 6144.0 1972.2 32000.0 4111.6 55296.0 25472.7 702 0.431 3 0.218 0.649

192.0 192.0 64.0 0.0 6144.0 2109.7 32000.0 4111.6 55296.0 25472.7 702 0.431 3 0.218 0.649

要明白上面各列的意义,先看JVM堆内存布局:

可以看出:

堆内存 = 年轻代 + 年老代 + 永久代

年轻代 = Eden区 + 两个Survivor区(From和To)

现在来解释各列含义:

S0C、S1C、S0U、S1U:Survivor 0/1区容量(Capacity)和使用量(Used)

EC、EU:Eden区容量和使用量

OC、OU:年老代容量和使用量

PC、PU:永久代容量和使用量

YGC、YGT:年轻代GC次数和GC耗时

FGC、FGCT:Full GC次数和Full GC耗时

GCT:GC总耗时

五、hprof(Heap/CPU Profiling Tool):

hprof能够展现CPU使用率,统计堆内存使用情况。

语法格式如下:

java -agentlib:hprof[=options] ToBeProfiledClass

java -Xrunprof[:options] ToBeProfiledClass

javac -J-agentlib:hprof[=options] ToBeProfiledClass

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
img

总结

我们总是喜欢瞻仰大厂的大神们,但实际上大神也不过凡人,与菜鸟程序员相比,也就多花了几分心思,如果你再不努力,差距也只会越来越大。实际上,作为程序员,丰富自己的知识储备,提升自己的知识深度和广度是很有必要的。

Mybatis源码解析

基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!**

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-l2WX2xVn-1711614242580)]

总结

我们总是喜欢瞻仰大厂的大神们,但实际上大神也不过凡人,与菜鸟程序员相比,也就多花了几分心思,如果你再不努力,差距也只会越来越大。实际上,作为程序员,丰富自己的知识储备,提升自己的知识深度和广度是很有必要的。

Mybatis源码解析

[外链图片转存中…(img-8x57C3oi-1711614242580)]

[外链图片转存中…(img-oIqTtxsu-1711614242581)]

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值