常用jvm参数配置
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了常用jvm参数配置相关的知识,希望对你有一定的参考价值。
参考技术A ● 查看gc基本信息○ jdk9 之前使用 -XX:+PrintGC
○ jdk9 之后使用-Xlog:gc
● 查看gc详细信息
○ jdk9 之前使用 -XX:+PrintGCDetails
○ jdk9 之后使用-Xlog:gc*
● 查看GC前后堆、方法区可用容量变化
○ jdk9 之前使用 -XX:+PrintHeapAtGC
○ jdk9 之后使用-Xlog:gc+heap = debug
● 查看GC过程中用户线程并发时间以及停顿时间
○ jdk9 之前使用 -XX:+PrintGCApplicationConcurrentTime 以及 -XX:+PrintGCApplicationStoppedTime
○ jdk9 之后使用-Xlog:safepoint
● 查看收集器Ergonomics机制
○ jdk9 之前使用 -XX:+PrintAdaptiveSizePolicy
○ jdk9 之后使用-Xlog:gc+ergo*=trace
● 查看熬过收集后剩余对象的年龄分布信息
○ jdk9 之前使用 -XX:+PrintTenuringDistribution
○ jdk9 之后使用-Xlog:gc+age=trace
● 还是分代,不过分代都融入到了region,每个region都会根据实际情况调整功能
● 大对象不属于新生代也不属于老年代,这点和之前分代不同,G1 认为大于region的一半就为大对象
● G1的大多数行为都把Humongous Region作为老年代的一部分来进行看待
● 回收最有价值的(每个region都会有价值计算),回收时会把存活的复制到一个新的region中,单个region较小,根据停顿时间能控制回收影响
● Minor Gcc 模式
○ Young Gc,Eden区满了以后,就会触发
● Mixed Gc 模式
○ 老年代占整个堆的InitiatingHeapOccupancyPercent(默认45%) 比例时,就会触发Mixed Gc
○ 回收所有的年轻代Region+部分老年代的Region
● full Gc 模式
○ 当Mixed Gc的回收速度赶不上对象的生成速度时触发
○ 一旦由Mixed Gc降级到full Gc,将使用Serial GC收集器进行回收
● ZGC的Region具有动态性,动态创建和小会,以及动态的区域容量大小;Region的分类:
○ 小型Region(Small Region):容量固定2MB,用于存放<256kb的小对象
○ 中型Region(Medium Region):容量固定为32MB,用于存放>=256KB,但小于4MB的对象;
○ 大型Region(Large Region):容量不固定,可以动态变化,但必须是2MB的整数倍,用于放置>=4mb的大对象
● 采用染色指针技术实现并发整理算法:
○ 将标记信息记在引用对象的指针上;
○ 可以说zgc的可达性分析是遍历对象的“引用图”;
○ 在linux下64位指针的高18位不能用来寻址,zgc的染色体指针技术盯上了剩余46位的指针宽度,将其高4位提取出来存储四个标志信息(同时也压缩了zgc能够管理内存不能超过4TB~2的42次方)
○ 用来标志:对象的三色标记状态、是否进入了重分配集、是否执行过finalize()方法。
染色指针的优势:
○ Region的存活对象被移走,立即能够被释放和重用掉;
○ 减少在垃圾收集过程中的内存屏障的使用次数;zgc未使用任何的写屏障,只用了读屏障
○ 可扩展的存储结构,方便日后进一步提升性能;
● 支持Numa架构
面试题:JVM 配置常用参数和常用 GC 调优策略
做积极的人,而不是积极废人!
源码精品专栏
来源:http://t.cn/EX1sVYH
JVM 配置常用参数
堆参数
回收器参数
项目中常用配置
常用组合
常用 GC 调优策略
GC 调优原则
GC 调优目的
JVM 配置常用参数
堆参数
回收器参数
如上表所示,目前主要有串行、并行和并发三种,对于大内存的应用而言,串行的性能太低,因此使用到的主要是并行和并发两种。并行和并发 GC 的策略通过 UseParallelGC 和 UseConcMarkSweepGC 来指定,还有一些细节的配置参数用来配置策略的执行方式。例如:XX:ParallelGCThreads, XX:CMSInitiatingOccupancyFraction 等。通常:Young 区对象回收只可选择并行(耗时间),Old 区选择并发(耗 CPU)。
项目中常用配置
常用组合
常用 GC 调优策略
GC 调优原则
在调优之前,我们需要记住下面的原则:
多数的 Java 应用不需要在服务器上进行 GC 优化;
多数导致 GC 问题的 Java 应用,都不是因为我们参数设置错误,而是代码问题;
在应用上线之前,先考虑将机器的 JVM 参数设置到最优(最适合);
减少创建对象的数量;
减少使用全局变量和大对象;
GC 优化是到最后不得已才采用的手段;
在实际使用中,分析 GC 情况优化代码比优化 GC 参数要多得多。
GC 调优目的
将转移到老年代的对象数量降低到最小;
减少 GC 的执行时间。
策略 1:将新对象预留在新生代,由于 Full GC 的成本远高于 Minor GC,因此尽可能将对象分配在新生代是明智的做法,实际项目中根据 GC 日志分析新生代空间大小分配是否合理,适当通过“-Xmn”命令调节新生代大小,最大限度降低新对象直接进入老年代的情况。
策略 2:大对象进入老年代,虽然大部分情况下,将对象分配在新生代是合理的。但是对于大对象这种做法却值得商榷,大对象如果首次在新生代分配可能会出现空间不足导致很多年龄不够的小对象被分配的老年代,破坏新生代的对象结构,可能会出现频繁的 full gc。因此,对于大对象,可以设置直接进入老年代(当然短命的大对象对于垃圾回收老说简直就是噩梦)。-XX:PretenureSizeThreshold 可以设置直接进入老年代的对象大小。
策略 3:合理设置进入老年代对象的年龄,-XX:MaxTenuringThreshold 设置对象进入老年代的年龄大小,减少老年代的内存占用,降低 full gc 发生的频率。
策略 4:设置稳定的堆大小,堆大小设置有两个参数:-Xms 初始化堆大小,-Xmx 最大堆大小。
策略5:注意:如果满足下面的指标,则一般不需要进行 GC 优化:
MinorGC 执行时间不到50ms;
Minor GC 执行不频繁,约10秒一次;
Full GC 执行时间不到1s;
Full GC 执行频率不算频繁,不低于10分钟1次。
已在知识星球更新源码解析如下:
如果你喜欢这篇文章,喜欢,转发。
生活很美好,明天见(。・ω・。)ノ♡
以上是关于常用jvm参数配置的主要内容,如果未能解决你的问题,请参考以下文章