博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JVM GC优化思路
阅读量:3726 次
发布时间:2019-05-22

本文共 949 字,大约阅读时间需要 3 分钟。

JVM的GC一般分为Young GC和Full GC,而Full GC由于STW(stop the world)需要消耗的时间一般情况比Young GC要多很多,所以GC优化思路是尽量减少Full GC的频率,减少STW以提升性能。

现在我们知道了JVM优化的方向是减少Full GC的频率,要减少Full GC的频率必然要知道对象是如何进入老年代的。

那么我们先考虑几个问题,Young GC、Full GC何时触发?对象如何进入老年代?

1、Young GC何时触发?

当新生代Eden区或者Survivor区空间不足时会触发Young GC。

2、Full GC何时触发?

1.老年代可用空间小于新生代存活对象所占空间,如果没有开启空间担保参数直接触发Full GC。

2.老年代可用空间小于新生代平均进入老年代的大小,提前触发Full GC。

3.新生代Young GC后的存活对象大于Survivor直接进入老年代,老年代内存不足触发Full GC。

3、对象如何进入老年代?

1.躲过15次GC,达到15岁高龄之后进入老年代。

2.动态年龄判定规则,如果Survivor区域 年龄1+...+年龄n 对象总和大于Survivor区域的50%,此时年龄n以上的对象会进入老年代,不一定要达到15岁。

3.如果一次Young GC后存活对象太多无法进入Survivor区域,直接进入老年代。

4.大对象直接进入老年代。

4、JVM GC优化

现在我们知道了JVM GC优化的方向是让对象尽可能的存活在新生代进行Young GC,那么我们根据第三个问题 对象如何进入老年代 来进行针对性的优化。

JVM年龄和大对象直接进入老年代一般优化系数比较低。

主要优化的是动态年龄判定规则对象超过Survivor区域50%进入老年代和Young GC过后存活对象太多无法进入Survivor区域直接进入老年代这两种情况。

也就是说一次Young GC过后存活的对象可以放入一个Survivor并且尽量不要大于Survivor的50%。

主要设置的参数是新生代的内存大小以及新生代Eden和Survivor的比例,具体大小需要根据JVM GC日志情况来具体设计,这些内容不在本篇文章中,后续会有具体分析。

转载地址:http://qgtnn.baihongyu.com/

你可能感兴趣的文章
IntelJ idea下lombok 不生效的问题
查看>>
此时此刻
查看>>
IDEA不区分大小写设置
查看>>
log4j与slf4j的区别
查看>>
Springboot简单使用slf4j记录日志
查看>>
IDEA类模板设置
查看>>
@ConfigurationProperties 注解使用
查看>>
Re-run Spring Boot Configuration Annotation Processor to update generated metadata警告
查看>>
String...的用法
查看>>
Collections.singletonList使用方法
查看>>
StringUtils.join()方法与String.join()方法的使用
查看>>
@NoArgsConstructor && @AllArgsContructor
查看>>
Maven-dependencyManagement的使用
查看>>
maven报错 java.lang.RuntimeException: com.google.inject.CreationException: Unable to create injector,
查看>>
Maven依赖不能注入
查看>>
intellij IDEA 如何设置默认的maven配置?
查看>>
Intellij IDEA 鼠标放到类,方法,变量上 显示相关信息
查看>>
复刻计划之二
查看>>
Shiro 提供的AES 对称式加密/解密方式——AesCipherService的使用案例
查看>>
数据库不熟悉字段
查看>>