首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >JVM之GC日志续

JVM之GC日志续

作者头像
Coder的技术之路
发布于 2021-05-14 06:21:23
发布于 2021-05-14 06:21:23
75900
代码可运行
举报
文章被收录于专栏:Coder的技术之路Coder的技术之路
运行总次数:0
代码可运行

本文大概阐述和GC日志相关的jvm启动参数的一些内容。

GC日志相关基本参数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-XX:+PrintGCDetails 
  输出GC的详细日志
-XX:+PrintGCTimeStamps 
  输出GC的时间戳(以基准时间的形式)
-XX:+PrintGCDateStamps 
  输出GC的时间戳(以日期的形式,如 2013-05-04T21:53:59.234+0800-XX:+PrintHeapAtGC 
  在进行GC的前后打印出堆的信息
-XX:+PrintGCApplicationStoppedTime 
  输出GC造成应用暂停的时间
-XX:+PrintReferenceGC
  引用相关信息,虚、弱、强引用的个数和耗时
-Xloggc:../logs/gc.log 
  日志文件的输出路径

特殊说明:生产环境gc日志要遵循够用就好的原则,因为gc日志的时间也是会算在stw时间里的,如果gc日志的输出是同步刷盘模式,有可能会因为系统其他IO异常造成gc停顿时间的异常(由于gc打印造成的异常我们下一篇再详细介绍下)

GC日志相关特殊参数

1. GC日志滚动

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-XX:+UseGCLogFileRotation

GC日志的输出会发生文件IO,有时候也会造成不必要的停顿,可以将GC日志输出到tmpfs(内存文件系统)中,但tmpfs会消耗内存,为了避免内存被浪费可以使用-XX:+UseGCLogFileRotation滚动GC日志。

2. 禁写Statistics数据

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-XX:+PerfDisableSharedMem

gstst会默默的在/tmp/hperf 目录写上一点statistics数据。

如果gc时,刚好遇到PageCache刷盘,把文件阻塞了,就不能结束这个Stop the World的安全点了。用上述参数禁用jstat,用jmx来代替即可。参见:jvm-mmap-pause

3. 安全点相关参数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-XX:+PrintSafepointStatistics 
-XX:PrintSafepointStatisticsCount = 1

安全点相关日志输出如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
         vmop                    [threads: total initially_running wait_to_block]    [time: spin block sync cleanup vmop] page_trap_count
0.257: ParallelGCFailedAllocation       [       9          0              0    ]      [     0     0     0     0     2    ]  0
0.261: no vm operation                  [       7          0              1    ]      [     0     0     0     0     0    ]  0
  • vmop
    • 表示 引发STW的原因
  • [thread]
    • total:安全点里的总线程数
    • initially_running:安全点时开始时正在运行状态的线程数
    • wait_to_block:在VM Operation开始前需要等待其暂停的线程数
  • [time]
    • spin:等待线程响应safepoint号召的时间
    • block:暂停所有线程所用的时间
    • sync:(spin + block),==从开始到进入安全点所耗的时间,可用于判断进入安全点耗时
    • cleanup:清理所需时间
    • vmop:真正执行VM Operation的时间

no vm operation 说明这里没有vm相关操作发生,因此表示是一个安全点

安全点对系统的健康监控是非常重要的。会使用到安全点的场景有GC、偏向锁撤销等,总之是提供一个对象状态不变的状态点,去让系统进行一系列的后续操作。

这里要顺便提一下另一个和安全点相关的jvm参数:-XX:-UseBiasedLocking

禁用偏向锁的设置参数,在有的情况下比较有效,如果并发竞争变大,会导致偏向锁撤销频繁,这个时候我们可能会看到安全点的耗时增加,进而导致了gc时间和系统响应时间增大,关于安全点和偏向锁的异常案例,我们也放在下一篇一并列举

补:性能和调优相关特殊参数

1. dump相关参数

这个应该不属于gc日志相关参数,但是都在jvm启动参数里,就顺便提下

  • 1.heap dump
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-XX:+HeapDumpOnOutOfMemoryError

这个参数,主要作用是,在系统发生oom异常时,自动进行heap dump操作,有些大佬说在容器环境混部情况下,在普通硬盘上会造成20秒以上的硬盘IO跑满,对其他宿主程序是很不友好的,但是按生产环境的实际运营情况看,这个参数还是非常有用的,在系统发生oom异常需要尽快重启恢复的时候,dump下来的现场文件对异常的排查是非常有帮助的。

  • 2.core dump
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ulimit -c unlimited

从CoreDump能够转出Heap Dump 和 Thread Dump 还有crash的地方,非常实用

2. Integer Cache

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-XX:AutoBoxCacheMax=20000

对于Integer和 Long,JDK默认只缓存 -128 ~ +127,超出范围的数字就要实时构建新的Integer对象。对于性能要求很高的系统场景,可以设置此参数,据有关测算,QPS影响达4%左右。

3. 启动时预访问

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 -XX:+AlwaysPreTouch

ElasticSearch和Cassandra都设置了此参数。作用是内存页预访问,可能启动时慢上一点,但访问时会更快速些,比如新生代晋升到老生代时不会临时访问页面使得GC停顿时间加长。

4. 即时编译

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-XX:-UseCounterDecay
-XX:-TieredCompilation

gc默认进行技术器衰减操作,可能会导致某些临界访问量的方法,一直无法转成热点代码,所以可以使用UseCounterDecay参数来禁用计数器衰减操作。TieredCompilation是1.8默认开启的多层编译。但是业界大佬在实测时发现启动初期可能有性能减弱,有需要可以将其禁用。

总结

本篇主要概述了gc日志所涉及到的一些可能需要关注的参数设置,其中提及的一些实际案例,我们后续文章补充;也顺便列举了一些和性能相关的jvm启动参数,在大家平时有遇到类似问题可以当做个参考。

当然,和gc相关的jvm启动参数是非常多的,gc策略、并发收集线程数、eden和s区的比例、对象年代、cms的碎片压缩、G1的停顿时间等等,每一个都可以结合实际需求单独一篇来展开阐述。后续有机会再逐一补充吧

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-06-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Coder的技术之路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
求求你了,配个GC日志呗,不然咋分析故障原因
生产环境上,或者其他要测试 GC 问题的环境上,一定会配置上打印GC日志的参数,便于分析 GC 相关的问题。
猿天地
2021/06/01
5220
2019-11-15 JVM参数调优推荐
年更贴,因为两年里遇到的事情,一些想法变了。也补充了不少VJTools的内容,比如为伸手党们准备的jvm-options.sh。
Albert陈凯
2019/11/15
2.1K0
深入浅出解析JVM中的Safepoint | 得物技术
最早接触JVM中的安全点概念是在读《深入理解Java虚拟机》那本书垃圾回收器章节的内容时。相信大部分人也一样,都是通过这样的方式第一次对安全点有了初步认识。不妨,先复习一下《深入理解Java虚拟机》书中安全点那一章节的内容。
得物技术
2023/05/11
6430
深入浅出解析JVM中的Safepoint | 得物技术
这段关于安全点的JVM源码有点意思!
1 秒之后,主线程并没有马上打印 num,而是等 t1 和 t2 分别执行完 2 亿次累加操作退出循环后,才会打印 num 的值。
CoderW
2022/07/13
6220
这段关于安全点的JVM源码有点意思!
学synchronized锁升级过程,吊打面试官
哈喽,大家好,我是IT老哥,我们今天来讲讲synchronized这个锁,可能你们第一印象是这个锁太笨了,太重了,谁用谁是傻子,如果你是这样想的话,那么面试的时候基本上就是凉凉了。因为jdk1.6之后对它进行了优化,它已经不是你们曾经认识的它了,中国有句古话,叫:士别三日当刮目相待,今天我们就来看看这个锁到底做了哪些优化。希望看到视频的你们动动小手给老哥点个赞。
公众号 IT老哥
2020/09/16
1.4K0
学synchronized锁升级过程,吊打面试官
实用JVM参数总结
注:本文部分参数不适用于JDK1.8,请大家阅读时注意。有时间我会特别总结一下JDK1.8的JVM参数。
九州暮云
2019/08/21
1K0
从应用到内核查接口超时(上)
之前的博文中说过最近在查一个问题,花费了近两个星期,问题算是有了一个小结,是时候总结一下了。
枕边书
2018/12/28
5660
Java锁---偏向锁、轻量级锁、自旋锁、重量级锁
之前做过一个测试,反复执行过多次,发现结果是一样的:  1. 单线程下synchronized效率最高(当时感觉它的效率应该是最差才对);  2. AtomicInteger效率最不稳定,不同并发情况下表现不一样:短时间低并发下,效率比synchronized高,有时甚至比LongAdder还高出一点,但是高并发下,性能还不如synchronized,不同情况下性能表现很不稳定;  3. LongAdder性能稳定,在各种并发情况下表现都不错,整体表现最好,短时间的低并发下比AtomicInteger性能差一点,长时间高并发下性能最高(可以让AtomicInteger下台了);
stys35
2020/03/28
2.2K3
面试官:你都知道哪些JVM配置参数?下次别只会回答设置堆空间了,看看大厂是怎么做的。
今天在刷牛客的时候看到了一个面试题,题目是关于Java虚拟机(JVM)配置参数的。
程序员牛肉
2025/02/18
1260
面试官:你都知道哪些JVM配置参数?下次别只会回答设置堆空间了,看看大厂是怎么做的。
一份JVM参数
想写个一份百万QPS系统的JVM参数,感觉太标题党了,虽然这的确是,但还是朴实点;
码农戏码
2021/03/23
8750
JDK 17 之 JVM调优 史诗级 教程
性能调优包含多个层次,比如:架构调优、代码调优、JVM调优、数据库调优、操作系统调优等。 架构调优和代码调优是JVM调优的基础,其中架构调优是对系统影响最大的。
猫头虎
2024/04/08
1.8K0
JDK 17 之 JVM调优 史诗级 教程
关于生产环境改用G1垃圾收集器的思考
由于我们的业务量非常大,响应延迟要求高。目前沿用的老的ParNew+CMS已经不能支撑业务的需求。平均一台机器在1个月内有1次秒级别的stop the world。对系统来说是个巨大的隐患。所以我们采用测试环境压测和逐渐在一些小的试点项目中生产环境引用G1来验证是否可以解决问题以及可能会引入的风险。
静儿
2021/04/09
1.4K0
关于生产环境改用G1垃圾收集器的思考
太难了,一个接口超时问题,从应用排查到内核。
回望整个过年期间真的是躺的平平的,每天学习的时间和平时比起来差的不是一星半点。今天就复工了,也要收心了。我这个人有一个比较牛逼的能力就是状态调整特别快,只需要往工位上一坐下,我就能进入复工状态了。
why技术
2022/02/17
1.4K0
太难了,一个接口超时问题,从应用排查到内核。
不要再乱下载JDK了:Elasticsearch在国产化ARM环境下的首个大坑
导语:本文作者为解决一个JDK性能问题,从堆栈分析,到GC分析,再到Safepoint原因分析,最终定位到问题根因与所用的JDK版本有关。并整理成文,与所有Java相关开发的同学分享此次经验。
腾讯云中间件团队
2021/03/24
2.9K0
不要再乱下载JDK了:Elasticsearch在国产化ARM环境下的首个大坑
jvm 调优命令_java jvm调优工具
所谓的标准参数,就是不会随着我们JDK 变化而变化版本的参数 这种参数可以通过Java -help查看(和Java -version使用方式一样)
全栈程序员站长
2022/11/17
1.2K0
jvm 调优命令_java jvm调优工具
最详细的JVM&GC讲解
JVM是java的核心和基础,在java编译器和os平台之间的虚拟处理器。它是一种利用软件方法实现的抽象的计算机基于下层的操作系统和硬件平台,可以在上面执行java的字节码程序。
高广超
2018/12/12
1K0
JVM
重学Java系列之深入理解JVM虚拟机6:JNDI,OSGI,Tomcat类加载器实现
hhss
2021/02/12
7080
JVM
JVM难学?那是因为你没认真看完这篇文章
JAVA程序运行与虚拟机之上,运行时需要内存空间。虚拟机执行JAVA程序的过程中会把它管理的内存划分为不同的数据区域方便管理。
烂猪皮
2018/08/22
4490
JVM难学?那是因为你没认真看完这篇文章
JAVA程序运行与虚拟机之上,运行时需要内存空间。虚拟机执行JAVA程序的过程中会把它管理的内存划分为不同的数据区域方便管理。
美的让人心动
2018/09/20
3910
JVM难学?那是因为你没认真看完这篇文章
JVM GC杂谈之理论入门
GC杂谈之理论入门 ---- JVM堆布局介绍 ​ JVM堆被划分成两个不同的区域:新生代 ( Young )、老年代 ( Old )。新生代 ( Young ) 又被划分为三个区域:Eden、From Survivor、To Survivor,其中两个Survivor区的大小一致。 ​ \(堆新生代老年代老年代java堆 = 新生代(Young) + 老年代(Old) = 老年代(Old) + Eden + From Survivor + To Survivor\) ​ 特殊参数说明: JVM参数
SecondWorld
2018/03/14
8690
JVM GC杂谈之理论入门
推荐阅读
相关推荐
求求你了,配个GC日志呗,不然咋分析故障原因
更多 >
交个朋友
加入腾讯云官网粉丝站
蹲全网底价单品 享第一手活动信息
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验