Java 虚拟机面试题 - 草稿

2021-05-04  本文已影响0人  彭旭锐

点赞关注,不再迷路,你的支持对我意义重大!

🔥 Hi,我是丑丑。本文 「Java 路线」导读 —— 他山之石,可以攻玉 已收录,这里有 Android 进阶成长路线笔记 & 博客,欢迎跟着彭丑丑一起成长。(联系方式在 GitHub)


前言

面试季又来了,Java 基础知识又可以拿出来复习了~ “基础不牢,地动山摇”,这些内容不难,但必须要会,一起加油吧。



1、基本概念


2、内存管理

说一说虚拟机内存分配模型 / 运行时数据区域

Java 虚拟机的运行时数据区域主要分为线程私有区域和线程共享区域两类。其中私有区域包括「程序计数寄存器」、「Java 虚拟机栈」和「本地方法栈」,共享区域包括「Java 堆」和「方法区」。


Java 虚拟机栈帧包含哪些内容?

Java 虚拟机栈帧包含:局部变量表 & 操作数栈 & 动态连接 & 返回地址。局部变量表存储局部变量,操作数栈存放字节码指令的操作数,动态连接???,返回地址存放函数调用位置的下一行指令,用于在方法正常返回时返回到上一层方法继续执行。


方法区和永生代的区别?

方法区是虚拟机规范约定的运行时数据区域,而永生代和元空间是方法区在不同虚拟机上的具体实现。在 JDK 1.7 之前,HotSpot 虚拟机使用永久代来实现方法区。永久代中存储的都是生命周期较长的数据,可以跟堆一起执行垃圾回收,但回收率比新生代低。考虑到永生代内存空间有限,经常出现内存溢出异常,从 JDK 1.8 开始,HotSpot 虚拟机使用元空间来实现方法区,元空间利用了本地内存存储,扩展了方法区的内存上限。不过元空间也不是完美的,因为机器内存总归是有限的,大量占用本地内存也会挤压堆内存的上限。


对象的内存布局?

对象的内存布局主要包含 3 个区域:对象头 & 实例数据 & 对齐填充。其中对象头主要包含 Mark Work 标志位,如果采用「直接指针」的对象访问,那么对象头里还包含类型指针。如果是数组对象,那么对象头还包含数组的长度。实例数据区存储了「本类声明的实例字段」和「从父类继承的实例字段」(类字段存储在方法区)。

相关深入文章:
Java 虚拟机 | 拿放大镜看对象
Java 虚拟机 | 内存分配模型


3、内存管理

垃圾回收机制的优缺点?


说一下垃圾回收的过程?

垃圾回收算法可以分为四类基本算法:引用计数算法、标记-清理算法、标记-整理算法和复制算法。其它的垃圾回收算法都是对基础算法的改进或组合。比如主流的虚拟机垃圾回收算法采用分代回收模型:即在新生代选用复制算法(对象存活率低),而老生代选用 “标记 - 清理” 或 “标记 - 整理” 算法(对象存活率高,并且没有额外空间进行分配担保);


有哪些优化垃圾回收效率的方法?

image

如何判断对象已死?

判断对象是否存活的方法有「引用计数法」和「可达性分析法」。引用计数法指创建对象时额外分配一个引用计数器,该计数器记录了指向对象的引用个数,当一个新引用指向对象时计数器加 1,当一个引用不再指向对象时,计数器减 1,直到计数器清 0,该对象判定为垃圾对象。可达性分析法指根据引用关系形成一条引用链,当一个对象存在到 GC Root 的引用链时,则为存活对象,否则判定为垃圾对象。

引用计数法的优点是及时(当对象变成垃圾后,程序可以立刻感知,马上回收)和最大暂停时间短(GC 可与应用交替运行),缺点是计数器更新频繁、堆利用率低和实现复杂,最大的缺陷是无法回收循环引用对象。

可达性分析法的优点是可以回收循环引用对象和实现简单,缺点是回收不及时(只有执行 GC 才能感知垃圾对象)和最大暂停时间长(在 GC 期间,整个需要 stop-the-world)。


GC Root 有哪些?

相关深入文章:Java 虚拟机 | 垃圾回收机制


上一篇 下一篇

猜你喜欢

热点阅读