什么情况下会触发 Java 的 Full GC?
什么情况下会触发 Java 的 Full GC?
Full GC(完全垃圾回收)是 Java 中的一个重要垃圾回收阶段,它会回收 整个堆内存,包括 新生代 和 老年代。触发 Full GC 的条件通常比 Young GC 更为复杂且影响较大,因为它会导致 JVM 停顿时间较长。下面是一些常见的触发 Full GC 的情况:
1. 老年代内存不足
- 当 老年代 的内存空间不足时,JVM 会触发 Full GC。
- 在垃圾回收过程中,如果 新生代 的回收没有释放足够的内存空间供老年代使用,或者 老年代 的对象数量增多导致空间耗尽时,会触发 Full GC。
例子:
- 在 Minor GC 后,如果新生代的对象经过若干次晋升后占用了大量的老年代空间,老年代内存不足时,会触发 Full GC。
2. 长时间没有进行过 Full GC
- 如果 JVM 在长时间内没有执行过 Full GC,并且 新生代 和 老年代 的内存空间都已经满了,JVM 会自动触发 Full GC 来释放内存。
例子:
- 如果一个应用程序长期运行并且 Minor GC 无法回收足够的内存来供老年代使用,可能会触发 Full GC。
3. 调用 System.gc()
- 如果显式调用了
System.gc()方法,JVM 会尝试执行 Full GC。 - 这个方法虽然建议避免使用,因为它会增加不必要的性能开销,但仍然会强制进行 Full GC。
例子:
System.gc(); // 强制调用 Full GC
4. 内存溢出(OutOfMemoryError)
- 当 JVM 遇到内存溢出的情况时,可能会触发 Full GC。例如,当老年代空间不足以存放对象时,Full GC 会被触发。但如果内存依然不足,最终会抛出
OutOfMemoryError。
例子:
- 当老年代的空间无法为新对象分配内存时,JVM 会尝试进行 Full GC,但如果回收后仍然无法满足要求,就会抛出内存溢出异常。
5. JVM 参数的调整
- 某些 JVM 参数的调整可能会导致 Full GC 的触发。例如:
- -XX:MinHeapFreeRatio 和 -XX:MaxHeapFreeRatio:控制堆内存空闲比例,可能会触发 Full GC。
- -XX:SurvivorRatio:调整 Survivor 区 和 Eden 区 的比例,如果调整后内存压力较大,可能会触发 Full GC。
例子:
- 修改
-Xmx或-Xms参数时,JVM 可能会执行 Full GC 来调整堆内存大小。
6. 堆内存的配置发生变化
- 修改堆内存配置,如 最大堆内存大小 或 初始堆内存大小,可能会导致堆内存的重新分配,从而触发 Full GC。
例子:
- 修改启动参数
-Xmx或-Xms时,JVM 会重新分配堆内存,可能会触发 Full GC。
7. 垃圾回收器的切换
- 在一些情况下,当 JVM 切换垃圾回收器时,例如从 Parallel GC 切换到 G1 GC,也可能触发一次 Full GC 来适应新的垃圾回收策略。
例子:
- 启用
-XX:+UseG1GC配置时,JVM 可能会执行一次 Full GC 来完成策略调整。
8. 类加载过程
- 在类加载过程中,尤其是当加载大量类时,如果内存不足,JVM 会触发 Full GC 来释放空间。特别是在 Metaspace(JDK 8 及以后)或 PermGen(JDK 7 及以前)空间不足时,可能会发生 Full GC。
例子:
- 动态加载大量类时,可能会导致 Metaspace 空间不足,从而触发 Full GC。
总结
| 触发条件 | 描述 |
|---|---|
| 老年代内存不足 | 当老年代空间不足时,触发 Full GC。 |
| 长时间未执行 Full GC | 如果长时间没有进行过 Full GC,内存压力增大时会触发。 |
调用 System.gc() |
显式调用 System.gc() 方法会触发 Full GC。 |
| 内存溢出(OutOfMemoryError) | 当内存溢出发生时,Full GC 会被触发来尝试回收内存。 |
| JVM 参数调整 | 修改堆内存大小或其他内存参数时,JVM 可能会触发 Full GC。 |
| 堆内存配置变化 | 堆内存的配置发生变化时,JVM 可能会执行一次 Full GC。 |
| 垃圾回收器切换 | 在垃圾回收器切换时,可能会触发 Full GC。 |
| 类加载过程 | 在加载类时,如果内存不足,也可能触发 Full GC。 |
结论:
Full GC 是在堆内存出现压力时,特别是老年代空间不足时触发的,它会回收整个堆内存,包括新生代和老年代。由于 Full GC 会导致较长时间的停顿,因此在应用中需要尽量避免频繁触发。
什么情况下会触发 Java 的 Full GC?的更多相关文章
- Java面试题之什么情况下会触发类的初始化
以下情况会触发类的初始化: 遇到new,getstatic,putstatic,invokestatic这4条指令: 使用java.lang.reflect包的方法对类进行反射调用: 初始化一个类的时 ...
- 什么情况下不能使用 Java 泛型
1. 前言 Java 1.5 引入了泛型来保证类型安全,防止在运行时发生类型转换异常,让类型参数化,提高了代码的可读性和重用率.但是有些情况下泛型也是不允许使用的,今天就总结一下编码中不能使用泛型的一 ...
- 触发JVM进行Full GC的情况及应对策略
堆内存划分为 Eden.Survivor 和 Tenured/Old 空间,如下图所示: 从年轻代空间(包括 Eden 和 Survivor 区域)回收内存被称为 Minor GC,对老年代GC称为M ...
- @Java Web 程序员,我们一起给程序开个后门吧:让你在保留现场,服务不重启的情况下,执行我们的调试代码
一.前言 这篇算是类加载器的实战第五篇,前面几篇在这里,后续会持续写这方面的一些东西. 实战分析Tomcat的类加载器结构(使用Eclipse MAT验证) 还是Tomcat,关于类加载器的趣味实验 ...
- Java之HashMap在多线程情况下导致死循环的问题
PS:不得不说Java编程思想这本书是真心强大.. 学习内容: 1.HashMap<K,V>在多线程的情况下出现的死循环现象 当初学Java的时候只是知道HashMap<K,V& ...
- java 哪些情况下会使对象锁释放
Java_多线程_锁释放 问:Java多线程运行环境中,在哪些情况下会使对象锁释放?答:由于等待一个锁的线程只有在获得这把锁之后,才能恢复运行,所以让持有锁的线程在不再需要锁的时候及时释放锁是很重要的 ...
- Java基础知识强化之IO流笔记06:有return的情况下try catch finally的执行顺序
1. 给出结论: (1)不管有木有出现异常,finally块中代码都会执行:(2)当try和catch中有return时,finally仍然会执行:(3)finally是在return后面的表达式运算 ...
- Java高并发情况下的锁机制优化
本文主要讲并行优化的几种方式, 其结构如下: 锁优化 减少锁的持有时间 例如避免给整个方法加锁 1 public synchronized void syncMethod(){ 2 othercode ...
- layoutSubviews 在什么情况下会被触发
layoutSubviews在以下情况下会被调用: 1.init初始化不会触发layoutSubviews 2.addSubview会触发layoutSubviews 3.设置view的Frame会触 ...
- 【Java面试题】25 同步和异步有何异同,在什么情况下分别使用他们?举例说明。
如果数据将在线程间共享.例如正在写的数据以后可能被另一个线程读到,或者正在读的数据可能已经被另一个线程写过了,那么这些数据就是共享数据,必须进行同步存取. 当应用程序在对象上调用了一个需要花费很长时间 ...
随机推荐
- NSSM:简化Windows服务配置,提升系统维护效率
NSSM:简化Windows服务配置,提升系统维护效率 在Windows系统环境中,服务的配置与管理是一项复杂而重要的任务.传统的服务管理方式往往涉及繁琐的步骤,不仅效率低下,还容易出错.然而,随着N ...
- 如何在M芯片的Mac上爽玩原神
[热点速递]苹果震撼发布全新M4 Mac mini,国补福利下惊喜价仅约3500元!这不仅是一次办公体验的全新升级,更是对高效能与性价比完美融合的一次致敬.想象一下,以如此亲民的价格,拥抱苹果标志性的 ...
- 【ABP】项目示例(1)——项目搭建前置准备
项目介绍 本项目使用.NET8+ABP+MySql搭建,基于DDD的设计思想,创建分层Web应用程序. 相关文档 .NET开发文档 Entity Framework Core开发文档 ABP开发文档 ...
- 快速集成和使用 solon-flow 规则与流引擎(用 yaml 编写业务规则)
本文参考自:https://www.cnblogs.com/studyjobs/p/18125096 规则引擎技术的主要思想是将应用程序中的业务规则分离出来,业务规则不再以程序代码的形式驻留在系统中, ...
- signature hdr data: BAD (signature 头部数据:不当)
这应该属于 rpm 4.12-4.13 早期版本的BUG,不止CentOS8会这样 解决方式也很干脆,就是手动更新rpm版本,跳过存在bug的版本,然后yum.rpm就都会正常,就可以自动更新最新的软 ...
- QT5笔记:18 QPainter基本绘图
代码 #include "widget.h" #include "ui_widget.h" #include <QPainter> Widget:: ...
- docker - [13] docker网络
smo smo smo "狂神" omz omz omz 一.理解网络 本机回环地址:127.0.0.1,本机IP地址:192.168.2.131,docker地址:172.17. ...
- Typora - typora主题样式
主题名称:github_harley.css(随便命名) 效果:Mac风格的代码块.更舒适的引用块风格. css harley01 /* 代码块主题 */ /* 顶部 */ .md-fences { ...
- Halcon学习教程(二) 测量量测相关(点到线距离,线到线距离,轮廓线距离,一维测量,圆形测量,矩形测量等)
原文作者:aircraft 原文地址:https://www.cnblogs.com/DOMLX/p/18740576 本篇讲一些测量用到的算子和实例,想了解更多就得去看看halcon实例里一维测量里 ...
- NCS开发学习笔记-基础篇-第 1 课 – 安装 nRF Connect SDK 开发环境
练习1 -安装 nRF Connect SDK 开发环境 需要安装的软件 Git python J-Link nrfutil nRF Command Line Tools VScode Chinese ...