什么情况下会触发 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 同步和异步有何异同,在什么情况下分别使用他们?举例说明。
如果数据将在线程间共享.例如正在写的数据以后可能被另一个线程读到,或者正在读的数据可能已经被另一个线程写过了,那么这些数据就是共享数据,必须进行同步存取. 当应用程序在对象上调用了一个需要花费很长时间 ...
随机推荐
- dart 中在实例化 new 关键字可以省略不写
dart 中在实例化 new 关键字可以省略不写 class Person { String name; int age; String sex; Person(this.name, this.age ...
- Django-Admin和第三方插件Xadmin
Admin django内置了一个强大的组件叫Admin,提供给网站管理员快速开发运营后台的管理站点. 站点文档: https://docs.djangoproject.com/zh-hans/2.2 ...
- yum repo和rpm,添加阿里repos
RPMRPM(Red-hat Package Manager),是一个由红帽最早开发出来的包管理器,目前已经是大多数Linux发行的默认包管理器.RPM管理的包都是以.rpm结尾,其中存储了该软件的安 ...
- Hetao P1184 宝可梦训练家 [ 绿 ][ 背包dp ][ 线性dp ]
原题 题解 一道超级牛逼的背包变形,想通之后真的很简单,难点在于想到使用 dp 并且用 dp 的值判断是否合法. 首先观察本题的数据范围:\(1\le n,q \le 10^5\) ,可知本题的询问要 ...
- [BZOJ4833] 最小公倍佩尔数 题解
在这篇题解中,我会将各个部分的证明分成不同的推导过程,以达到逐一击破的效果. 引理 1:\(f(n)=2f(n-1)+f(n-2)\) 我的证明挺繁琐的,过程如下: \[(1+\sqrt 2)^{n- ...
- [luogu1248] 加工生产调度 题解
考虑 \(i\) 排在 \(j\) 前的条件是 \(a_i+\max(a_j,b_i)+b_j\le a_j+\max(a_i,b_j)+b_i\),然后发现这一坨东西是皇后游戏中的倒数第三个式子,直 ...
- git 烂笔头
git 烂笔头 触类旁通, 举一反三, 不求甚解, 欢迎补充 详细介绍 git connect github # 1. 本地配置, 姓名和邮箱 git config --global user.nam ...
- go time包:秒、毫秒、纳秒时间戳输出
时间戳 10 位数的是以 秒 为单位: 13 位数的是以 毫秒 为单位: 19 位数的是以 纳秒 为单位: golang 中可以这样写: package main import ( "fmt ...
- 【VMware VCF】解决 VCF 环境中组件用户密码过期问题。
由于长时间没有启动 VCF 环境,现在在启动 SDDC Manager 组件后,UI 一直处于如下图所示的"初始化"状态.当时第一直觉就认为肯定是 VCF 环境组件的用户密码过期了 ...
- 利用pip/conda安装库时,出现requires XXX, which is not installed/incompatible
博客地址:https://www.cnblogs.com/zylyehuo/ 出现以下提示警告时 step1 step2 step3 总结 利用pip/conda安装库时,出现requires XXX ...