内存分配与回收策略

Minor GC 和 Full GC

  • Minor GC:发生在新生代上,因为新生代对象存活时间很短,因此 Minor GC 会频繁执行,执行的速度一般也会比较快。

  • Full GC:发生在老年代上,老年代对象其存活时间长,因此 Full GC 很少执行,执行速度会比 Minor GC 慢很多。

内存分配与回收策略

1. 对象优先在 Eden 分配

大多数情况下,对象在新生代 Eden 区分配,当 Eden 区空间不够时,发起 Minor GC。

2. 大对象直接进入老年代

大对象是指需要连续内存空间的对象,最典型的大对象是那种很长的字符串以及数组。

经常出现大对象会提前触发垃圾收集以获取足够的连续空间分配给大对象。

-XX:PretenureSizeThreshold,大于此值的对象直接在老年代分配,避免在 Eden 区和 Survivor 区之间的大量内存复制。

3. 长期存活的对象进入老年代

为对象定义年龄计数器,对象在 Eden 出生并经过 Minor GC 依然存活,将移动到 Survivor 中,年龄就增加 1 岁,增加到一定年龄则移动到老年代中。

-XX:MaxTenuringThreshold 用来定义年龄的阈值

4. 动态对象年龄判定

虚拟机并不是永远地要求对象的年龄必须达到 MaxTenuringThreshold 才能晋升老年代,如果在 Survivor 中相同年龄所有对象大小的总和大于 Survivor 空间的一半,则年龄大于或等于该年龄的对象可以直接进入老年代,无需等到 MaxTenuringThreshold 中要求的年龄。

5. 空间分配担保

在发生 Minor GC 之前,虚拟机先检查老年代最大可用的连续空间是否大于新生代所有对象总空间,如果条件成立的话,那么 Minor GC 可以确认是安全的。

如果不成立的话虚拟机会查看 HandlePromotionFailure 设置值是否允许担保失败,如果允许那么就会继续检查老年代最大可用的连续空间是否大于历次晋升到老年代对象的平均大小,如果大于,将尝试着进行一次 Minor GC;如果小于,或者 HandlePromotionFailure 设置不允许冒险,那么就要进行一次 Full GC

即使允许HandlePromotionFailure,也有可能会出现担保失败,因为不可能平均值就百分之分百是预测正确的上限值!,所以这种情况下还是会进行FULL GC!!!!

所以,通常情况下还是会打开HandlePromotionFailure,这样可以最大可能避免频繁的FULL GC。


Full GC 的触发条件

对于 Minor GC,其触发条件非常简单,当 Eden 空间满时,就将触发一次 Minor GC。而 Full GC 则相对复杂,有以下条件:

1. 调用 System.gc()

只是建议虚拟机执行 Full GC,但是虚拟机不一定真正去执行。不建议使用这种方式,而是让虚拟机管理内存。

2. 老年代空间不足

老年代空间不足的常见场景为前文所讲的大对象直接进入老年代、长期存活的对象进入老年代等。

为了避免以上原因引起的 Full GC,应当尽量不要创建过大的对象以及数组。除此之外,可以通过 -Xmn 虚拟机参数调大新生代的大小,让对象尽量在新生代被回收掉,不进入老年代。还可以通过 -XX:MaxTenuringThreshold 调大对象进入老年代的年龄,让对象在新生代多存活一段时间。

3. 空间分配担保失败

使用复制算法的 Minor GC 需要老年代的内存空间作担保,如果担保失败会执行一次 Full GC。具体内容请参考上面的第五小节。

4. JDK 1.7 及以前的永久代空间不足

在 JDK 1.7 及以前,HotSpot 虚拟机中的方法区是用永久代实现的,永久代中存放的为一些 Class 的信息、常量、静态变量等数据。1.8之后去掉了永久代,将类信息放置在本地内存空间(元空间)

当系统中要加载的类、反射的类和调用的方法较多时,永久代可能会被占满,在未配置为采用 CMS GC 的情况下也会执行 Full GC。如果经过 Full GC 仍然回收不了,那么虚拟机会抛出 java.lang.OutOfMemoryError。

为避免以上原因引起的 Full GC,可采用的方法为增大永久代空间或转为使用 CMS GC。

5. Concurrent Mode Failure(CMS收集器产生的内存碎片后,老年代无法放入连续大对象)

执行 CMS GC 的过程中同时有对象要放入老年代,而此时老年代空间不足(可能是 GC 过程中浮动垃圾过多导致暂时性的空间不足),便会报 Concurrent Mode Failure 错误,并触发 Full GC。


StopTheWorld

GC的时候为什么要StopTheWorld(全局停顿)???

在GC的时候,进行标记过程时,可达性分析必须要在一个可以保证一致性的快照中执行!也就是说,不可以出现在分析过程中对象的引用关系还在不断变化的情况,该点不满足的话,分析结果的准确性就不能够得到保证!!!!(这一点可以类比于你妈打扫你的房间的问题)

JVM:内存分配与回收策略?Full GC 的触发条件?StopTheWorld ?相关推荐

  1. 【拥抱大厂系列】百度面试官问过的 “JVM内存分配与回收策略原理”,我用这篇文章搞定了

    点个赞,看一看,好习惯!本文 GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了3个月总结的一线大厂Java面试总结,本人已拿腾 ...

  2. 深入理解Java虚拟机(第三弹)- JVM 内存分配与回收策略原理,从此告别 JVM 内存分配文盲

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:打卡活动第二期来啦,100% 能获得奖品个人原创+1博客:点击前往,查看更多 虚拟机系列文章 深入理解 Java ...

  3. JVM—内存分配与回收策略

    1 概括 1.1 自动内存管理   给对象分配内存+回收分配给对象的内存.前者涉及内存分配策略:后者涉及gc算法(标记-清除.复制.标记-整理.分代收集)以及gc器(Serial.ParNew.Par ...

  4. JVM内存模型和性能调优:JVM内存分配与回收:Minor GC后存活的对象Survivor区放不下- 第26篇

    Minor GC后存活的对象Survivor区放不下,这种情况会把存活的对象部分挪到老年代,部分可能还会放在Survivor区. (1)当我们的代码中有allocation1和allocation2 ...

  5. JVM之内存分配与回收策略

    JVM之内存分配与回收策略 来源 https://www.cnblogs.com/xiaoxi/p/6557473.html JVM分代垃圾回收策略的基础概念 来源 https://www.cnblo ...

  6. JVM 之 内存分配与回收策略

    不诗意的女程序媛不是好厨师~ 转载请注明出处,From李诗雨-[https://blog.csdn.net/cjm2484836553/article/details/103842357] <J ...

  7. 实战:内存分配与回收策略

    实战:内存分配与回收策略 ​ Java技术体系的自动内存管理,最核心的目标就是自动化的解决两个问题:内存分配和内存回收,在之前我们讲的都是内存回收,现在我们来看一下内存分配的细节,这里我是使用JDK1 ...

  8. JVM3:实战:内存分配与回收策略

    实战:内存分配与回收策略 文章目录 实战:内存分配与回收策略 对象优先在Eden分配 大对象直接进入老年代 长期存活的对象将进入老年代 动态对象年龄判定 空间分配担保 对象优先在Eden分配 试分配三 ...

  9. Java 虚拟机内存分配与回收策略

    垃圾收集器与内存分配策略参考目录: 1.判断 Java 对象实例是否死亡 2. Java 中的四种引用 3.垃圾收集算法 4. Java9 中的 GC 调优 5.内存分配与回收策略 一.对象优先在 E ...

最新文章

  1. 被吴恩达的Landing.ai刷屏后,我们从他的8条Twitter和9大招聘岗位中看到了三个有趣细节
  2. puppet企业架构部署
  3. 辅助改方办理方法 计算机联锁,辅助所
  4. 工业用微型计算机(19)-指令系统(14)
  5. c# 正则表代式的分组和批评模式 .
  6. TP340G+硬改山寨UBNT,
  7. layer使用心得3
  8. 'Data_Label_Tools - 开源数据标注工具大列表
  9. Android 音视频开发 视频编码,音频编码格式
  10. 苹果电脑打不开网页连接不到服务器,苹果电脑chrome打不开网页怎么办_MAC上的chrome打不开网页如何解决-win7之家...
  11. 有人说做运营死路一条,但他没搞清运营是做什么的!
  12. 利用photoshopcs6将gif格式图片变为背景透明
  13. Agile Scrum WaterFall通俗易懂的全过程整理
  14. win10网络重置后无法发现网络,Wlan选项消失,有线网络不识别
  15. 自制密码生成器1.0
  16. 10年,从一个月薪2500的设备维修工,迫于压力转行,直到成为自动化测试专家···
  17. 计算机高级语言的优点,计算机语言|机器、汇编、高级语言联系及优缺点
  18. f1签证计算机专业容易拒签吗,美国签证F1被拒,拒签调档出来原来是这个原因...
  19. Windows 11 移动文件夹错误 0x800700E1 无法成功完成操作
  20. TCP的三次握手流程图

热门文章

  1. 日志、下载、投影、连接查询
  2. 生成建表脚本up_CreateTable
  3. JavaCC首页、文档和下载 - 语法分析生成器 - 开源中国社区
  4. MapReduce之单词计数
  5. 明星+本土化,vivo国际化的两大开路先锋
  6. MOSS的SPBuiltInFieldId成员的字段类型对照关系表
  7. 彻底解决windows2003不能共享文件夹或者共享后不能访问的问题
  8. 去掉excel保存文件时自动生成备份
  9. SQL Server 2008中的hierarchyid
  10. .net事务的困扰,请大虾指点。