面试系列(二)--JVM知识

39 阅读6分钟

1、Java内存区域

堆、方法区、程序计数器、虚拟机栈、本地方法栈、直接内存

:存放对象实例和数组。

细分为新生代和老年代。采用分代垃圾回收机制。Eden、Survivor、Old空间。

年轻代 15岁升级到老年代

字符串常量池:在堆空间内。静态变量也在堆空间

方法区:被虚拟机加载的类信息

  • 方法区、永久代、和元空间是什么关系?方法区是一个概念,元空间和永久代是具体实例。现在使用的是元空间【底层直接使用的是本地内存】

方法区包含运行时常量池。运行时常量池包含的是字面量和符号引用

程序计数器:存储线程执行指令的位置,用于线程切换后确定执行位置。不会出现OOM,随着线程结束而消亡

Java虚拟机栈:方法调用时通过在栈里面创建栈帧完成。

  • 栈帧的内容:局部变量表、操作数栈、动态链接、方法返回地址。
  • 局部变量表:方法调用时的局部变量,基本数据类型数据和对象引用
  • 操作数栈:方法调用过程中产生的临时变量
  • 动态链接:方法调用过程中嵌套调用其它方法时,需要通过动态链接来找到方法的内存地址引用

栈异常:StackOverFlow、OOM,方法调用无限循环调用时出现StackOverFlow;动态扩展栈空间申请不到时OOM

本地方法栈:调用native本地方法的栈

本地内存:通过JNI在本地内存中分配。JNI,通过Java的NIO使用Native分配,通过Java堆里面的DirectByteBuffer对象引用来操作

2、Java对象创建的过程

①、检查类的符号引用是否已经加载?-> ②、从Java堆中划分内存块 -> ③、对象实例中字段初始化为0值 -> ④、设置对象头信息 -> ⑤、执行init构造函数

②中如何划分内存块?取决于Java堆垃圾回收方式,如果是标记-压缩算法的话,则使用指针碰撞方式从未使用空间划分并且更改使用和未使用的界限指针;如果使用的是标记-清除算法的话,使用空闲列表方式,从空闲列表中挑选大小合适的空间分配

②中分配的时候怎么保证线程安全?CAS + 失败重试 / TLAB(堆空间划分线程缓冲区,线程在缓冲区内开辟空间)

③中对象头包含什么?对象头有两种信息,一种是对象运行期间的基本信息,一种是类型指针。运行期间基本信息包括对象自身分代年龄、锁这些,类型指针是指向对象所属的类的信息

3、对象访问定位的两种方式

句柄和直接指针。

句柄是栈中的reference指向的是堆中的句柄,句柄里面保存的是对象实例、对象类型数据【指向方法区】的指针。

直接指针是栈中的reference直接指向堆中对象实例地址,该地址中包含对象类型数据指针

4、如何判断对象是否死亡(两种方法)。

引用计数器法:对象添加一个引用计数器,如果有引用的话,计数器+1,计数器=0代表对象没有被引用

可达性分析算法:对象通过GCRoots是否存在引用链可达?不可达的话即将被回收

引用

4.1、强引用、软引用、弱引用、虚引用

(虚引用与软引用和弱引用的区别、使用软引用能简单的介绍一下带来的好处)。

强引用:一般不会被回收的对象引用

软引用:只有在申请开辟内存空间不足时,触发软引用的回收

弱引用:发生垃圾回收动作时就会被回收

虚引用:相当于没有引用,有何作用?虚引用一般会和引用队列强关联,用来跟踪对象是否被放入引用队列?对象是否被回收

5、如何判断一个常量是废弃常量

常量不存在任何引用

6、如何判断一个类是无用的类

类无效判定:堆中没有类的实例 && 加载类的ClassLoader不存在 && 没有java.lang.Class引用的使用

7、垃圾收集有哪些算法,各自的特点?

标记-清除:标记所有正常使用的对象,将无引用的对象清理掉

标记-复制:将空间一分为2,每次使用1个,回收时标记正常使用的对象,将对象挪到第二个空间,清理第一个空间

标记-整理:标记所有正常使用的对象,将使用的对象都挪到一块,然后通过清理边界之后的空间清理掉不可达的对象

标记清除算法,回收之后空间是不连续的;标记复制算法每次使用的空间都是真实的1/2;标记整理算法清理之后空间连续,但是挪动对象位置是费时的

现在的虚拟机都采用的是分代收集算法

8、HotSpot 为什么要分为新生代和老年代?

因为不同区域的对象它的生命特征不一致,新生代的对象大部分在回收时会被清理掉,老年代的对象普遍存活时间比较久

9、常见的垃圾回收器有哪些?

Serial串行收集器;Serial Old老年代串行收集器

ParNew Serial的并行版本

Parallel Scavenge 吞吐量大,采用标记复制算法实现;Parallel Old老年代收集器,标记-整理算法

CMS收集器,采用标记-清理算法。

G1收集器。采用标记-整理算法

10、介绍一下 CMS,G1 收集器。

CMS收集器是并发收集器,停顿时间短。包含:初始标记 - 并发标记 - 重新标记 - 并发清理。

堆空间只划分了新生代(连续)和老年代(连续)

G1收集器也是并发收集器,支持设置指定最大停顿时间。过程包含:初始标记 - 并发标记 - 重新标记 - 筛选清理

使用的是标记-整理算法。内部支持 ①、指定最大停顿时间;②、按照停顿时间选择操作Region集;③、Region方式管理堆空间。一个Region里面包含新生代、老年代。分代之间空间是Region动态搭配的

11、Minor Gc 和 Full GC 有什么不同呢?


minor GC是指新生代的回收。FullGC是全堆回收

Q:什么是空间分配担保?

空间分配担保是为了执行MinorGC后老年代能容纳新生代的所有对象的剩余空间。否则的话进行FullGC