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

深入研究Java虚拟机架构总结

时间:2023-03-21 17:18:52 科技观察

自从开始工作以来,写的代码越来越多,程序越来越臃肿,效率越来越低。不允许,所以除了不断优化程序结构,内存优化和性能调优也成了我惯用的“招数”。要优化Java程序的内存和性能,不了解虚拟机的内部原理(或者叫规范更严谨一点)是绝对不行的。这里推荐一本好书《深入Java虚拟机 (第二版)》(BillVenners着,曹晓刚、蒋静译,其实这篇文章是作者读完这本书后对Java虚拟机的个人理解)。当然,了解Java虚拟机的好处并不仅限于以上两个好处。从更深层次的技术层面,了解Java虚拟机的规范和实现,将更有利于我们编写出高效稳定的Java代码。例如,如果我们了解了Java虚拟机的内存模型和虚拟机的内存回收机制,那么我们就不会过分依赖它,而是会在需要的时候显式“释放内存”(Java代码不能显式释放内存,但你可以通过释放对象引用的方式告诉垃圾回收器回收该对象)以减少不必要的内存消耗;如果我们了解了Java栈的工作原理,那么我们就可以减少递归的层数和循环次数,从而降低栈溢出的风险。或许对于应用程序开发者来说,他们可能并没有直接参与到这些Java虚拟机的底层实现中,但是了解这些背景知识,或多或少会对我们编写的程序产生潜移默化的良好影响。本文将简要说明Java虚拟机的体系结构和内存模型。如有不当用词或解释不准确之处,欢迎指正。我很荣幸!Java虚拟机架构类加载子系统Java虚拟机机器有两种类加载器,分别是启动类加载器和用户自定义加载器。通用类加载子系统通过类的完全限定名(包名和类名,网络加载还包括URL)将Class加载到运行时数据区。对于每个加载的类型,Java虚拟机都会创建一个java.lang.Class类的实例来表示该类型,放在内存中的堆区,加载的类型信息位于方法区与所有相同其他对象。在加载类型之前,类加载子系统不仅会定位并导入相应的二进制类文件,还会验证导入类的正确性,为类变量分配和初始化内存,并将符号引用解析为直接引用。这些动作严格按以下顺序进行:1)加载——查找并加载该类型的二进制数据;2)connect-执行验证、准备和解析(可选)3)验证以确保导入类型的正确性4)准备类变量分配内存,并将其初始化为默认值5)解析并转换符号引用中的类型到直接应用方法区对于类加载子系统加载的每个类型,虚拟机都会在方法区保存以下数据:.Objecthasnosuperclass)无论类型是类类型还是接口类型类型的访问修饰符任何直接超接口的完全限定名称的有序列表除了上述基本类型信息外,还将保存以下信息:类型常量池字段信息(包括字段名、字段类型、字段修饰符)方法信息(包括方法名、返回类型、参数个数和类型、方法修饰符,如果方法不是抽象的和局部的,也会在方法的栈帧和异常表中保存方法的字节码,操作数栈和局部变量区的大小)除常量外的所有类变量(实际上类的静态变量,因为静态变量是所有实例共享的,而且和类型有直接关系,所以是类级变量,作为类的成员存放在方法区)类的引用ClassLoader//返回刚刚保存的ClassLoader引用String.class.getClassLoader();aReferencetotheClass类//会返回刚才保存的Class类的引用String.class;注意,方法区也可以被垃圾收集器回收。堆Java程序在运行时创建的所有类实例或数组都放在同一个堆中,每个Java虚拟机也有一对空间,所有线程共享一个堆(多线程Java程序会这样生成objects访问同步问题的原因)。由于每个Java虚拟机都有不同的虚拟机规范实现,我们可能不知道每个Java虚拟机在堆中以什么形式表示一个对象实例,但是我们可以通过以下可能的实现来一探究竟:程序计数器对于一个正在运行的Java程序,每个线程都有自己的PC(程序计数器)寄存器,它是在线程启动时创建的,大小为一个字,用于保存需要执行的下一行代码的位置。Java栈每个线程都有一个Java栈,以栈帧为单位保存线程的运行状态。虚拟机对Java栈的操作有两种:push和pop,都是基于frame的。栈帧存放传入参数、局部变量、中间运行结果等数据,在方法执行完成时弹出,然后释放。看一下添加两个局部变量时堆栈帧的内存快照。本地方法栈是Java调用操作系统本地库的地方。它用于实现JNI(JavaNativeInterface,Java原生接口)执行引擎。Java虚拟机核心,控制加载Java字节码并解析;对于一个正在运行的Java程序来说,每个线程都是一个独立的虚拟机执行引擎的实例。从线程生命周期的开始到结束,他要么在执行字节码,要么在执行一个native方法。本机接口将本机方法栈与操作系统库连接起来。注意:本文中所有对“Java虚拟机”的引用均指“JavaEE和JavaSE平台的Java虚拟机规范”。