当前位置:首页 > 行业动态 > 正文

JVM运行原理是怎么样的呢

JVM(Java虚拟机)是一种软件,它可以在不同的操作系统上运行Java程序。JVM的运行原理是将Java字节码文件转换为本地机器代码,然后执行这些代码。JVM有自己完善的硬件架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。

JVM运行原理是怎么样的呢?

Java虚拟机(JVM,Java Virtual Machine)是一个抽象的计算机,它为Java程序提供了一个平台,使得Java程序可以在不同的操作系统上运行,JVM运行原理主要包括类加载、字节码执行和垃圾回收三个部分,下面我们将详细介绍这三部分的内容。

类加载

1、1 类加载的概念

类加载是JVM将Java源代码编译成字节码文件的过程,在Java程序中,当我们使用关键字class或者new时,JVM会自动进行类加载,类加载的主要目的是将类的字节码文件加载到内存中,以便后续的操作(如方法调用、字段访问等)。

1、2 类加载的三种方式

根据类加载的时机不同,可以将类加载分为三种方式:引导类加载、静态类加载和动态类加载。

(1)引导类加载(Bootstrap Class Loader):也称为启动类加载器,是JVM启动时首先执行的类加载器,引导类加载器负责加载Java核心库中的类,如java.lang.*包中的类,引导类加载器可以手动加载类,也可以通过Java命令行参数指定要加载的类。

(2)静态类加载(Static Class Loader):也称为扩展类加载器,负责加载Java应用程序的类,当应用程序启动时,系统会自动创建一个名为APPClassLoader的类加载器,该类加载器负责加载应用程序中的类,通常情况下,应用程序不需要关心静态类加载器的细节。

(3)动态类加载(Dynamic Class Loader):也称为子类加载器,负责在运行时动态加载类,当我们使用Class.forName()方法或者ClassLoader.loadClass()方法加载类时,实际上就是触发了动态类加载,动态类加载的方式有很多,如URLClassLoader、FileClassLoader等。

字节码执行

2、1 字节码的概念

字节码(Bytecode)是一种介于机器码和高级语言之间的中间代码,在Java程序中,源代码会被编译成字节码文件(.class文件),然后由JVM执行,字节码具有平台无关性、高效性和安全性等特点。

2、2 Java字节码的结构

Java字节码主要包括以下几个部分:

操作数栈:用于存储操作数的栈结构。

操作数栈帧:每个操作数栈帧包含了局部变量表、操作数栈、常量池等信息。

堆栈:用于存储方法返回值或局部变量的栈结构。

常量池:存储编译时期生成的常量和符号引用。

指令集:包含了一系列的基本操作指令,如LOAD、STORE、ADD、SUB等。

异常处理块:用于处理异常的方法入口和出口。

2、3 Java虚拟机规范(JVM Specification)

Java虚拟机规范定义了字节码的结构和指令集,以及各个组成部分之间的关系,在实际的JVM实现中,可能会有一些差异,但基本的架构和规范是相同的。

垃圾回收

3、1 垃圾回收的概念

垃圾回收(Garbage Collection,GC)是JVM自动管理内存的一种机制,当对象不再被引用时,垃圾回收器会自动回收这些无用的对象所占用的内存空间,以便其他对象可以使用这部分内存资源,这样可以避免内存泄漏和内存溢出等问题。

3、2 垃圾回收算法

目前主流的垃圾回收算法有以下几种:

分代收集算法:将内存划分为新生代和老年代,新创建的对象分配在新生代,经过多次回收仍然存活的对象会被提升到老年代,这种算法的优点是可以减少全局回收的次数,提高回收效率;缺点是可能导致内存碎片化问题,常见的分代收集算法有Serial、Parallel、CMS等。

标记-清除算法:遍历所有可达对象,并将其标记为可达或不可达;然后清除不可达对象所占用的内存空间,这种算法的优点是简单且高效;缺点是会产生内存碎片化问题。

复制算法:将内存划分为两个相等的部分,每次只使用其中的一半;当其中一部分被回收时,将另一部分的内容复制到已使用的那一半中,这种算法的优点是对内存布局没有要求,适合处理浮动垃圾回收问题;缺点是可能导致内存碎片化问题和性能下降,常见的复制算法有Copying、Mark and Sweep等。

标记-整理算法:先标记所有可达对象,然后将所有存活的对象向一端移动,最后清除边界以外的内存空间,这种算法的优点是对内存布局没有要求,适合处理浮动垃圾回收问题;缺点是可能导致内存碎片化问题和性能下降,常见的标记-整理算法有Compacting等。

0