-
Java 四引用是什么?
-
如何理解 JVM 内置的编译或 GC 日志?
-
JVM 的永久代中会发生垃圾回收么?
-
Java 中的两种异常类型是什么?他们有什么区别?
-
JVM 是如何实现同步的?
-
Java 内在模型是什么?
-
即使编译器有哪些优化?
-
在什么情况下重复读写操作会被优化?
-
什么样的垃圾才被回收?
-
什么时候会导致垃圾回收?
-
如何利用 JFR 和 JMC 监控 Java 程序?
-
如何利用 Unsafe API 绕开 JVM 的控制?
-
如何利用字节码注入为已有代码加料?
我挑选了几个问题进行解答,希望能对大家面试起到帮助。
1、什么是 Java 虚拟机?为什么 Java 被称作是“平台无关的编程语言”?
Java 虚拟机是一个可以执行 Java 字节码的虚拟机进程。Java 源文件被编译成能被 Java 虚拟机执行的字节码文件。
Java 被设计成允许应用程序可以运行在任意的平台,而不需要程序员为每一个平台单独重写或者是重新编译。Java 虚拟机让这个变为可能,因为它知道底层硬件平台的指令长度和其他特性。
2、Java 代码是怎么运行的?
这个问题可以分三块来回答:
-
为什么 Java 要在虚拟机里运行?
-
Java 虚拟机具体是怎样运行 Java 字节码的?
-
Java 虚拟机的运行效率究竟是怎么样的?
Java 之所以要在虚拟机中运行,是因为它提供了可移植性。一旦 Java 代码被编译为 Java 字节码,便可以在不同平台上的 Java 虚拟机实现上运行。此外,虚拟机还提供了一个代码托管的环境,代替我们处理部分冗长而且容易出错的事务,例如内存管理。
Java 虚拟机将运行时内存区域划分为五个部分,分别为方法区、堆、PC 寄存器、Java 方法栈和本地方法栈。Java 程序编译而成的 class 文件,需要先加载至方法区中,方能在 Java 虚拟机中运行。
为了提高运行效率,标准 JDK 中的 HotSpot 虚拟机采用的是一种混合执行的策略。首先,它会解释执行 Java 字节码,然后会将其中反复执行的热点代码,以方法为单位进行即时编译,翻译成机器码后直接运行在底层硬件之上。HotSpot 装载了多个不同的即时编译器,以便在编译时间和生成代码的执行效率之间做取舍
3、Java 虚拟机是如何加载 Java 类的?
Java 虚拟机将字节流转化为 Java 类的过程,可分为加载、链接以及初始化三大步骤。也可以用盖房子来类比 Java 虚拟机中的类加载。
加载是指查找字节流,并且据此创建类的过程。以盖房子为例,村里的 Tony 要盖个房子,那么按照流程他得先找个建筑师,跟他说想要设计一个房型,比如说“一房、一厅、四卫”。这里的房型相当于类,而建筑师,就相当于类加载器。村里有许多建筑师,他们等级森严,但有着共同的祖师爷,叫启动类加载器(boot class loader)。
加载需要借助类加载器,在 Java 虚拟机中,类加载器使用了双亲委派模型,即接收到加载请求时,会先将请求转发给父类加载器。
链接,是指将创建成的类合并至 Java 虚拟机中,使之能够执行的过程。链接还分验证、准备和解析三个阶段。其中,解析阶段为非必须的。
初始化,则是为标记为常量值的字段赋值,以及执行方法的过程。类的初始化仅会被执行一次,这个特性被用来实现单例的延迟初始化。这放在我们盖房子的例子中就是,只有当房子装修过后,Tony 才能真正地住进去。
4、如何监控和诊断 JVM 堆内和堆外内存使用?
最后总结
搞定算法,面试字节再不怕,有需要文章中分享的这些二叉树、链表、字符串、栈和队列等等各大面试高频知识点及解析
最后再分享一份终极手撕架构的大礼包(学习笔记):分布式+微服务+开源框架+性能优化
,有需要文章中分享的这些二叉树、链表、字符串、栈和队列等等各大面试高频知识点及解析
最后再分享一份终极手撕架构的大礼包(学习笔记):分布式+微服务+开源框架+性能优化
[外链图片转存中…(img-Mr1vt7IF-1714409231250)]