概述
注:本文建立在熟悉JVM的基础上,对于JVM不熟悉的可以先去查看相关资料学习,后续也会写相关JVM方面的博客。
jdk自带工具:
jconsole、jvisualVM、jmap、jstack、jstat
开发工具:IDEA 2018 64位
本地主要运行几个基于SpringBoot微服务作为例子说明:cache-service 缓存微服务、search-service搜索微服务、 web-service 微服务。
1. 主要vm内存参数设置如下:
- -Xms1024m:设置idea初始化堆内存大小,
- -Xmx2048m:设置idea最大的堆内存,
- -XX:ReservedCodeCacheSize=480m:设置代码内存容量
- -XX:+UseConcMarkSweepGC: 使用cms并发标记清除gc策略
其他参数可以自行增加。
其中,GC收集器设置如下:
-XX:+UseSerialGC:设置串行收集器
-XX:+UseParallelGC:设置并行收集器
-XX:+UseParalledlOldGC:设置并行年老代收集器
-XX:+UseConcMarkSweepGC:设置并发收集器
注:GC之ParallelGC和ConcMarkSweepGC的理解 https://my.oschina.net/u/2518341/blog/1836661
配好之后,运行应用。
2. jps 查java进程id
3.打开jdk1.8/bin/jconsole.exe
GC策略和idea vm配置对不上,不生效?估计采用的是默认gc策略
4.打开jvisualVM
这里看到最大堆内存是5G多,而上面idea 的vm配置文件是设置2048M,对不上,感觉对不上?
这里需要在每个springboot的vm options单独配置(将上面idea 的vm配置复制过来),才生效,否则内存采用默认配置,而不是idea 的vm配置。(以search-service微服务为例)
结果可以看到最大堆内存刚好是springboot单独配置的2048M:
jconsole看gc情况,配置的cms垃圾回收策略生效了:
年轻代 ParNew策略(并行收集)
年老代CMS (并发-标记-清除)
根据这里提到的Conc Mark&Sweep,再查表,可以知道新生代使用的是ParNew GC,老生代使用的是ConcurrentMarkSweep GC。
注:事实上从表中可以得知新生代和老生代的组合其实是固定的那么几种,而且是双射的,所以只要知道其中一种就能查表得出另外一种。
https://www.jdon.com/idea/jvm-gc.html (JVM有关垃圾回收机制的配置)
如何判断JVM使用的是哪种GC回收策略?
新生代和旧生代的两种回收机制不是每个都能够搭配在一起工作的,如下图:
5.使用jstat命令打印gc垃圾回收日志
jstat -gc pid(进程id)
可以清除看到每个区代gc前后占用内存情况、、YGC年轻代gc次数、YGCT年轻代gc耗时/秒、FGC(Full gc)次数、FGCT 耗时/秒、GCT总gc耗时
堆:
(1)Young年轻代: 幸存区(Survivor)、Eden区
(2)Old年老代
非堆:
(3)Perm持久代(方法区)
6.VisualVM安装插件 Visual GC
参考:jvm可视化工具插件---Visual GC简介 https://blog.csdn.net/xuelinmei_happy/article/details/51090115
重启visualVM,监控Web,因为web采用默认vm配置,默认的gc策略不支持Hisogram
监控search,search采用单独配置vm,gc策略
但是年轻代与年老代的大小比例是默认的(因为没有自定义配置)
注:
TenuringThreshold 表示--对象在新生代中最大存活次数,超过此阈值还存活将被移到年老代。
自定义固定年轻代大小,加多配置:-Xmn750m
7.jmap命令查看堆内存信息
参考 https://www.cnblogs.com/myna/p/7573843.html
options参数
- heap : 显示Java堆详细信息
- histo : 显示堆中对象的统计信息
- permstat :Java堆内存的永久保存区域的类加载器的统计信息
- finalizerinfo : 显示在F-Queue队列等待Finalizer线程执行finalizer方法的对象
- dump : 生成堆转储快照
- F : 当-dump没有响应时,强制生成dump快照
(1)jmap -heap pid
(1.1)这个是采用默认vm配置打印的
F:microServicexxxyy_cache_server>jmap -heap 8052
Attaching to process ID 8052, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.144-b01
using thread-local object allocation.
Parallel GC with 4 thread(s)
Heap Configuration:
MinHeapFreeRatio = 0
MaxHeapFreeRatio = 100
MaxHeapSize = 5255462912 (5012.0MB)
NewSize = 109576192 (104.5MB)
MaxNewSize = 1751646208 (1670.5MB)
OldSize = 219676672 (209.5MB)
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 = 1568145408 (1495.5MB)
used = 1365354568 (1302.1035842895508MB)
free = 202790840 (193.39641571044922MB)
87.06810994915084% used
From Space:
capacity = 69730304 (66.5MB)
used = 69720304 (66.49046325683594MB)
free = 10000 (0.0095367431640625MB)
99.985659032836% used
To Space:
capacity = 93323264 (89.0MB)
used = 0 (0.0MB)
free = 93323264 (89.0MB)
0.0% used
PS Old Generation
capacity = 627572736 (598.5MB)
used = 231775336 (221.0381851196289MB)
free = 395797400 (377.4618148803711MB)
36.93202758891043% used
51545 interned Strings occupying 6032728 bytes.
(1.2)search采用单独VM配置,生效
jmap -heap 13500
具体如下:
Heap Configuration:
MinHeapFreeRatio = 40
MaxHeapFreeRatio = 70
MaxHeapSize = 2147483648 (2048.0MB)
NewSize = 786432000 (750.0MB)
MaxNewSize = 786432000 (750.0MB)
OldSize = 1361051648 (1298.0MB)
NewRatio = 2
SurvivorRatio = 8
MetaspaceSize = 21807104 (20.796875MB)
CompressedClassSpaceSize = 1073741824 (1024.0MB)
MaxMetaspaceSize = 17592186044415 MB
G1HeapRegionSize = 0 (0.0MB)
Heap Usage:
New Generation (Eden + 1 Survivor Space):
capacity = 707788800 (675.0MB)
used = 512093632 (488.37054443359375MB)
free = 195695168 (186.62945556640625MB)
72.35119176793981% used
Eden Space:
capacity = 629145600 (600.0MB)
used = 456709920 (435.5525207519531MB)
free = 172435680 (164.44747924804688MB)
72.59208679199219% used
From Space:
capacity = 78643200 (75.0MB)
used = 55383712 (52.818023681640625MB)
free = 23259488 (22.181976318359375MB)
70.42403157552083% used
To Space:
capacity = 78643200 (75.0MB)
used = 0 (0.0MB)
free = 78643200 (75.0MB)
0.0% used
concurrent mark-sweep generation: (年老代)
capacity = 1361051648 (1298.0MB)
used = 76980272 (73.41410827636719MB)
free = 1284071376 (1224.5858917236328MB)
5.655940545174667% used
38753 interned Strings occupying 4364792 bytes.
(2)打印等待回收的对象信息
jmap -finalizerinfo pid
(3)打印堆的对象统计,包括对象数、内存大小等等。jmap -histo:live 这个命令执行,JVM会先触发gc,然后再统计信息
jmap -histo:live pid | more
jmap -histo:live 24971 | grep com.yuhuo 查询类名包含com.yuhuo的信息
jmap -histo:live 24971 | grep com.yuhuo > histo.txt 保存信息到histo.txt文件
7.jstack 线程堆栈状态
jstack用于生成java虚拟机当前时刻的线程快照
参考 https://www.cnblogs.com/jstarseven/p/8883327.html
Java线程状态
线程的5 种状态
- 新建:new(时间很短)
- 运行:runnable
- 等待:waitting(无限期等待)
- timed waitting(限期等待)
- 阻塞:blocked
- 结束:terminated(时间很短)
如下:
8.jps
jps(Java Virtual Machine Process Status Tool)是JDK 1.5提供的一个显示当前所有java进程pid的命令,简单实用,非常适合在linux/unix平台上简单察看当前java进程的一些简单情况
9.jcmd
在JDK 1.7之后,新增了一个命令行工具jcmd。它是一个多功能工具,可以用来导出堆,查看Java进程,导出线程信息,执行GC等.
jcmd拥有jmap的大部分功能,并且Oracle官方也建议使用jcmd代替jmap。
jcmd -l
jcmd 12765 help
打印线程栈信息Thread.print
(类似jstack pid)
查看系统中类统计信息GC.class_histogram
jcmd 8152 GC.class_histogram
本文来自:CSDN 作者:stwen_gan https://blog.csdn.net/a1036645146/article/details/98351900
觉得有用点个赞再走吧0.0,整理不易,转载请注明出处,谢谢。
最后
以上就是直率钢笔为你收集整理的记录一次SpringCloud微服务项目的JVM调试配置案例的全部内容,希望文章能够帮你解决记录一次SpringCloud微服务项目的JVM调试配置案例所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复