什么时候触发GC

简介: 什么时候触发GC

什么时候触发Young GC----针对年轻代


当Eden区满了的时候,会触发Young GC


什么时候触发 Full GC----针对整个堆


  1. 在发生Young GC的时候,虚拟机会检测之前每次晋升到老年代的平均大小是否大于年老代的剩余空间,如果大于,则直接进行Full GC;
  2. 如果小于,但设置了Handle PromotionFailure,那么也会执行Full GC。


-XX:HandlePromotionFailure:是否设置空间分配担保
JDK7及以后这个参数就失效了.
只要老年代的连续空间大于新生代对象的总大小或者历次晋升到老年代的对象的平均大小就进行MinorGC,否则FullGC
  1. 永久代空间不足,会触发Full GC
  2. System.gc()也会触发Full GC
  3. 堆中分配很大的对象


所谓大对象,是指需要大量连续内存空间的java对象,例如很长的数组,此种对象会直接进入老年代,而老年代虽然有很大的剩余空间,但是无法找到足够大的连续空间来分配给当前对象,此种情况就会触发JVM进行Full GC。


-XX:+UseCMSCompactAtFullCollection:设置CMS收集器在完成垃圾收集后是否要进行一次内存碎片的整理

为了解决大对象这个问题,CMS垃圾收集器提供了一个可配置的参数,即-XX:+UseCMSCompactAtFullCollection开关参数,用于在“享受”完Full GC服务之后额外免费赠送一个碎片整理的过程。


-XX:CMSFullGCsBeforeCompaction:设定进行多少次CMS垃圾回收后,进行一次内存压缩

内存整理的过程无法并发的,空间碎片问题没有了,停顿时间不得不变长了,JVM设计者们还提供了另外一个参数 -XX:CMSFullGCsBeforeCompaction,这个参数用于设置在执行多少次不压缩的 Full GC 后,跟着来一次带压缩的。


  1. CMS GC concurrent mode failure 问题

concurrent mode failure是在执行CMS GC的过程中同时业务线程将对象放入老年代,而此时老年代空间不足,这时 CMS 还没有机会回收老年带产生的,或者在做 Minor GC的时候,新生代救助空间放不下,需要放入老年代,而老年代也放不下而产生的。


CMS GC----针对年老代



配置了-XX:CMSInitiatingOccupancyFraction=75和-XX:+UseCMSInitiatingOccupancyOnly,设定CMS在对内存占用率达到75%的时候开始GC
配置了-XX:+CMSClassUnloadingEnabled,CMSInitiatingPermOccupancyFraction=80%,即:Perm Gen的使用达到一定的比率,默认为92%
配置了-XX:+ExplicitGCInvokesConcurrent,且未配置-XX:+DisableExplicitGC的情况下,显示调用了System.gc()


CMS在并发模式工作的时候是只收集老年代的。但一旦并发模式失败(发生concurrent mode failure)就有选择性的会进行全堆收集,也就是退回到Full GC。

相关文章
|
存储 缓存 编译器
探索 Jetpack Compose 内核:深入 SlotTable 系统
探索 Jetpack Compose 内核:深入 SlotTable 系统
556 1
|
存储 分布式计算 资源调度
ZooKeeper详解
ZooKeeper是大数据组件中的协调器,确保高可用性和一致性。它用于监控主备节点切换(如Hadoop YARN的ResourceManager,HBase的RegionServer,Spark的Master)并实现数据同步。设计基于文件系统和通知机制,通过Znodes的状态变化(创建、删除、更新、子节点变化)进行协调。ZooKeeper使用观察者模式,当Znode变化时,通知客户端。其数据结构为树形,提供CLI工具如`zkCli.sh`进行交互。ZooKeeper有三个默认端口:2181(客户端连接),2888(服务器间同步),3888(选举)。选举采用半数机制,确保集群稳定性。
516 1
ZooKeeper详解
|
JavaScript Java Go
后端开发中常用的编程语言
【10月更文挑战第12天】后端开发中常用的编程语言
1061 8
|
存储 缓存 Java
JVM的即时编译(JIT)优化原理:加速程序的执行
JVM的即时编译(JIT)优化原理:加速程序的执行
|
运维 Kubernetes 算法
Java堆内存又溢出了!教你一招必杀技
Java堆内存又溢出了!教你一招必杀技
|
缓存 算法 编译器
C/C++编译器内存优化技术:内存优化关注程序对内存的访问和使用,以提高内存访问速度和减少内存占用。
C/C++编译器内存优化技术:内存优化关注程序对内存的访问和使用,以提高内存访问速度和减少内存占用。
557 0
|
XML 缓存 Java
面试官:讲讲Spring框架Bean的加载过程
面试官:讲讲Spring框架Bean的加载过程
1301 0
面试官:讲讲Spring框架Bean的加载过程
|
设计模式 前端开发 JavaScript
通用后端开发说明及开发规范
通用后端开发说明及开发规范
1091 0
|
SQL 存储 大数据
flink standalone 部署模式且不能使用 hdfs 场景下的各种问题及其应对方案
flink standalone 部署模式且不能使用 hdfs 场景下的各种问题及其应对方案
|
算法 Java
JVM的GC机制和常见GC算法
@[toc] 1. 堆内存的分代 2. GC分类 3. 什么是GC 3.1 需要GC的内存区域 3.2 GC回收的对象 3.3 判断对象存活的两种算法 3.3.1 引用计数 3.3.2 可达性分析 3.4 什么时候触发GC 4. 常见的GC算法 4.1 标记-清除算法 4.2 复制算法 4.3 标记-压缩算法
314 0