一、JVM创建新对象的内存分配过程

以下是JVM中创建一个新对象的时候的完成的一个流程:

二、Full GC触发过程

2.1 System.gc()方法的调用

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

2.2 老年代空间不足

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

2.3 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的比率。

2.4 通过Minor GC后进入老年代的平均大小大于老年代的可用内存

如果发现统计数据说之前Minor GC的平均晋升大小比目前old gen剩余的空间大,则不会触发Minor GC而是转为触发full GC。

三、YGC的时机

edn空间不足

在发生Minor GC之前,虚拟机会先检查老年代最大可用的连续空间是否大于新生代所有对象的总空间。如果大于则进行Minor GC,如果小于则看HandlePromotionFailure设置是否允许担保失败(不允许则直接Full GC)。如果允许,那么会继续检查老年代最大可用的连续空间是否大于历次晋升到老年代对象的平均大小,如果大于则尝试Minor GC(如果尝试失败也会触发Full GC),如果小于则进行Full GC。

但是,具体到什么时刻执行,这个是由系统来进行决定,是无法预测的。

Minor GC、Major GC和Full GC之间的区别

Java GC种类以及触发时机相关推荐

  1. java gc 触发_Java GC种类和触发时机

    jvm中分为堆和非堆 堆 = 新生代-YoungGen(eden + survivor1 + survivor2) + 老年代-OldGen(tenured) 非堆 = 永久代-PermGen 在默认 ...

  2. java gc种类_Java GC系列(3):垃圾回收器种类

    Java有四种类型的垃圾回收器: 串行垃圾回收器(Serial Garbage Collector) 并行垃圾回收器(Parallel Garbage Collector) 并发标记扫描垃圾回收器(C ...

  3. Android中GC的触发时机和条件

    本文分析基于Android R(11)源码 Java对象的创建由Allocator负责,回收由Collector负责.从Android O开始,对于前台应用默认的GC Collector是CC(Con ...

  4. java串口通信DataRecive_串口通信之DataReceive事件触发时机

    环境:Windows PC.本机虚拟COM2连接COM3.串口调试助手COM2发数据 图1 1> ReceivedBytesThreshold为默认值1:2> 一次发送41个字节:3> ...

  5. 【JVM】对象存活判定算法、GC算法、STW、GC种类详解

    [JVM]对象存活判定算法.GC算法.STW.GC种类详解 文章目录 [JVM]对象存活判定算法.GC算法.STW.GC种类详解 GC主要关注的区域 垃圾标记阶段:对象存活判断 标记阶段:引用计数算法 ...

  6. Java GC(垃圾回收)机制知识总结

    Java GC系列 Java关键术语 Java HotSpot 虚拟机 JVM体系结构 Java堆内存 启动Java垃圾回收 Java垃圾回收过程 垃圾回收中实例的终结 对象什么时候符合垃圾回收的条件 ...

  7. 死磕GC:Java GC 和 GO GC 大对比,看完秒成高高手

    说在前面 现在拿到offer超级难,甚至连面试电话,一个都搞不到. 尼恩的技术社群中(50+),很多小伙伴凭借 "左手云原生+右手大数据"的绝活,拿到了offer,并且是非常优质的 ...

  8. java gc的工作原理、如何优化GC的性能、如何和GC进行有效的交互

    java gc的工作原理.如何优化GC的性能.如何和GC进行有效的交互 一个优秀的Java 程序员必须了解GC 的工作原理.如何优化GC的性能.如何和GC进行有效的交互,因为有一些应用程序对性能要求较 ...

  9. Java GC 原理

    内存的分配和释放,典型的做法有 1.全人工,也就是调用malloc/free,new/delete这些完全靠程序员,当然这样开发的程序很容易出现bug 2.引用计数,对每个分配的对象增加一个引用计数器 ...

  10. 98. 我说说你对Java GC机制的理解?

    我说说你对Java GC机制的理解? 写在前面 JVM的运行数据区 1.方法区 2.堆( Heap) 3.栈( Stack) 4.PC寄存器 5.本地方法栈 初识GC Marking Normal D ...

最新文章

  1. 关于XGMII/XLGMII/CGMII
  2. iOS UIView快速添加事件
  3. 【仿去哪儿】骆驼动画加载
  4. python和R对dataframe进行连接、行过滤更新列内容:dplyr、merge、inner、left、right、inner_join、left_join、sort_values、loc
  5. Go web framework
  6. Python数据结构学习笔记——栈
  7. 如何查询SAP Cloud for Customer系统升级和维护时间
  8. linux 安装postgres 全文检索支持
  9. Postfix疯狂外发垃圾邮件之分析与解决
  10. 大数据的关键不是“大”,而是你真的需要它吗
  11. 使用electron-builder对Electron项目进行打包
  12. python网页打不开_解决谷歌搜索技术文章时打不开网页问题的python脚本
  13. 电脑、手机装机必备软件的抉择[土豆-侃天下]
  14. 华为LACP的相关配置命令
  15. mysql中修改表字段的类型长度_mysql中修改表字段名/字段长度/字段类型详解
  16. 多目标跟踪的评价指标
  17. oracle里round函数补0,Oracle的Round函数
  18. 算法设计与分析: 2-13 标准二维表问题
  19. 2年工作经验杂谈(java开发)
  20. pythonturtle魔法阵_python turtle 库绘制简单魔法阵

热门文章

  1. 设计自己的ImageLoader图片加载框架
  2. C语言复习一(内存对齐、大小端)
  3. 阿里巴巴图片滚动代码html,阿里旺铺装修代码的fx.roll滚动特效组件使用详解及HTML代码示例...
  4. win10北通手柄没反应_赛博朋克2077正式发售,光靠键鼠可不行,试试北通阿修罗3...
  5. OPPO 实时数仓揭秘:从顶层设计实现离线与实时的平滑迁移
  6. android动画之属性动画学习
  7. 终于,我们这代程序员在上海各奔东西
  8. Android app内存管理的16点建议
  9. java gson json_Java利用gson处理json字符串
  10. python中popen返回值_python中os.system()和os.popen()的返回值