Java岗大厂面试百日冲刺 - 日积月累,每日三题【Day35】
面试题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的条件非常严苛,必须符合以下三种条件才会被回收:
所有实例被回收
加载该类的ClassLoader 被回收
Class 对象无法通过任何途径访问(包括反射)
追问2:能说一下新生代空间的构成与执行逻辑么?
新生代(Young generation)用来保存那些第一次被创建的对象,它被分成三个空间:
一个伊甸园空间(Eden)
两个幸存者空间(From Survivor、To Survivor)
默认新生代空间的分配:Eden : From : To =8 : 1 : 1
每个空间的执行说明如下:
绝大多数
刚刚被创建的对象
会存放在伊甸园空间(Eden
)。当一个对象被判定为死亡
的时候,GC 就有责任来回收掉这部分对象的内存空间。新生代是 GC 最频繁区域
。当对象在 Eden ( 包括一个 Survivor 区域,假设是 from 区域 ) 出生后,在经过一次 Minor GC后,如果对象还存活,并且能够被另外一块 Survivor 区域所容纳(上面已经假设为 from 区域,这里应为 to 区域,即 to 区域有足够的内存空间来存储 Eden 和 from 区域中存活的对象 ),则使用复制算法
将这些仍然还存活的对象复制到另外一块 Survivor 区域 ( 即 to 区域 )
中,然后清理所使用过的 Eden以及 Survivor 区域
( 即from 区域 ),并且将这些对象的年龄设置为1。可见,两个幸存者空间,必须有一个是保持空的
。此后,对象在 Survivor 区
每熬过一次 Minor GC,就将对象的年龄 + 1
,当对象的年龄达到某个值时 ( 默认是 15
【一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义】浏览器打开:qq.cn.hn/FTf 开源分享
岁,可以通过参数 -XX:MaxTenuringThreshold 来设定),这些对象就会成为老年代
。
- 但也有例外的,对于一些较大的对象 (即需要分配一块较大的连续内存空间 ) 则是直接进入到老年代。。
如何判定对象死亡:通过引用计数法、可达性分析算法判断是否还存在引用,以及结合根据对象引用强度判断;
以下流程评论区朋友们有歧义,经查证确实是有问题的,保留下来引以为戒。
绝大多数
刚刚被创建的对象
会存放在伊甸园空间(Eden
)。在伊甸园空间执行第一次GC(Minor GC)之后,存活的对象被移动到其中一个幸存者空间(Survivor)。
此后,每次伊甸园空间执行GC后,存活的对象会被堆积在同一个幸存者空间。
当一个幸存者空间饱和,
还在存活的对象
会被移动到另一个幸存者空间。然后会清空已经饱和的哪个幸存者空间
,可见,两个幸存者空间,必须有一个是保持空的。在以上步骤中重复N次(N = MaxTenuringThreshold(
年龄阀值设定,默认15
))依然存活的对象,就会被移动到老年代。
当然,也有例外出现,对于一些比较大的对象(需要分配一块比较大的连续内存空间)则直接进入到老年代。一般在Survivor 空间不足的情况下发生。
追问3:说一下发生OOM时,垃圾回收机制的执行流程。
对于一个很大的对象或数组,我们会首先在Eden 尝试创建,如果Eden区内存不够,创建不了,则
触发Minor GC
;Minor GC完成后继续尝试在Eden区存放,发现仍然放不下;
尝试直接进入老年代,老年代也放不下
触发 FULL GC
清理老年代的空间FULL GC完成后尝试往老年代里放,还是放不下
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 其实准确分类有两种:
- 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 有这个模式;
- 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】相关推荐
- Java岗大厂面试百日冲刺 - 日积月累,每日三题【Day38】—— 实战那些事儿2
大家好,我是陈哈哈,北漂五年.相信大家和我一样,都有一个大厂梦,作为一名资深Java选手,深知面试重要性,接下来我准备用100天时间,基于Java岗面试中的高频面试题,以每日3题的形式,带你过一遍 ...
- Java岗大厂面试百日冲刺 - 日积月累,每日三题【Day37】—— 并发编程3
大家好,我是陈哈哈,北漂五年.相信大家和我一样,都有一个大厂梦,作为一名资深Java选手,深知面试重要性,接下来我准备用100天时间,基于Java岗面试中的高频面试题,以每日3题的形式,带你过一遍 ...
- Java岗大厂面试百日冲刺 - 日积月累,每日三题【Day34】—— 消息队列2
大家好,我是陈哈哈,北漂五年.相信大家和我一样,都有一个大厂梦,作为一名资深Java选手,深知面试重要性,接下来我准备用100天时间,基于Java岗面试中的高频面试题,以每日3题的形式,带你过一遍 ...
- Java岗大厂面试百日冲刺 - 日积月累,每日三题【Day23】—— 算法1
大家好,我是陈哈哈,北漂五年.相信大家和我一样,都有一个大厂梦,作为一名资深Java选手,深知面试重要性,接下来我准备用100天时间,基于Java岗面试中的高频面试题,以每日3题的形式,带你过一遍 ...
- Java岗大厂面试百日冲刺 - 日积月累,每日三题【Day36】—— 实战那些事儿1
大家好,我是陈哈哈,北漂五年.相信大家和我一样,都有一个大厂梦,作为一名资深Java选手,深知面试重要性,接下来我准备用100天时间,基于Java岗面试中的高频面试题,以每日3题的形式,带你过一遍 ...
- Java岗大厂面试百日冲刺 - 日积月累,每日三题【Day25】—— JVM1
大家好,我是陈哈哈,北漂五年.相信大家和我一样,都有一个大厂梦,作为一名资深Java选手,深知面试重要性,接下来我准备用100天时间,基于Java岗面试中的高频面试题,以每日3题的形式,带你过一遍 ...
- Java岗大厂面试百日冲刺 - 日积月累,每日三题【Day24】—— 分布式1
大家好,我是陈哈哈,北漂五年.相信大家和我一样,都有一个大厂梦,作为一名资深Java选手,深知面试重要性,接下来我准备用100天时间,基于Java岗面试中的高频面试题,以每日3题的形式,带你过一遍 ...
- Java岗大厂面试百日冲刺 - 日积月累,每日三题【Day28】—— 数据库5
大家好,我是陈哈哈,北漂五年.相信大家和我一样,都有一个大厂梦,作为一名资深Java选手,深知面试重要性,接下来我准备用100天时间,基于Java岗面试中的高频面试题,以每日3题的形式,带你过一遍 ...
- Java岗大厂面试百日冲刺 - 日积月累,每日三题【Day51】—— tomcat
大家好,我是陈哈哈,北漂五年.相信大家和我一样,都有一个大厂梦,作为一名资深Java选手,深知面试重要性,接下来我准备用100天时间,基于Java岗面试中的高频面试题,以每日3题的形式,带你过一遍 ...
- Java岗大厂面试百日冲刺 - 日积月累,每日三题【Day35】—— JVM2
大家好,我是陈哈哈,北漂五年.相信大家和我一样,都有一个大厂梦,作为一名资深Java选手,深知面试重要性,接下来我准备用100天时间,基于Java岗面试中的高频面试题,以每日3题的形式,带你过一遍 ...
最新文章
- linux history记录格式修改
- BAT看上了产业互联网
- 全球与中国重型离合器市场运营状况分析与“十四五”发展规划建议2021年版
- python中json模块_Python的标准模块包json的实例用法
- pygame只能编写游戏_游戏框架搭建
- tablueau地图标记圆形_R语言在线地图神器:Leaflet for R包(三) 符号标记
- servlet运行原理和生命周期
- NLPIR java测试(没找到范例代码)
- 关于select和option下拉框样式问题
- java单点登录解决方案_N多系统单点登录,实现、解决方案。四种解决方案
- Quartz任务监控管理
- Arduino ide配置esp32硬件支持(配置esp32的arduino开发环境)
- Airtest多点触控测试
- iOS-图片可以自适应屏幕大小吗,应该会失真吧?
- 使用Python以UCI心脏病数据集为例,进行数据简单分析
- 双目相机标定以及立体测距原理及OpenCV实现
- 在Java中获取两个数的中间值(超大数值)
- VS中的工程文件组织
- 读书笔记: 发论文,拿项目其实很简单
- 公司电脑usb被禁用,如何重新启用usb功能?
热门文章
- 原来这个blog也可以滚动噢,我在“滚动的一天”中说过的
- 外贸开发信 html,7个回复率极高的外贸开发信邮件模板
- python如何画出多个独立的图片_在Python中用Matplotlib绘制多个图形并组合显示,利用,多图,合并,展示...
- [译文]Qt自定义主题或使用外部主题(Qt Creator Themes)
- 馋猫美食记录本_用户协议
- 最简单DIY基于ESP32CAM的物联网相机系统⑤(用C#上位机实现串口图传)
- 读书笔记|指数型函数对算法的影响实际应用-day3
- matlab画完图之后,Matlab的1个figure画多图在画最后1张图时整个图突然变乱了?
- 头部UP主的赚钱方法,都在这里了
- winform打开Excel读取数据并显示到datagridview中