首页 > 其他分享 >gc 垃圾回收 jvm

gc 垃圾回收 jvm

时间:2023-01-31 11:58:49浏览次数:59  
标签:Full 对象 full GC 垃圾 jvm gc minor

full gc触发条件

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

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

(3)Permanet Generation空间满了。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)通过Minor GC后进入老年代的平均大小大于老年代的可用内存。如果发现统计数据说之前Minor GC的平均晋升大小比目前old gen剩余的空间大,则不会触发Minor GC而是转为触发full GC。

(5)由Eden区、From Space区向To Space区复制时,对象大小大于To Space可用内存,则把该对象转存到老年代,且老年代的可用内存小于该对象大小

fullgc过于频繁有可能会造成oom,有可能不会。

首先明确一下,这篇文章的重点是分析后面一种情况,即应用在频繁的full gc,但并没有出现oom。

我们来想一下为什么会出现full gc,触发原因有很多种,但归根到底都是因为内存空间不足了(system.gc的情况不考虑)。

系统在频繁的full gc,但并没有出现oom,说明每次回收的时候,肯定清理了部分内存空间。那这里就有2种情况,gc之后清理的内存空间大不大?

1、如果每次gc之后剩余的空间不大,说明有一部分顽固对象一直没法被回收,导致可用内存变少。这种情况下很容易后续出现oom,比如说一次大对象的申请

2、如果每次gc之后剩余的空间比较大,意味着大部分对象都被清理了,但是系统又在频繁的full gc,说明很快老年代又会涌入大量对象。这个时候就应该检查下jvm的参数配置,很有可能是新生代设置的太小了,导致很多应该在minor gc阶段就清理出去的对象留到了老年代,这种可能性是最大的

新生代可以分为eden、survivor0、survivor1,正常的对象分配都是在eden完成的,如果eden空间不够了,会触发一次minor gc,存活的对象放在s0或s1中。随着每次minor gc,存活的对象会不断的从s0迁到s1,再从s1迁到s0,这个过程经过几次之后,如果对象还是存活的,就会晋升到老年代。

但如果新生代大小设置的太小,就会导致非常频繁的minor gc,s0->s1来回切换的速度加快,导致本身应该在minor gc就清理出去的对象跑到了老年代。

举个例子,正常情况下如果minor gc是1分钟一次,-XX:MaxTenuringThreshold默认配置是15的话,正常的小对象最长可以在新生代待15分钟左右,如果一个对象m的存活时间是5分钟,那它就可以在minor gc的时候被清理出去;但如果新生代设置过小,minor gc的频率降到10秒一次,那么o只能在新生代待150秒左右,然后就会晋升到老年代,这种对象一多,就会导致频繁的full gc
————————————————
版权声明:本文为CSDN博主「泡^泡」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/xiaowanzi_zj/article/details/117447235

标签:Full,对象,full,GC,垃圾,jvm,gc,minor
From: https://www.cnblogs.com/sunchenxuan/p/17078514.html

相关文章

  • JVM详记
    JVM1运行时数据区域从概念上Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。在Java8中,元空间(Metaspace)登上舞台,方法区存在于元......
  • JDK、JRE与JVM
     1.jdk包含JRE(JavaRuntimeEnviroment):意思是Java的运行环境;它是由JVM和核心类库组成的;如果你不是开发人员,只需要在电脑上安装JRE就可以运行Java程序。2.jvm(java虚拟......
  • JVM是如何解决跨代引用问题的?
    本文已收录至Github,推荐阅读......
  • 神奇的贝叶斯---垃圾邮件过滤
        使用贝叶斯进行垃圾邮件过滤的原理很简单,假如我们在邮件中发现一个词--“发票”,那么就根据这个词来计算这封邮件是垃圾邮件的概率    P(垃圾|发票)=P......
  • 面试官:JVM是如何判定对象已死的?
    本文已收录至Github,推荐阅读......
  • Exgcd(扩展欧几里得算法)
    其实挺简单。GCD(辗转相除法)定理:\[\gcd(a,b)=\gcd(b,a\%b)\]证明:\[\text{设}a=kb+r\text{,则}r=a\bmodb\]\[\text{若}c\text{是}a,b\te......
  • 《深入理解Java虚拟机》第三章读书笔记(一)——垃圾回收算法
    参考书籍《深入理解java虚拟机》周志明著系列文章目录和关于我本文主要介绍垃圾回收理论知识1.jvm哪些区域需要进行垃圾回收虚拟机栈,本地方法栈,程序计数器都是线......
  • GC如何判断对象可以被回收
    可达性分析法:从GCRoots开始向下搜索,搜索所走过的路径称为引用链。当一个对象到GCRoots没有任务引用链相连时,则证明此对象是不可用的,此时虚拟机就判断是可回收对象。可以......
  • m基于遗传算法的城市生活垃圾回收网络优化matlab仿真
    1.算法描述目前,城市生活垃圾成为困扰我国大多数城市健康发展的痼疾.与国外相关国家相比,我国垃圾回收处理模式存在资源化程度低,处理方式单一等弊端,很多城市在积极探索新......
  • m基于遗传算法的城市生活垃圾回收网络优化matlab仿真
    1.算法描述       目前,城市生活垃圾成为困扰我国大多数城市健康发展的痼疾.与国外相关国家相比,我国垃圾回收处理模式存在资源化程度低,处理方式单一等弊端,很多......