高频面试题 - JVM虚拟机体系结构
一. 前言
最近有很多小伙伴都在找工作,他们在面试时经常会被面试官问到一个问题:请说出JVM虚拟机的体系结构?
很多小伙伴都能说出堆、栈等相关内容,但面试官紧接着又问,你还知道其他内容吗?不少小伙伴就语塞了.......
这些小伙伴面试完就跑来问健哥这个问题到底该怎么回答才能拿高分,所以今天健哥就在这里给大家讲讲JVM虚拟机体系结构的深层内涵,让你下次面试时可以直接反虐面试官。
二. 题目考点
在梳理今天的面试要点之前,健哥先给大家分析一下面试官的心理。如果面试官是健哥的话,那么我想考查的其实就是候选人是否对JVM虚拟机有一个宏观的理解。
其实大家可以来想一下,面试官为什么要问这个问题呢?这主要是因为我们进行JVM优化的第一步,就是要先理解整个JVM虚拟机的体系结构和作用,然后再学习JVM的垃圾回收机制、JVM分析的命令等内容,最后才会进行JVM的调优或者优化。只有对JVM虚拟机有整体的理解和把握,我们才能对JVM进行更深入的使用和优化。
下面就是健哥给大家整理的关于JVM虚拟机的整体学习思路和内容:
有了对JVM的整体了解,接下来我们就可以进一步对这道面试题进行分析了。
三. 解题分析
下面是健哥为大家整理的解题思路,单看这张图就很用心吧,拿去不谢哦。
这里JVM虚拟机的结构一共可以分为九个部分,如下图所示:
接下来健哥再简单说一下每个部分的核心作用。
3.1 类加载器
类加载器(class loader)用来把Java类加载到Java的虚拟机中。
Java源程序(.java 文件)在经过 Java编译器编译之后,生成了对应的Java 字节代码(.class 文件),然后类加载器就负责读取这些Java的字节代码,并将其转换成java.lang.Class类的一个实例。每个这样的实例都用来表示一个Java 类,JVM可以通过此实例的 newInstance()方法创建出该类的一个对象。
3.2 方法区
Java的方法区和堆类似,方法区是一块所有线程都可以共享的内存区域,它保存着系统的类信息,比如类的字段、方法、常量池等。
3.3 Java堆
堆内存用于存放由new操作创建出来的对象和数组,例如new String()创建一个对象,而这个对象就会放入到Java堆中进行存储。
3.4 Java栈
栈是线程私有的,它的生命周期与线程相同,用于存储局部变量、动态链接、方法出口等信息。
3.5 直接内存
直接内存并不是虚拟机运行时数据区的一部分,也不是Java虚拟机规范中定义的内存区域。主要是用于提高一些场景中的性能,比如在NIO中增加NIO的性能。
3.6. 本地方法栈
本地方法栈用于本地方法的调用。我们知道,在JDK源码中很多地方使用了Native关键字,这就是在调用底层C语言编写的本地方法。
3.7. 垃圾回收系统
垃圾回收器也叫做垃圾回收系统,主要用于在JVM运行时回收垃圾(不再引用的对象),释放被占用的内存。
3.8. PC寄存器
在每个线程启动时JVM都会创建一个PC寄存器,用于保存下一条将要执行的指令地址。PC寄存器的内容总是指向下一条即将被执行指令的地址,这里的地址可以是一个本地指针,也可以是在方法区中相对应于该方法起始指令的偏移量。
3.9. 执行引擎
执行引擎主要是用于执行编译后的字节码指令。
四. 小结
经过上面的一系列分析,最后健哥来给大家总结下这个问题的完整答案:
JVM虚拟机体系结构一共分为九个部分:类加载器、方法区、Java堆、Java栈、直接内存、本地方法栈、垃圾回收器、PC寄存器、执行引擎等。
大家一定要牢记,这可是一道高频的面试题哦!!!