Appearance
面试题 Java 虚拟机(JVM)
说说你了解的 JVM 内存模型?
得分点 类加载子系统、执行引擎、运行时数据区
JVM 由三部分组成:类加载子系统、执行引擎、运行时数据区。
- 类加载子系统,可以根据指定的全限定名来载入类或接口。
- 执行引擎,负责执行那些包含在被载入类的方法中的指令。
- 当程序运行时,JVM 需要内存来存储许多内容,例如:字节码、对象、参数、返回值、局部变量、运算的中间结果,等等,JVM 会把这些东西都存储到运行时数据区中,以便于管理。而运行时数据区又可以分为方法区、堆、虚拟机栈、本地方法栈、程序计数器。
加分回答:运行时数据区是开发者重点要关注的部分,因为程序的运行与它密不可分,很多错误的排查也需要基于对运行时数据区的理解。在运行时数据区所包含的几块内存空间中,方法区和堆是线程之间共享的内存区域,而虚拟机栈、本地方法栈、程序计数器则是线程私有的区域,就是说每个线程都有自己的这个区域。
说说 JVM 的垃圾回收机制
得分点 新生代收集、老年代收集、混合收集、整堆收集
当前商业虚拟机的垃圾收集器,大多数都遵循了“分代收集”的理论进行设计,分代收集名为理论,实质是一套符合大多数程序运行实际情况的经验法则。而分代收集理论,建立在如下三个分代假说之上,即弱分代假说、强分代假说、跨代引用假说。依据分代假说理论,垃圾回收可以分为如下几类:
- 新生代收集:目标为新生代的垃圾收集。
- 老年代收集:目标为老年代的垃圾收集,目前只有 CMS 收集器会有这种行为。
- 混合收集:目标为整个新生代及部分老年代的垃圾收集,目前只有 G1 收集器会有这种行为。
- 整堆收集:目标为整个堆和方法区的垃圾收集。
加分回答:HotSpot 虚拟机内置了很多垃圾收集器,其中针对新生代的垃圾收集器有 Serial、ParNew、Parallel Scavenge,针对老年代的垃圾收集器有 CMS、Serial Old、Parallel Old。此外,HotSpot 还内置了面向整堆的 G1 收集器。在上述收集器中,常见的组合方式有:
- Serial + Serial Old,是客户端模式下常用的收集器。
- ParNew + CMS,是服务端模式下常用的收集器。
- Parallel Scavenge + Parallel Old,适用于后台运算而不需要太多交互的分析任务。