前言

近期被问及这个问题,在此记录整理一下。

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 手动触发gc_java触发full gc的几种情况整理相关推荐

  1. java触发full gc的几种情况概述

    前言 近期被问及这个问题,在此记录整理一下. System.gc()方法的调用 此方法的调用是建议JVM进行Full GC,虽然只是建议而非一定,但很多情况下它会触发 Full GC,从而增加Full ...

  2. full gc JAVA_java触发full gc的几种情况概述

    前言 近期被问及这个问题,在此记录整理一下. System.gc()方法的调用 此方法的调用是建议JVM进行Full GC,虽然只是建议而非一定,但很多情况下它会触发 Full GC,从而增加Full ...

  3. java手动注册filter,SpringBoot注册Filter的两种实现方式

    springboot版本:2.2.5 一.filter注册 springboot中添加filter有两种方式: 1.实现方法一 2.实现方法二 二.Springboot自带filter Springb ...

  4. java list 内存溢出_java内存溢出的2种情况

    java程序员在面试经常被问到内存om之后如何处理,但是实际在工作中遇到此类问题的情况却又非常少. 进过自己一番总结内存溢出主要分为2种: 一.堆内存溢出 OutOfMemoryError 从jvm的 ...

  5. java.lang.NoClassDefFoundError(这只是其中的两种情况)

    第一种 [crash修复]NoClassDefFoundError:原因:由于导包的时候包名大小写和自己在类里面的时候不一致导致的,找不到, 类com.txznet.music.image.image ...

  6. java什么时候会触发类加载_Java 类加载器classLoader | 七日打卡

    类加载器是什么? Java程序启动时(或者在运行的过程中), jvm(Java虚拟机)会完成类的加载, 其中第一步就是使用类加载器classLoader将二进制流(.class文件)加载到内存中. 类 ...

  7. jq执行2次同样的方法怎么让第一次执行的不触发_你不知道的CMS GC

    在G1出来之前,CMS绝对是OLTP系统的标配.即使G1出来几年了,生产环境很多的JVM实例还是采用ParNew+CMS的组合.但是即使其得到这么广泛的应用,还是有很多同学对它有很深的误解.本文主要对 ...

  8. 触发JVM进行Full GC的情况及应对策略

    堆内存划分为 Eden.Survivor 和 Tenured/Old 空间,如下图所示: 从年轻代空间(包括 Eden 和 Survivor 区域)回收内存被称为 Minor GC,对老年代GC称为M ...

  9. Java什么时候会触发类初始化及原理(详解)

    先上结论: 以下情况会触发类的初始化: 遇到new,getstatic,putstatic,invokestatic这4条指令: 使用java.lang.reflect包的方法对类进行反射调用: 初始 ...

最新文章

  1. linux epoll用法
  2. R语言爬取imdb电影海报
  3. android 6.0权限库,Android 6.0动态权限适配
  4. 英特尔提出了一个数学公式,以此证明自动驾驶汽车的安全性
  5. 20201021 《计算感知》第3节课 笔记
  6. VTK:PolyData之ImplicitModeller
  7. php 工厂静态类,静态工厂模式(Static Factory)
  8. linux 算法函数,数据结构——算法之(012)( linux C 全部字符串操作函数实现)...
  9. 火车票售票系统mysql_今日开售!2020元旦火车票可以买了,春运首日车票也快了→...
  10. c语言程序设计基础的考试题,c语言程序设计基础的考试题.doc
  11. Introducing DataFrames in Apache Spark for Large Scale Data Science(中英双语)
  12. 论文推荐 | 一文了解百度10篇ACL 2019概况和该技术的实际可落地应用
  13. The Python Challenge 闯关笔记
  14. 关于PLC的“源型”和“漏型”
  15. 计算机在表格if用法,如何在Excel中使用sumif函数
  16. [HCTF 2018]WarmUp1PHP 代码审计
  17. Ble低功耗蓝牙和蓝牙mesh网络之间的关系
  18. 认识软件定义网络(SDN)(一)
  19. RPC 框架 Kitex 初体验 (虚拟机环境)
  20. JS如何取得URL里的参数?

热门文章

  1. 普林斯顿和宾大沃顿早申录取公布,常青藤精英教育一举拿下
  2. 对于气缸型号表示的内容与与含义说明
  3. 计算机系系徽设计说明,《系徽设计介绍简介模版.ppt
  4. 彻底清除朋友圈内的推荐广告
  5. 电脑键盘部分按键失灵_电脑键盘失灵怎么办 三步教你解决问题【图文】
  6. Android shape画一个圆角虚线框
  7. Vue $emit $refs子父组件间方法的调用
  8. cannot resolve xxx 解决方法
  9. matlab 清浊音判断+源代码
  10. 基本共射放大电路的动态分析以及放大电路Q点的稳定