面试题2:JVM会在什么时候进行GC呢?

===================================================================================

JVM常在以下几种场景时进行GC操作:

  • 在cpu空闲的时候自动进行回收

  • 主动调用System.gc()后尝试进行回收,是否回收由JVM决定。

  • Eden区域满了,或者新创建的对象大小 > Eden所剩空间,执行Minor GC

  • 升到老年代的对象大于老年代剩余空间的时候执行Full GC,或者Young GC中发生promotion failure`强制Full GC 。

  • 在堆内存存储满了之后进行GC,如gc与非gc时间耗时超过了GCTimeRatio的限制引发OOM

YGC出现promotion failure的场景: promotion failure发生在Young GC, 如果Survivor区当中存活对象的年龄达到了设定值,会就将Survivor区当中的对象拷贝到老年代,如果老年代的空间不足,就会发生promotion failure, 强制进行Full GC 。

追问1:介绍一下不同代空间的垃圾回收机制


新生代(Young generation):

从年轻代空间(包括 Eden 和 Survivor 区域)回收内存被称为 Minor GC,因为 Java 对象大多都具备朝生夕灭(很快不再使用)的特性,所以 Minor GC 非常频繁,一般回收速度也比较快。这一定义既清晰又易于理解。。

老年代(Old generation):

对象没有变得不可达,并且从新生代周期中存活了下来,会被拷贝到这里。其区域分配的空间要比新生代多。也正由于其相对大的空间,发生在老年代的GC次数要比新生代少得多。清理老年代内存一般直接是 Full GC来清理。

默认的新生代(Young generation)、老年代(Old generation)所占空间比例为 1 : 2

持久代(Permanent generation):

也称之为方法区(Method area):用于保存类常量以及字符串常量。注意,这个区域不是用于存储那些从老年代存活下来的对象,这个区域也可能发生GC。发生在这个区域的GC事件为 Major GC 。

出现了 Major GC,经常会伴随至少一次的 Minor GC(但非绝对的,ParallelScavenge 收集器的收集策略里就有直接进行 Major GC 的策略选择过程) 。MajorGC 的速度一般会比 Minor GC 慢 10倍以上。只不过在这个区域发生GC的条件非常严苛,必须符合以下三种条件才会被回收:

  1. 所有实例被回收

  2. 加载该类的ClassLoader 被回收

  3. Class 对象无法通过任何途径访问(包括反射)

追问2:能说一下新生代空间的构成与执行逻辑么?


新生代(Young generation)用来保存那些第一次被创建的对象,它被分成三个空间:

  • 一个伊甸园空间(Eden)

  • 两个幸存者空间(From Survivor、To Survivor)

默认新生代空间的分配:Eden : From : To =8 : 1 : 1

每个空间的执行说明如下:

  1. 绝大多数刚刚被创建的对象会存放在伊甸园空间(Eden)。当一个对象被判定为 死亡 的时候,GC 就有责任来回收掉这部分对象的内存空间。

  2. 新生代是 GC 最频繁区域。当对象在 Eden ( 包括一个 Survivor 区域,假设是 from 区域 ) 出生后,在经过一次 Minor GC后,如果对象还存活,并且能够被另外一块 Survivor 区域所容纳(上面已经假设为 from 区域,这里应为 to 区域,即 to 区域有足够的内存空间来存储 Eden 和 from 区域中存活的对象 ),则使用复制算法将这些仍然还存活的对象复制到另外一块 Survivor 区域 ( 即 to 区域 )中,然后清理所使用过的 Eden以及 Survivor 区域 ( 即from 区域 ),并且将这些对象的年龄设置为1。可见,两个幸存者空间,必须有一个是保持空的

  3. 此后,对象在 Survivor 区每熬过一次 Minor GC,就将对象的年龄 + 1,当对象的年龄达到某个值时 ( 默认是 15

【一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义】浏览器打开:qq.cn.hn/FTf 开源分享

岁,可以通过参数 -XX:MaxTenuringThreshold 来设定),这些对象就会成为老年代

  1. 但也有例外的,对于一些较大的对象 (即需要分配一块较大的连续内存空间 ) 则是直接进入到老年代。。

如何判定对象死亡:通过引用计数法、可达性分析算法判断是否还存在引用,以及结合根据对象引用强度判断;


以下流程评论区朋友们有歧义,经查证确实是有问题的,保留下来引以为戒。

  1. 绝大多数刚刚被创建的对象会存放在伊甸园空间(Eden)。

  2. 在伊甸园空间执行第一次GC(Minor GC)之后,存活的对象被移动到其中一个幸存者空间(Survivor)。

  3. 此后,每次伊甸园空间执行GC后,存活的对象会被堆积在同一个幸存者空间。

  4. 当一个幸存者空间饱和,还在存活的对象会被移动到另一个幸存者空间。然后会清空已经饱和的哪个幸存者空间,可见,两个幸存者空间,必须有一个是保持空的。

  5. 在以上步骤中重复N次(N = MaxTenuringThreshold(年龄阀值设定,默认15))依然存活的对象,就会被移动到老年代。

当然,也有例外出现,对于一些比较大的对象(需要分配一块比较大的连续内存空间)则直接进入到老年代。一般在Survivor 空间不足的情况下发生。


追问3:说一下发生OOM时,垃圾回收机制的执行流程。


  1. 对于一个很大的对象或数组,我们会首先在Eden 尝试创建,如果Eden区内存不够,创建不了,则触发Minor GC

  2. Minor GC完成后继续尝试在Eden区存放,发现仍然放不下;

  3. 尝试直接进入老年代,老年代也放不下

  4. 触发 FULL GC 清理老年代的空间

  5. FULL GC完成后尝试往老年代里放,还是放不下

  6. OOM


北漂铁子们,快来猜猜这是哪里?

作者:淘气的小苹果


面试题3:Full GC 、Major GC和 Minor GC有什么不同

====================================================================================================

我们见过很多 GC 名词如:Minor GC、Young GC、Full GC、Old GC、Major GC、Mixed GC等。那么这么多GC如何进行大致区分?下面我们引用 R 大在知乎上的回答:

针对 HotSpot VM 的实现,它里面的 GC 其实准确分类有两种:

  1. Partial GC(局部 GC): 并不收集整个 GC 堆的模式
  • Young GC: 只收集 Young Gen 的 GC,Young GC 还有种说法就叫做 Minor GC,两者是一个意思;

  • Old GC: 只收集 old gen 的 GC,只有垃圾收集器 CMS 的 concurrent collection 是这个模式;

  • Mixed GC: 收集整个 Young Gen 以及部分 old gen 的 GC,只有垃圾收集器 G1 有这个模式;

  1. Full GC(全局 GC): 收集整个堆,包括新生代,老年代,永久代(在 JDK 1.8 及以后,永久代被移除,换为 metaspace 元空间)等所有部分的模式;

接下来让我们再来了解下各个 GC:

(1)Minor GC / Young GC

首先我们先来看下 Minor GC / Young GC,大家都知道,新生代(Young Gen)也可以称之为年轻代,这两个名词是等价的。那么在年轻代中的 Eden 内存区域被占满之后,实际上就需要触发年轻代的 GC,或者是新生代的 GC。

其实就是所谓的 Minor GC,也可以称之为 Young GC

(2)Old GC

所谓的老年代 GC,称之为 Old GC 更加合适一些,因为从字面意义上就可以理解,这就是所谓的老年代 GC。

(3)Full GC

对于 Full GC,可以说 Full GC 指的是针对新生代、老年代、永久代的全体内存空间的垃圾回收,所以称之为 Full GC。

(4)Major GC

Java岗大厂面试百日冲刺 - 日积月累,每日三题【Day35】相关推荐

  1. Java岗大厂面试百日冲刺 - 日积月累,每日三题【Day38】—— 实战那些事儿2

      大家好,我是陈哈哈,北漂五年.相信大家和我一样,都有一个大厂梦,作为一名资深Java选手,深知面试重要性,接下来我准备用100天时间,基于Java岗面试中的高频面试题,以每日3题的形式,带你过一遍 ...

  2. Java岗大厂面试百日冲刺 - 日积月累,每日三题【Day37】—— 并发编程3

      大家好,我是陈哈哈,北漂五年.相信大家和我一样,都有一个大厂梦,作为一名资深Java选手,深知面试重要性,接下来我准备用100天时间,基于Java岗面试中的高频面试题,以每日3题的形式,带你过一遍 ...

  3. Java岗大厂面试百日冲刺 - 日积月累,每日三题【Day34】—— 消息队列2

      大家好,我是陈哈哈,北漂五年.相信大家和我一样,都有一个大厂梦,作为一名资深Java选手,深知面试重要性,接下来我准备用100天时间,基于Java岗面试中的高频面试题,以每日3题的形式,带你过一遍 ...

  4. Java岗大厂面试百日冲刺 - 日积月累,每日三题【Day23】—— 算法1

      大家好,我是陈哈哈,北漂五年.相信大家和我一样,都有一个大厂梦,作为一名资深Java选手,深知面试重要性,接下来我准备用100天时间,基于Java岗面试中的高频面试题,以每日3题的形式,带你过一遍 ...

  5. Java岗大厂面试百日冲刺 - 日积月累,每日三题【Day36】—— 实战那些事儿1

      大家好,我是陈哈哈,北漂五年.相信大家和我一样,都有一个大厂梦,作为一名资深Java选手,深知面试重要性,接下来我准备用100天时间,基于Java岗面试中的高频面试题,以每日3题的形式,带你过一遍 ...

  6. Java岗大厂面试百日冲刺 - 日积月累,每日三题【Day25】—— JVM1

      大家好,我是陈哈哈,北漂五年.相信大家和我一样,都有一个大厂梦,作为一名资深Java选手,深知面试重要性,接下来我准备用100天时间,基于Java岗面试中的高频面试题,以每日3题的形式,带你过一遍 ...

  7. Java岗大厂面试百日冲刺 - 日积月累,每日三题【Day24】—— 分布式1

      大家好,我是陈哈哈,北漂五年.相信大家和我一样,都有一个大厂梦,作为一名资深Java选手,深知面试重要性,接下来我准备用100天时间,基于Java岗面试中的高频面试题,以每日3题的形式,带你过一遍 ...

  8. Java岗大厂面试百日冲刺 - 日积月累,每日三题【Day28】—— 数据库5

      大家好,我是陈哈哈,北漂五年.相信大家和我一样,都有一个大厂梦,作为一名资深Java选手,深知面试重要性,接下来我准备用100天时间,基于Java岗面试中的高频面试题,以每日3题的形式,带你过一遍 ...

  9. Java岗大厂面试百日冲刺 - 日积月累,每日三题【Day51】—— tomcat

      大家好,我是陈哈哈,北漂五年.相信大家和我一样,都有一个大厂梦,作为一名资深Java选手,深知面试重要性,接下来我准备用100天时间,基于Java岗面试中的高频面试题,以每日3题的形式,带你过一遍 ...

  10. Java岗大厂面试百日冲刺 - 日积月累,每日三题【Day35】—— JVM2

      大家好,我是陈哈哈,北漂五年.相信大家和我一样,都有一个大厂梦,作为一名资深Java选手,深知面试重要性,接下来我准备用100天时间,基于Java岗面试中的高频面试题,以每日3题的形式,带你过一遍 ...

最新文章

  1. linux history记录格式修改
  2. BAT看上了产业互联网
  3. 全球与中国重型离合器市场运营状况分析与“十四五”发展规划建议2021年版
  4. python中json模块_Python的标准模块包json的实例用法
  5. pygame只能编写游戏_游戏框架搭建
  6. tablueau地图标记圆形_R语言在线地图神器:Leaflet for R包(三) 符号标记
  7. servlet运行原理和生命周期
  8. NLPIR java测试(没找到范例代码)
  9. 关于select和option下拉框样式问题
  10. java单点登录解决方案_N多系统单点登录,实现、解决方案。四种解决方案
  11. Quartz任务监控管理
  12. Arduino ide配置esp32硬件支持(配置esp32的arduino开发环境)
  13. Airtest多点触控测试
  14. iOS-图片可以自适应屏幕大小吗,应该会失真吧?
  15. 使用Python以UCI心脏病数据集为例,进行数据简单分析
  16. 双目相机标定以及立体测距原理及OpenCV实现
  17. 在Java中获取两个数的中间值(超大数值)
  18. VS中的工程文件组织
  19. 读书笔记: 发论文,拿项目其实很简单
  20. 公司电脑usb被禁用,如何重新启用usb功能?

热门文章

  1. 原来这个blog也可以滚动噢,我在“滚动的一天”中说过的
  2. 外贸开发信 html,7个回复率极高的外贸开发信邮件模板
  3. python如何画出多个独立的图片_在Python中用Matplotlib绘制多个图形并组合显示,利用,多图,合并,展示...
  4. [译文]Qt自定义主题或使用外部主题(Qt Creator Themes)
  5. 馋猫美食记录本_用户协议
  6. 最简单DIY基于ESP32CAM的物联网相机系统⑤(用C#上位机实现串口图传)
  7. 读书笔记|指数型函数对算法的影响实际应用-day3
  8. matlab画完图之后,Matlab的1个figure画多图在画最后1张图时整个图突然变乱了?
  9. 头部UP主的赚钱方法,都在这里了
  10. winform打开Excel读取数据并显示到datagridview中