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等。
原创文章,作者:酷盾叔,如若转载,请注明出处:https://www.kdun.com/ask/126345.html
本网站发布或转载的文章及图片均来自网络,其原创性以及文中表达的观点和判断不代表本网站。如有问题,请联系客服处理。
发表回复