Java面试题冲刺第二十七天--JVM2

目录
  • 面试题1:简单说一下java的垃圾回收机制。
  • 面试题2:JVM会在什么时候进行GC呢?
    • 追问1:介绍一下不同代空间的垃圾回收机制
  • 追问2:能说一下新生代空间的构成与执行逻辑么?
  • 追问3:说一下发生OOM时,垃圾回收机制的执行流程。
  • 面试题3:Full GC 、Major GC和 Minor GC有什么不同
    • (1)Minor GC / Young GC
    • (2)Old GC
    • (3)Full GC
    • (4)Major GC
    • (5)Mixed GC
  • 总结

面试题1:简单说一下java的垃圾回收机制。

任何语言在运行过程中都会创建对象,也就意味着需要在内存中为这些对象在内存中分配空间,如果这些对象只增加不减少,那么堆空间很快就会被耗尽。因此在这些对象失去使用的意义的时候,需要释放掉这些内容,保证内存能够提供给新的对象使用,对于对象内存的释放就是垃圾回收机制,也叫做gc(Garbage Collection,GC)。

对于java开发者来说gc是一个双刃剑,像C语言的垃圾回收是人工的,工作量大,但是可控性高。而java是自动化的,但是可控性很差,甚至有时会出现内存溢出的情况,内存溢出也就是jvm分配的内存中对象过多,超出配置的JDK最大可分配内存的大小。

面试题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

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

  • 绝大多数刚刚被创建的对象会存放在伊甸园空间(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 岁,可以通过参数 -XX:MaxTenuringThreshold 来设定),这些对象就会成为老年代。
  • 但也有例外的,对于一些较大的对象 (即需要分配一块较大的连续内存空间 ) 则是直接进入到老年代。。

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

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

  • 绝大多数刚刚被创建的对象会存放在伊甸园空间(Eden)。
  • 在伊甸园空间执行第一次GC(Minor GC)之后,存活的对象被移动到其中一个幸存者空间(Survivor)。
  • 此后,每次伊甸园空间执行GC后,存活的对象会被堆积在同一个幸存者空间。
  • 当一个幸存者空间饱和,还在存活的对象会被移动到另一个幸存者空间。然后会清空已经饱和的哪个幸存者空间,可见,两个幸存者空间,必须有一个是保持空的。
  • 在以上步骤中重复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 有这个模式;

2.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

上面我们提到,Major GC用于处理方法区的对象。这个区域不是用于存储那些从老年代存活下来的对象,这个区域也可能发生GC,发生概率很低。

(5)Mixed GC

Mixed GC 是 G1 中特有的概念,其实说白了,主要就是说在 G1 中,一旦老年代占据堆内存的 45%(-XX:InitiatingHeapOccupancyPercent:设置触发标记周期的 Java 堆占用率阈值,默认值是 45%。这里的Java 堆占比指的是 non_young_capacity_bytes,包括 old + humongous),就要触发 Mixed GC,此时对年轻代和老年代都会进行回收。Mixed GC 只有 G1 中才会出现。

总结

本篇文章就到这里了,希望能给你带来帮助,也希望您能够多多关注我们更多内容!

(0)

相关推荐

  • 三道java新手入门面试题,通往自由的道路--JVM

    目录 1. 你知道JVM内存模型吗? 2. 你知道重排序是什么吗? 3. happens-before是什么,和as-if-serial有什么区别 总结 1. 你知道JVM内存模型吗? 在Java的并发中采用的就是JVM内存共享模型即JMM(Java Memory Model),它其实是是JVM规范中所定义的一种内存模型,跟计算机的CPU缓存内存模型类似,是基于CPU缓存内存模型来建立的,Java内存模型是标准化的,屏蔽掉了底层不同计算机的区别. 那我们先来讲下计算机的内存模型: 其实早期计算机

  • Java面试题冲刺第二十九天--JVM3

    目录 面试题1:如何判断对象是否存活 1.引用计数算法 2.可达性分析算法 面试题2:哪些对象可以作为GC Roots? 面试题3:你了解的对象引用方式都有哪些? 1 强引用 2 软引用 3 弱引用 4 虚引用 总结 面试题1:如何判断对象是否存活 对于判断对象是否存活,主要是两种基本算法,引用计数和可达性分析,目前java主要采用的是可达性分析算法 1.引用计数算法 判断对象是否存活的方式如:在对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加一:当引用失效时,计数器值就减一:任何

  • Java面试题冲刺第二十一天--JVM

    目录 面试题1:你遇到过哪些OOM情况,什么原因造成的?怎么解决的? Java heap space GC overhead limit exceeded Permgen space Metaspace Unable to create new native thread Out of swap space? Kill process or sacrifice child Requested array size exceeds VM limit Direct buffer memory 面试题

  • Java经典面试题汇总:JVM

    目录 1. 说一下 JVM 的主要组成部分?及其作用? 2. 说一下 JVM 运行时数据区? 3. 说一下堆栈的区别? 4. 解释内存中的栈(stack).堆(heap)和静态区(static area)的用法 5. 类的生命周期 6. Java对象创建过程 7. 怎么判断对象是否可以被回收? 8. 什么是类加载器? 9. 什么是双亲委派模型? 10. 说一下类装载的执行过程? 11. Java 中都有哪些引用类型? 12. JVM 有哪些垃圾回收算法? 13. JVM 有哪些垃圾回收器? 14

  • JAVA JVM面试题总结

    目录 JVM 的主要作用是什么? 请你描述一下 Java 的内存区域? 请你描述一下 Java 中的类加载机制? 加载 验证 文件格式验证 元数据验证 字节码验证 符号引用验证 准备 解析 初始化 使用 卸载 在 JVM 中,对象是如何创建的? 内存分配方式有哪些呢? 请你说一下对象的内存布局? 对象头 Header 锁的两个列表 实例数据 Instance Data 对齐 Padding 对象访问定位的方式有哪些? 如何判断对象已经死亡? JVM 的主要作用是什么? JVM 就是 Java V

  • Java面试题冲刺第二十七天--JVM2

    目录 面试题1:简单说一下java的垃圾回收机制. 面试题2:JVM会在什么时候进行GC呢? 追问1:介绍一下不同代空间的垃圾回收机制 追问2:能说一下新生代空间的构成与执行逻辑么? 追问3:说一下发生OOM时,垃圾回收机制的执行流程. 面试题3:Full GC .Major GC和 Minor GC有什么不同 (1)Minor GC / Young GC (2)Old GC (3)Full GC (4)Major GC (5)Mixed GC 总结 面试题1:简单说一下java的垃圾回收机制.

  • Java面试题冲刺第二十五天--JVM2

    目录 面试题1:简单说一下java的垃圾回收机制. 面试题2:JVM会在什么时候进行GC呢? 追问1:介绍一下不同代空间的垃圾回收机制 追问2:能说一下新生代空间的构成与执行逻辑么? 追问3:说一下发生OOM时,垃圾回收机制的执行流程. 面试题3:Full GC .Major GC和 Minor GC有什么不同 (1)Minor GC / Young GC (2)Old GC (3)Full GC (4)Major GC (5)Mixed GC 总结 面试题1:简单说一下java的垃圾回收机制.

  • Java面试题冲刺第二十三天--算法(2)

    目录 面试题1:你说一下常用的排序算法都有哪些? 追问1:谈一谈你对快排的理解吧 追问2:说一下快排的算法原理 追问3:来吧!给我手敲一个快排 面试题2:来!再给我手撸一个Spring 追问1:哦,咳咳-说一下构成递归的前提条件有啥? 追问2:递归都有哪些优缺点? 追问3:给我手写一个简单的递归算法的实现吧 面试题3: 10亿个数中找出最大的100000个数(top K问题) 总结 面试题1:你说一下常用的排序算法都有哪些? 追问1:谈一谈你对快排的理解吧 快速排序,顾名思义就是一种以效率快为特

  • Java面试题冲刺第二十五天--实战编程2

    目录 面试题2:怎么理解负载均衡的?你处理负载均衡都有哪些途径? 1.[协议层]http重定向 2.[协议层]DNS轮询 3.[协议层]CDN 4.[协议层]反向代理负载均衡 5.[网络层]IP负载均衡 面试题3:你平时是怎样定位线上问题的? 总结 面试题1:当你发现一条SQL很慢,你的处理思路是什么? 发现Bug 确定Bug不是自己造成的,如果无法确定,不要理会步骤1 向组内宣传"程序里有一个未知Bug,错不在我" 谁响应,谁对Bug负责 没人响应,就要求特定人员配合调试 如果不配合

  • Java面试题冲刺第二十六天--实战编程

    目录 面试题1:你们是怎样保存用户密码等敏感数据的? 面试题2:怎么控制用户请求的幂等性的? 1.设置唯一索引:防止新增脏数据 2.token机制:防止页面重复提交 3.悲观锁 4.乐观锁 5.分布式锁 面试题3:你们是如何预防SQL注入问题的? 预防方式: 1.PreparedStatement(简单有效) 2.使用正则表达式过滤传入的参数 3.使用正则表达式过滤传入的URL 总结 面试题1:你们是怎样保存用户密码等敏感数据的? 本题回答参考朱晔的<Java业务开发常见错误100例> 我们知

  • Java面试题冲刺第二十六天--实战编程2

    目录 面试题2:怎么理解负载均衡的?你处理负载均衡都有哪些途径? 1.[协议层]http重定向 2.[协议层]DNS轮询 3.[协议层]CDN 4.[协议层]反向代理负载均衡 5.[网络层]IP负载均衡 面试题3:你平时是怎样定位线上问题的? 总结 面试题1:当你发现一条SQL很慢,你的处理思路是什么? 发现Bug 确定Bug不是自己造成的,如果无法确定,不要理会步骤1 向组内宣传"程序里有一个未知Bug,错不在我" 谁响应,谁对Bug负责 没人响应,就要求特定人员配合调试 如果不配合

  • Java面试题冲刺第二十二天-- Nginx

    目录 面试题1:谈一下你对 Nginx 的理解 为啥我们总说Nginx好用? 追问1:正向代理和反向代理区别在哪? 正向代理 面试题2:常用的 Nginx 做负载均衡的策略有哪些? 1.指定权重(weight)轮询(默认,常用): 2.ip_hash(常用): 3.least_conn: 4.fair(第三方) 面试题3:说几个你常用的 nginx 命令吧 总结 面试题1:谈一下你对 Nginx 的理解 Nginx 是一款自由的.开源的.高性能的 HTTP 服务器和反向代理服务器:同时也是一个

  • Java面试题冲刺第二十四天--并发编程

    目录 面试题1:说一下你对ReentrantLock的理解? CAS: AQS: 追问1:你认为 ReentrantLock 相比 synchronized 都有哪些区别? 面试题2:解释一下公平锁和非公平锁? 面试题3:能详细说一下CAS具体实现原理么? 追问1:那CAS的缺陷有哪些呢? 1.ABA: 2.自旋消耗资源: 3.多变量共享一致性问题: 追问2:讲一下什么是ABA问题?怎么解决? 总结 面试题1:说一下你对ReentrantLock的理解? ReentrantLock是JDK1.5

  • Java面试题冲刺第二十五天--并发编程3

    目录 面试题1:你了解线程池么?简单介绍一下. 追问1:连接池 和 线程池是一个意思么?有什么区别? 不同点 面试题2:线程池中核心线程数量大小你是怎么设置的? 追问1:核心线程数量过大或过小会造成什么后果? 面试题3:线程池都有哪些状态呀? 追问1:什么条件下会进入TERMINATED状态 总结 面试题1:你了解线程池么?简单介绍一下. java提供的一个java.util.concurrent.Executor接口的实现用于创建线程池. 线程池是一种多线程处理形式,处理过程中将任务提交到线程

  • Java面试题冲刺第二十八天--数据库(5)

    目录 面试题1:MySQL数据库cpu飙升到500%的话你会怎么处理? 面试题2:什么是存储过程?有哪些优缺点 优点 在数据库中集中业务逻辑 使数据库更安全 较快的执行速度 缺点 不可移植性 复杂存储过程消耗资源多 故障排除难 维护成本高 面试题3:比如有个用户表,身份证号字段唯一,那么基于这个字段建索引的话,从效率上讲,你会有哪些考虑呢? 总结 面试题1:MySQL数据库cpu飙升到500%的话你会怎么处理? 当 cpu 飙升到 500%时,先用操作系统命令 top 命令观察是不是 mysql

随机推荐