java触发full gc的几种情况概述
前言
近期被问及这个问题,在此记录整理一下。
System.gc()方法的调用
此方法的调用是建议JVM进行Full GC,虽然只是建议而非一定,但很多情况下它会触发 Full GC,从而增加Full GC的频率,也即增加了间歇性停顿的次数。强烈影响系建议能不使用此方法就别使用,让虚拟机自己去管理它的内存,可通过通过-XX:+ DisableExplicitGC来禁止RMI调用System.gc。
老年代空间不足
老年代空间只有在新生代对象转入及创建为大对象、大数组时才会出现不足的现象,当执行Full GC后空间仍然不足,则抛出如下错误:
java.lang.OutOfMemoryError: Java heap space
为避免以上两种状况引起的Full GC,调优时应尽量做到让对象在Minor GC阶段被回收、让对象在新生代多存活一段时间及不要创建过大的对象及数组。
永生区空间不足
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。
CMS GC时出现promotion failed和concurrent mode failure
对于采用CMS进行老年代GC的程序而言,尤其要注意GC日志中是否有promotion failed和concurrent mode failure两种状况,当这两种状况出现时可能
会触发Full GC。
promotion failed是在进行Minor GC时,survivor space放不下、对象只能放入老年代,而此时老年代也放不下造成的;concurrent mode failure是在
执行CMS GC的过程中同时有对象要放入老年代,而此时老年代空间不足造成的(有时候“空间不足”是CMS GC时当前的浮动垃圾过多导致暂时性的空间不足触发Full GC)。
对措施为:增大survivor space、老年代空间或调低触发并发GC的比率,但在JDK 5.0+、6.0+的版本中有可能会由于JDK的bug29导致CMS在remark完毕
后很久才触发sweeping动作。对于这种状况,可通过设置-XX: CMSMaxAbortablePrecleanTime=5(单位为ms)来避免。
统计得到的Minor GC晋升到旧生代的平均大小大于老年代的剩余空间
这是一个较为复杂的触发情况,Hotspot为了避免由于新生代对象晋升到旧生代导致旧生代空间不足的现象,在进行Minor GC时,做了一个判断,如果之
前统计所得到的Minor GC晋升到旧生代的平均大小大于旧生代的剩余空间,那么就直接触发Full 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。
堆中分配很大的对象
所谓大对象,是指需要大量连续内存空间的java对象,例如很长的数组,此种对象会直接进入老年代,而老年代虽然有很大的剩余空间,但是无法找到足够大的连续空间来分配给当前对象,此种情况就会触发JVM进行Full GC。
为了解决这个问题,CMS垃圾收集器提供了一个可配置的参数,即-XX:+UseCMSCompactAtFullCollection开关参数,用于在“享受”完Full GC服务之后额外免费赠送一个碎片整理的过程,内存整理的过程无法并发的,空间碎片问题没有了,但提顿时间不得不变长了,JVM设计者们还提供了另外一个参数 -XX:CMSFullGCsBeforeCompaction,这个参数用于设置在执行多少次不压缩的Full GC后,跟着来一次带压缩的。
java触发full gc的几种情况概述相关推荐
- full gc JAVA_java触发full gc的几种情况概述
前言 近期被问及这个问题,在此记录整理一下. System.gc()方法的调用 此方法的调用是建议JVM进行Full GC,虽然只是建议而非一定,但很多情况下它会触发 Full GC,从而增加Full ...
- java 手动触发gc_java触发full gc的几种情况整理
前言 近期被问及这个问题,在此记录整理一下. System.gc()方法的调用 此方法的调用是建议JVM进行Full GC,虽然只是建议而非一定,但很多情况下它会触发 Full GC,从而增加Full ...
- Java线程死亡(死掉、退出、挂掉)的几种情况
文章目录 1. Java线程死亡的几种情况 2. 验证上述结论 2.1 测试1:线程正常结束后,isAlive()返回False 2.2 测试2:子线程抛出异常之后,线程的isAlive()返回Fal ...
- 转list_你知道Java数组转List的三种方式及对比吗?
前言: 本文介绍Java中数组转为List三种情况的优劣对比,以及应用场景的对比,以及程序员常犯的类型转换错误原因解析. 一.最常见方式(未必最佳) 通过 Arrays.asList(strArray ...
- Qt中槽函数触发两次的两种场景分析
在Qt开发中,有两种情况能够触发槽函数被触发两次,第一种情况是必现的,属于错误的写法,是指信号和槽关联两次:第二种情况是偶然出现的,是指对信号没有正确理解导致的. 1.信号与槽关联两次 通常这 ...
- Java 数组转 List 的三种方式及对比
来源 | blog.csdn.net/x541211190/article/details/79597236 本文介绍Java中数组转为List三种情况的优劣对比,以及应用场景的对比,以及程序员常犯的 ...
- Java数组转List的三种方式及对比
前言: 本文介绍Java中数组转为List三种情况的优劣对比,以及应用场景的对比,以及程序员常犯的类型转换错误原因解析. 一.最常见方式(未必最佳) 通过 Arrays.asList(strArray ...
- Java 数组转 List 的 4 种方式
https://blog.csdn.net/qidasheng2012/article/details/115112452 目录 前言 [一]最常见方式(未必最佳) [二]数组转为List后,支持增删 ...
- java强制fullgc_触发Full GC执行的情况 以及其它补充信息
除直接调用System.gc外,触发Full GC执行的情况有如下四种. 1. 旧生代空间不足 旧生代空间只有在新生代对象转入及创建为大对象.大数组时才会出现不足的现象,当执行Full GC后空间仍然 ...
最新文章
- GitHub 2021年度报告发布:中国755万开发者排名全球第二!
- “移花接木”修复E680i系统内部错误
- 36.需要析构函数的类也需要拷贝和赋值操作
- 东南大学RM装甲板识别算法详解
- json字符串、json对象、数组之间的转换
- ZOJ 3490 String Successor
- 螃蟹先生2 android,螃蟹先生2
- scala正则表达式 findFirstIn findAllIn findFirstMatchIn findAllMatchIn Match MatchData 提取分组
- Java图书管理系统(控制台程序)
- 英雄无敌王朝 服务器维护,《魔法门之英雄无敌:王朝》版本更新公告
- 世界各个地区WIFI 2.4G及5G信道划分表(附无线通信频率分配表)
- 惠普电脑按F12锁屏如何解?
- 网页使用微信扫码登录
- a16z合伙人Chris Dixon:DeFi和NFT之后的下一波区块链应用浪潮可能是这些
- HTML表格自动排序
- rewind java_具有rewind()/ reset()功能的Java文件输入
- 带你彻底搞懂MyBatis的底层实现之缓存模块(Cache)-吊打面试官必备技能
- ckeditor4 +Wiris MathType + Mathjax 渲染 + Tax 公式编辑
- Electron-Vue + Element-UI 制作图片压缩工具实战
- linux 给文件改名字
热门文章
- node mysql批量写入_如何使用node.js在MySQL中进行批量插入
- mysql主键更新被锁_MySQL 的加锁处理,你都了解的一清二楚了吗?
- Spring Security过滤器就该这么配置!
- 用JAVA写的word模板自动生成引擎
- 皮一皮:也许是全国最敬业的体育老师...
- 皮一皮:绿灯侠是怎么诞生的...
- 完美,竟然用一个脚本就把系统升级到https了,且永久免费!
- 《最受欢迎的女友职业排行榜Top10》
- 每日一皮:完美的配合...虽然有点怪...
- javascript清除map所占内存_【原创.54期】 JavaScript的V8引擎初探