对应面试题以及回答素材:
②面试连环炮之【JVM内存结构+内存分配策略】
面试连环炮1:【内存划分】
- 字节码对象存放在JVM内存的什么位置?
- 说一下 JVM 的主要组成部分及其作用?
- JVM中有哪几块区域(运行时数据区)?分别有什么作用?
最好是建议按照代码的执行流程来进行区域的介绍,以及对应区域的一些特点或作用深入的讲解回答
如果能够在面试的时候,边回答还能边画图给面试官讲解,基本上面试是非常稳了
面试连环炮2:【程序计数器】
- JVM哪块区域不会存在内存溢出?
- 程序计数器
- 程序计数器有哪些特点和作用?
- 记录字节码指令位置
- 提供给对应的私有线程进行指令位置的读取和记录
面试连环炮3:【虚拟机栈】
请分别介绍下什么是虚拟机栈、栈帧、活动栈帧
每个线程运行时所需要的内存,称为虚拟机栈
每个栈由多个栈帧(Frame)组成,对应着每次方法调用时所占用的内存
每个线程只能有一个活动栈帧,对应着当前正在执行的那个方法
队列和栈是什么?有什么区别?
栈是先进后出,队列是先进先出
垃圾回收是否涉及栈内存?
垃圾回收是不涉及栈内存的,因为我们的栈帧弹栈的时候,空间中的局部变量会随着栈帧的弹栈而一起被回收,对应的空间自动释放了,所以栈内存不需要进行对应的垃圾回收。
栈内存分配越大越好吗?
我们先来看官网给出的每个虚拟机栈默认的大小分配:
Linux系统上默认就是1MB,当然我们可以通过-Xss进行大小的更改
栈内存分配并不是越大越好,假设我们能分配的物理内存是100MB,这里的每一个线程对应的虚拟机栈大小默认为1MB,我们可以分配的线程数量就是100个,那如果说虚拟机栈的大小变大了,那么我们可以分配的线程数量对应也就减少了。
方法内的局部变量是否线程安全?
- 如果方法内局部变量没有逃离方法的作用访问,它是线程安全的
- 如果是局部变量引用了对象,并逃离方法的作用范围,需要考虑线程安全
什么原因导致栈内存溢出(Stack Overflow)
1)栈帧过多导致内存溢出, 将抛出StackOverflowError异常。
2)栈帧过大导致内存溢出, 将抛出StackOverflowError异常。
无论是由于栈帧太大还是虚拟机栈容量太小, 当新的栈帧内存无法分配的时候,HotSpot虚拟机抛出的都是StackOverflowError异常。
面试连环炮4:【堆内存+对象分配】
请说下对象在内存中是如何分配的?
在⽅法执⾏时,可能我们就会执⾏new操作创建对象,创建出来对象的内存空间的分配,就要分配 到另外⼀个JVM区域即堆内存
请说下对象在内存中是如何流转的?
- 堆内存的分代模型: 新生代(Eden区、两个Survior区)、老年代
什么时候会在Minor GC前触发一次Full GC?
Minor GC触发后对应哪几种回收结果?
以上两个问题暂时不在这个环节做讲解了,后在后续我们第三个环节讲:垃圾回收的时候进行统一的讲解。
结合对象的引用类型、垃圾回收算法、动态年龄判断、空间担保原则等等之类的结合一起介绍后大家才能去更好的回答以上两个问题。
面试连环炮5:【方法区】
- 说下方法区和永久代的关系
- 为什么要将永久代替换为元空间Metaspace
- StringTable为什么要调整位置