文档章节

什么时候会发生FullGC

Hosee
 Hosee
发布于 2016/05/12 18:12
字数 1360
阅读 2K
收藏 13

堆内存划分为 Eden、Survivor 和 Tenured/Old 空间,如下图所示:

从年轻代空间(包括 Eden 和 Survivor 区域)回收内存被称为 Minor GC,对老年代GC称为Major GC,而Full GC是对整个堆来说的,在最近几个版本的JDK里默认包括了对永生代即方法区的回收(JDK8中无永生带了),出现Full GC的时候经常伴随至少一次的Minor GC,但非绝对的。Major GC的速度一般会比Minor GC慢10倍以上。下边看看有那种情况触发JVM进行Full GC及应对策略。

1. System.gc()方法的调用

此方法的调用是建议JVM进行Full GC,虽然只是建议而非一定,但很多情况下它会触发 Full GC,从而增加Full GC的频率,也即增加了间歇性停顿的次数。强烈影响系建议能不使用此方法就别使用,让虚拟机自己去管理它的内存,可通过通过-XX:+ DisableExplicitGC来禁止RMI调用System.gc。

2、老年代空间不足

老年代空间只有在新生代对象转入及创建大对象、大数组时才会出现不足的现象,当执行Full GC后空间仍然不足,则抛出如下错误:
java.lang.OutOfMemoryError: Java heap space 
为避免以上两种状况引起的Full GC,调优时应尽量做到让对象在Minor GC阶段被回收、让对象在新生代多存活一段时间及不要创建过大的对象及数组。

3、永生区空间不足

JVM规范中运行时数据区域中的方法区,在HotSpot虚拟机中又被习惯称为永生代或者永生区,Permanet Generation中存放的为一些class的信息、常量、静态变量等数据,当系统中要加载的类、反射的类和调用的方法较多时,Permanet Generation可能会被占满,在未配置为采用CMS GC的情况下也会执行Full GC。如果经过Full GC仍然回收不了,那么JVM会抛出如下错误信息:
java.lang.OutOfMemoryError: PermGen space 
为避免Perm Gen占满造成Full GC现象,可采用的方法为增大Perm Gen空间或转为使用CMS GC。

4、CMS GC时出现promotion failed和concurrent mode failure

对于采用CMS进行老年代GC的程序而言,尤其要注意GC日志中是否有promotion failed和concurrent mode failure两种状况,当这两种状况出现时可能会触发Full GC。

具体原因和解决方案可以查看使用CMS垃圾收集器产生的问题和解决方案

5、HandlePromotionFailure

在发生Minor GC之前,虚拟机会先检查老年代最大可用的连续空间是否大于新生代所有对象总空间,如果这个条件成立,那么Minor GC可以确保是安全的。如果不成立,则虚拟机会查看HandlePromotionFailure设置值是否允许担保失败。如果允许,那么会继续检查老年代最大可用的连续空间是否大于历次晋升到老年代对象的平均大小,如果大于,将尝试着进行一次Minor GC,尽管这次Minor GC是有风险的;如果小于,或者HandlePromotionFailure设置不允许冒险,那这时也要改为进行一次Full GC。

统计得到的Minor GC晋升到老年代的平均大小大于老年代的剩余空间,这是一个较为复杂的触发情况,例如程序第一次触发Minor GC后,有6MB的对象晋升到老年代,那么当下一次Minor GC发生时,首先检查老年代的剩余空间是否大于6MB,如果小于6MB,则执行Full GC。
当新生代采用PS GC时,方式稍有不同,PS GC是在Minor GC后也会检查,例如上面的例子中第一次Minor GC后,PS GC会检查此时旧生代的剩余空间是否大于6MB,如小于,则触发对旧生代的回收。
除了以上4种状况外,对于使用RMI来进行RPC或管理的Sun JDK应用而言,默认情况下会一小时执行一次Full GC。可通过在启动时通过  java -Dsun.rmi.dgc.client.gcInterval=3600000来设置Full GC执行的间隔时间或通过-XX:+ DisableExplicitGC来禁止RMI调用System.gc。

6、堆中分配很大的对象

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

为了解决这个问题,CMS垃圾收集器提供了一个可配置的参数,即-XX:+UseCMSCompactAtFullCollection开关参数,用于在“享受”完Full GC服务之后额外免费赠送一个碎片整理的过程,内存整理的过程无法并发的,空间碎片问题没有了,但提顿时间不得不变长了,JVM设计者们还提供了另外一个参数 -XX:CMSFullGCsBeforeCompaction,这个参数用于设置在执行多少次不压缩的Full GC后,跟着来一次带压缩的。

 

本文转载自:http://blog.csdn.net/chenleixing/article/details/46706039

Hosee
粉丝 621
博文 135
码字总数 209956
作品 0
杭州
程序员
私信 提问
加载中

评论(0)

【原创】JVM01 | GC这么好, 做了什么频繁引起服务超时?

     前言   这是 JVM 系列文章的第一篇。说明一下 GC 的重要性。   故障描述   某年某月某日 上午,线上发生故障,经过排查,发现某核心服务 Dubbo 接口超时。      故障根源...

java进阶架构师
2019/11/26
0
0
一些长时间GC停顿问题的排查及解决办法

对于许多企业级应用,尤其是OLTP应用来说,长暂停很可能导致服务超时,而对这些运行在JVM上的应用来说,垃圾回收(GC)可能是长暂停最主要的原因。本文将描述一些可能碰到GC长暂停的不同场景...

一看就喷亏的小猿
2019/04/22
61
0
关于GC(上):Apache的POI组件导致线上频繁FullGC问题排查及处理全过程

某线上应用在进行查询结果导出Excel时,大概率出现持续的FullGC。解决这个问题时,记录了一下整个的流程,也可以作为一般性的FullGC问题排查指导。 1. 生成dump文件 为了定位FullGC的原因,首...

五岳
2019/11/11
0
0
如何合理的规划一次jvm性能调优

这是jvm优化系列第三篇: jvm优化——垃圾回收 jvm优化——监控工具 JVM性能调优涉及到方方面面的取舍,往往是牵一发而动全身,需要全盘考虑各方面的影响。但也有一些基础的理论和原则,理解...

wier
2017/10/25
5.5K
9
优化JVM:决定Java堆的大小以及内存占用

http://blog.csdn.net/zhoutao198712/article/details/7783070 到目前为止,还没有做明确的优化工作。只是做了初始化选择工作,比如说:JVM部署模型、JVM运行环境、收集哪些垃圾回收器的信息...

毛朱
2017/10/18
111
0

没有更多内容

加载失败,请刷新页面

加载更多

美律师事务所Thornton对瑞幸咖啡提起诉讼

据国外媒体报道,美国Thornton Law Firm LLP律师事务所今日提醒投资者,已代表瑞幸咖啡(Nasdaq:LK)股东对该公司提起诉讼。Thornton Law Firm LLP表示,在2016年4月1日至2020年4月2日期间购...

osc_ix000whh
24分钟前
33
0
jdk8新特性之八日期时间API

引言 java 8通过发布新的Date-Time API进一步加强对日期与时间的处理。在旧版的java中,日期时间APi存在诸多问题。java 8引入的新的一系列API,对时间日期处理提供了更好的支持,清楚的定义了...

阿丹博客-adanblog
25分钟前
19
0
苹果专利显示:True Tone原彩显示技术将用于MacBook键盘、自动调整背光

True Tone(原彩显示)是iPhone、iPad领先竞品的一项重要功能,它借助多通道环境光传感器来智能调整屏幕显示色调,达到让人眼更舒服的效果。True Tone首次应用在9.7寸iPad上,如今iPhone、M...

osc_feglqvps
26分钟前
17
0
Wolfpack Research看空爱奇艺 称用户数量夸大60%

“卖空”研究公司Wolfpack Research今日在其网站上发布报告称,爱奇艺早在2018年IPO(首次公开招股)之前就存在欺诈行为,而且此后也一直在这样做。Wolfpack Research将爱奇艺与另一家中国公...

osc_gwtkg2dc
26分钟前
21
0
Switch全系告破 黑客开售硬件模块:4月底发货

在经历漫长的预热以及因为疫情致工厂停工的延期后,TX团队(Team-Xecuter)正式宣布启动Switch破解模块的预购。同时,TX团队还放出了安装破解模块(modchip)后的主板高清照片。 访问购买页面...

osc_7ludm6s2
27分钟前
23
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部