一文搞懂Y-GC和Full GC的触发条件

简介: 1 Young GC触发时机一般在新生代Eden区满后触发,采用复制算法回收新生代垃圾。

1 Young GC触发时机


一般在新生代Eden区满后触发,采用复制算法回收新生代垃圾。


2 Old GC和Full GC的触发时机


2.1

发生Young GC前检查,若


老 年 代 可 用 连 续 内 存 空 间 < 新 生 代 历 次 Y o u n g G C 后 升 入 老 年 代 的 对 象 总 和 的 平 均 大 小 老年代可用连续内存空间 < 新生代历次Young GC后升入老年代的对象总和的平均大小老年代可用连续内存空间<新生代历次YoungGC后升入老年代的对象总和的平均大小


说明本次Y-GC后,可能升入老年代的对象大小超过老年代当前可用内存空间,此时必须先触发一次Old GC给老年代腾出空间,再执行Young GC。


2.2 执行Y-GC后,有一批对象需要放入老年代

但此时老年代无足够内存空间存放这些对象,此时必须立即触发一次Old GC。


2.3 老年代内存使用率超过92%,直接触发Old GC

这个比例是可以通过参数调整的。


Old GC执行时,一般都会带上一次Y-GC,一般Old GC很可能就是在Young GC之前或之后触发,所以自然Old GC一般都会跟一次Young GC连带关联在一起了。


很多JVM实现里,其实在上述几种条件达到时,他触发的实际上就是Full GC,其实满足上述一些条件时,在GC日志中看到的就是Full GC字样。


但是这个东西其实没办法给大家一个准确的定义,说到底触发Full GC的时候,是先执行Young GC?还是先执行Old GC?不同Full GC触发条件不一样,而且不同JVM版本实现也不同。


所以只能概括:上述条件满足时触发Full GC,Full GC一般会带上一次Young GC 去回收新生代,同时也会有Old GC也回收老年代,还会去回收永久代。


永久代满了咋办?


假如存放类信息、常量池的永久代满了后,就会触发一次Full GC。


这样Full GC执行时,就会顺带把永久代中的垃圾给回收了,但永久代中的垃圾一般很少,因为里面存放的都是一些类,还有常量池之类的东西,这些东西通常无需回收。如果永久代真的放满了,回收之后发现没腾出来更多的地方,此时只能抛出内存不够异常。


目录
相关文章
|
SQL 监控 关系型数据库
【MYSQL高级】Mysql找出执行慢的SQL【慢查询日志使用与分析】
【MYSQL高级】Mysql找出执行慢的SQL【慢查询日志使用与分析】
4718 0
|
传感器 算法
【STM32】I2C练习,HAL库读取MPU6050角度陀螺仪
【STM32】I2C练习,HAL库读取MPU6050角度陀螺仪
1029 0
基于宜搭的“设备报修”实践案例
设备报修是各企业、学校、医院等单位必不可少的应用场景,包括设备管理、用户报修、报修单管理、派单管理、维修管理等。那么,如何利用宜搭+钉钉实现高效的设备报修管理呢?
基于宜搭的“设备报修”实践案例
|
12月前
|
Java Spring 容器
@Resource 和 @Autowired 介绍 为什么使用 @Autowired 会报错,改成@Resource 就对了
本文介绍了`@Autowired`和`@Resource`两种依赖注入注解的区别及使用场景,并解释了为什么在某些情况下使用`@Autowired`会导致错误,而改成`@Resource`则可以解决问题。
891 0
|
11月前
|
存储 JSON Java
ELK 圣经:Elasticsearch、Logstash、Kibana 从入门到精通
ELK是一套强大的日志管理和分析工具,广泛应用于日志监控、故障排查、业务分析等场景。本文档将详细介绍ELK的各个组件及其配置方法,帮助读者从零开始掌握ELK的使用。
|
存储 算法 NoSQL
|
Java
Java中的throw和throws:异常处理详解
Java中的throw和throws:异常处理详解
1141 0
|
11月前
|
Web App开发 JavaScript 前端开发
使用 Chrome 浏览器的内存分析工具来检测 JavaScript 中的内存泄漏
【10月更文挑战第25天】利用 Chrome 浏览器的内存分析工具,可以较为准确地检测 JavaScript 中的内存泄漏问题,并帮助我们找出潜在的泄漏点,以便采取相应的解决措施。
1234 9
|
存储 消息中间件 JSON
DDD基础教程:一文带你读懂DDD分层架构
DDD基础教程:一文带你读懂DDD分层架构