当前位置: 首页 > 科技观察

说一下JVM架构设计一劳永逸,八股文就算了_0

时间:2023-03-20 11:55:04 科技观察

有小伙伴在我的粉丝群里问了我一个面试题,说面试的时候被问到对JVM的理解,我不知道怎么回答。今天就来聊一聊吧,就算是八股文,你也得知道。另外,我在之前的面试题分析中准备了证明文件。想要领取的可以在文末加我\/领取!我们先来看看什么是JVM?1.什么是JVM?JVM(JavaVirtualMachine)实际上是一套标准。通过定义一个虚拟机,就像一台真实的计算机一样,它能够运行字节码指令。JVM的好处是可以屏蔽操作系统的细节,让Java一次编写,处处运行。实现JVM的厂商有很多,比如Hotspot、JRockit、IBMJ9等。今天重点说说主流的Hotspot,因为OracleJDK和OpenJDK都使用了HotSpotVM。从源码层面,两者基本没有区别。2、JVM架构设计下面我给大家详细介绍一下JVM架构设计。总体来说,HotSpotVM主要由三个核心部分组成:ClassLoaderSubsystem、RuntimeDataAreas和ExecutionEngine(执行引擎)那么HotspotJVM架构和运行机制的细节有哪些呢?首先,将编译后的.class文件加载到类加载子系统中。它的主要功能是查找并验证class文件,完成相关的内存空间。分配和对象分配。class文件加载到内存后,数据存储和数据交换由运行时数据区完成。运行时数据区又分为线程共享内存区和线程隔离内存区。线程共享内存区包括方法区和堆区,是程序员可以通过编写代码直接操作的内存区,而线程隔离内存区包括栈区、程序计数器、本地方法栈,是内存完全由JVM区域调度。我们先来看方法区。它的主要功能是存储运行时常量池、字段和方法的元数据,以及类的元数据。至于堆区,主要用来存放Java对象的实例,也就是我们新建的类都存在于堆区。栈区通过线程运行,加载各种方法。程序计数器负责保存每个线程执行的方法的地址。本地方法区负责加载和运行native类型的方法,从而通过运行时数据区的五个内存区来完成Java程序逻辑的执行和数据交换。接下来看执行引擎,主要包括实时编辑器和垃圾收集器。即时编译器,通俗的理解,是用来将字节码翻译成操作系统可以执行的CPU指令。可以通过JVM参数设置选择解释执行还是编译执行。所谓解释执行就是直接把字节码作为源程序输入解释执行,而不用等编译器编译完成再执行,这样可以节省很多不必要的编译时间。编译执行是指编译器一次性将目标代码编译成目标程序,然后在机器上运行。执行效率更高,内存资源消耗更小。在Hotspot的实现中,默认是两种方法的结合。垃圾收集器主要负责管理和回收运行时数据区中的数据。其实就是各种垃圾回收算法的实现。一般来说,核心算法有3种,即复制算法、标记清除算法和标记排序算法。这些对于算法的选择,我们可以通过JVM参数来设置。最后再看一下本地方法接口,也就是JNI技术。我们可以通过JNI找到并调用C或C++实现的代码,也可以调用操作系统的动态链接库(DLL)等等。3.综上所述,通过对Hotspot架构的分析,相信大家对JVM的运行原理有了非常清晰的认识。当然,在实际开发过程中,我们可以通过配置JVM参数来调优JVM,比如这些参数。也可以使用一些常用的JDK命令来分析JVM的状态,找出问题的原因来完成JVM的调优,比如这些命令。