携手创作,共同成长!这是我参加「日新方案 8 月更文挑战」的第10天,点击检查活动概况
1.写在前面
前面现已共享了很多关于jvm的知识,具体的概况都能够检查上几篇的文章。
从jvm的调优原理,垃圾查找算法,垃圾收回算法,再到jvm调优东西,调优参数等。
需求把握的jvm知识,现已是循序渐进,一步一步的深入学习。
那在把握这些内容的时候,是不是有种想去实践的激动呢?
好了,今日咱们就来进行一次jvm调优实践之旅吧!!!
主要从以下几个方面进行展开描绘:
- JVM实践调优主要过程
- 剖析GC日志
- 堆内存与元空间优化
- 线程堆栈优化
- 堆内存内部优化:新生代和老时代比例
- 垃圾收回器优化
2.JVM调优实践
2.1 JVM实践调优主要过程
默许的策略是最普用,但不是最佳的。
-
第一步:监控剖析GC日志
-
第二步:判别JVM问题:
- 假如各项参数设置合理,体系没有超时日志呈现,GC频率不高,GC耗时不高,那么没有必要进行GC优化
- 假如GC时刻超过1-3秒,或许频频GC,则必须优化。
-
第三步:确认调优方针
-
第四步:调整参数
- 调优一般是从满足程序的内存使用需求开端,之后是时刻延迟要求,最后才是吞吐量要求,要基于这个过程来不断优化,每一个过程都是进行下一步的根底,不行逆行之。
-
第五步:对比调优前后差距
-
第六步:重复: 1 、 2 、 3 、 4 、 5 过程
- 找到最佳JVM参数设置
-
第七步:使用JVM到使用服务器:
- 找到最合适的参数,将这些参数使用到一切服务器,并进行后续盯梢。
以上,便是咱们进行jvm调优得一些过程了。
那咱们就从第一步开端喽!!!^_^
2.2 剖析GC日志
2.2.1 初始参数设置
机器环境:
目标 | 参数 |
---|---|
机器 | CPU 12核,内存16GB |
集群规模 | 单机 |
seqb_web版本 | 1.0 |
数据库 | 4核 16G |
Jvm调优典型参数设置;
-
-Xms堆内存的最小值:
- 默许状况下,当堆中可用内存小于40%时,堆内存会开端增加,一直增加到-Xmx的巨细。
-
-Xmx堆内存的最大值: 默许值是总内存/64(且小于1G)
- 默许状况下,当堆中可用内存大于70%时,堆内存会开端减少,一直减小到-Xms的巨细;
-
-Xmn新生代内存的最大值:
- 1.包括Eden区和两个Survivor区的总和
- 2.装备写法如:-Xmn1024k,-Xmn1024m,-Xmn1g
-
-Xss每个线程的栈内存:
- 默许1M,一般来说是不需求改。线程栈越小意味着能够创立的线程数越多
整个堆的巨细 = 年青代巨细 + 年迈代巨细,堆的巨细不包括元空间巨细,假如增大了年青代,年迈代相应就会减小,官方默许的装备为年迈代巨细/年青代巨细=2/1左右;
建议在开发测验环境能够用Xms和Xmx别离设置最小值最大值,但是在线上生产环境,Xms和Xmx设置的值必须相同,防止抖动;
这儿比较重要喔,一般咱们都是将Xms和Xmx的值设置为相同的!!!
JVM调优设置合巨细堆内存空间,既不能太大,也不能太小。那么应该设置为多少呢?
默许的装备是否存在功能瓶颈。假如想要确认JVM功能问题瓶颈,需求进一步剖析GC日志
- -XX:+PrintGCDetails 开启GC日志创立更详细的GC日志 ,默许状况下,GC日志是封闭的
-
-XX:+PrintGCTimeStamps,-XX:+PrintGCDateStamps 开启GC时刻提示
- 开启时刻便于咱们更精确地判别几次GC操作之间的时两个参数的区别
- 时刻戳是相对于 0 (根据JVM启动的时刻)的值,而日期戳(date stamp)是实践的日期字符串
- 因为日期戳需求进行格式化,所以它的功率或许会受细微的影响,不过这种操作并不频频,它造成的影响也很难被咱们感知。
- -XX:+PrintHeapAtGC 打印堆的GC日志
- -Xloggc:./logs/gc.log 指定GC日志路径
这儿,咱们是在window下面进行测验,idea装备如下:
-XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -XX:+PrintHeapAtGC -Xloggc:E:/logs/gc-default.log
这样就会在e盘下logs文件夹下面,生成gc-default.log日志
2.2.2 GC日志解读
Young GC 日志意义
2022-08-05T13:45:23.336+0800: 4.866: [GC (Metadata GC Threshold) [PSYoungGen: 136353K->20975K(405504K)] 160049K->48437K(720384K), 0.0092260 secs] [Times: user=0.00 sys=0.02, real=0.02 secs]
这儿的内容,咱们一个一个解析:
2022-08-05T13:45:23.336+0800: 本次GC发生时刻
4.866: 举例启动使用的时刻
[GC【表示GC的类型,youngGC】 (Metadata GC Threshold) 元空间超阈值
[PSYoungGen: 136353K->20975K(405504K年青代总空间)] 160049K->48437K(720384K)整堆), 0.0092260 secs本次垃圾收回耗时]
[Times: user=0.00本次GC耗费CPU的时刻 sys=0.02体系暂停时刻, real=0.02 secs实践使用暂停时刻]
这儿的解析,应该很详细了吧,还有谁看不明白的呢?
FullGC 日志意义
2022-08-05T20:24:47.815+0800: 6.955: [Full GC (Metadata GC Threshold) [PSYoungGen: 701K->0K(72704K)] [ParOldGen: 38678K->35960K(175104K)] 39380K->35960K(247808K), [Metaspace: 56706K->56706K(1099776K)], 0.1921975 secs] [Times: user=1.03 sys=0.00, real=0.19 secs]
这儿的内容,咱们也是一个一个解析:
2022-08-05T20:24:47.815+0800:
6.955: 刚启动服务就Full GC【整堆收回!!】
[Full GC (Metadata GC Threshold) Metaspace空间超限!
[PSYoungGen: 701K->0K(72704K)] 年青代没有收回空间
[ParOldGen: 38678K->35960K(175104K)] 39380K->35960K(247808K), 老时代也没有到阈值,整堆更没有到阈值
[Metaspace: 56706K->56706K(1099776K)], 0.1921975 secs]
[Times: user=1.03本次GC耗费CPU的时刻 sys=0.00体系暂停时刻, real=0.19 secs实践使用暂停时刻]
看到这儿,有些哥们就会说,这么看,也太厌恶了吧,鳞次栉比的日志,看着头疼!!!
那么接下来咱们来学一个GC日志可视化东西
2.2.3 GC日志可视化剖析
剖析GC日志,就必须让GC日志输出到一个文件中,然后使用GC日志剖析东西(gceasy.io/) 进行剖析
这儿剖析完之后,能够下载剖析陈述
1) JVM内存占用状况:
Generation【区域】 | Allocated【最大值】 | Peak【占用峰值】 |
---|---|---|
Young Generation【年青代】 | 74.5 mb | 74.47 mb |
Old Generation【老年青代】 | 171 mb | 95.62 mb |
Meta Space【元空间】 | 1.05 gb | 55.38 mb |
Young + Old + Meta space【整体】 | 1.3 gb | 212.64 mb |
2) 要害功能目标:
1 、吞吐量: 百分比越高标明GC开销越低。这个目标反映了JVM的吞吐量。
- Throughput:97.043%
2 、GC 延迟:Latency
- Avg Pause GC Time: 7.80 ms 均匀GC暂停时刻
- Max Pause GC Time: 190 ms 最大GC暂停时刻
3) GC 可视化交互聚合成果
由上图能够看到,发生了3次full gc
存在问题:一开端就发生了 3 次full gc , 很明显不太正常;
4) GC 计算
GC Statistics:GC计算
由上图能够得到,发生gc的总次数,young gc,full gc的计算,gc 暂停时刻计算。
5) GC原因:
原因 | 次数 | 均匀时刻 | 最大时刻 | 总耗时 |
---|---|---|---|---|
Metadata GC Threshold | 6 | 43.3 ms | 190 ms | 260 ms |
Allocation Failure | 53 | 3.77 ms | 10.0 ms | 200 ms |
这儿对这些原因解析一下:
- Metadata GC Threshold: 元空间超阈值
- Allocation Failure :年青代空间不足
这儿弥补一个原因,本事例还没呈现的
- Ergonomics:译文是“人体工程学”,GC中的Ergonomics意义是负责自动调解gc暂停时刻和吞吐量之间平衡然后产生的GC。目的是使得虚拟机功能更好的一种做法。
由此可见,通过可视化的东西,能够快速的帮咱们剖析GC的日志。咱们得善于使用东西。
因为gc的日志文件,内容太多,都是鳞次栉比的数字,文本。看得实在是头疼。
有了gc easy可视化东西,而且还是在线的,十分的便利。GC日志剖析是免费的
因为jvm调优实践的剖析,篇幅比较长,所以今日就先到这儿,剩余的留着下次共享了。
好了,以上便是JVM调优实践一的共享了。
个人了解,或许也不行全面,班门弄斧了。
假如觉得有收获的,帮忙点赞、谈论、保藏
一下呗!!!