浅谈jvm体系结构(一)

JVM是java程序得以运行的平台,也是java程序可以跨平台的底层支撑。下面是JVM的一个体系结构图

类加载器(Class Loader)

Class文件需要被加载到内存里才能得以运行和使用。虚拟机把Class文件加载到内存后,对数据进行验证,转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。具体内容在之后的篇幅进行详细介绍。

参考博客https://blog.csdn.net/duan196_118/article/details/104215262

运行时数据区

JVM运行时数据区的各部分划分很明显。

1. 方法区 - 方法区是被所用线程共享,所有字段和方法字节码以及一些特殊方法,如构造函数,接口代码也在此定义,简单的说,所有定义的方法的信息都保存在该区域,此区域属于共享区域。

静态变量,常量,类信息(构造方法,接口定义),运行时的常量池存在方法区中,但是实例变量存在堆内存中,和方法区无关。

2. 堆区 - 用于存储java程序在运行过程中创建的所有对象。每个JVM还有一个堆区。由于方法 和堆区共享多个线程的内存,所存储的数据不是线程安全的。

3. 栈区 - 对于每个线程,都会创建一个单独的运行时栈。对于每个方法调用,将在栈内存中创建一个称为堆栈帧的条目。所有局部变量都将在栈内存中创建。因为它不是共享资源,所以栈区域是线程安全的

扫描二维码关注公众号,回复: 9026306 查看本文章

4. PC寄存器 - 每个线程都有独立的PC寄存器,是线程私有的,一旦执行指令就保存当前执行指令的地址,PC寄存器将用下一条指令更新。即它代表指令在主存中的地址,每执行一条指令后PC+1,即指向下一条指令。本地方法栈即通过Java调用本地方法时的相关信息,但与调用Java方法不一样,调用Java方法时JVM会向当前Java栈中压入一个新的栈桢,而调用本地方法则不会修改Java栈。

5. 本地方法栈 - 本地方法栈包含本机方法信息。对于每个线程,都会创建一个单独的本地方法栈。可以理解成JVM运行时数据区的一个扩展。

执行引擎:执行字节码指令,该区域包括解释器、编译器和垃圾回收器。

1. 解释器:解释器更快地解释字节码,但执行缓慢。解释器的缺点是当一个方法被调用多次时,每次都需要一个新的解释。一次性解释字节码是最简单同时效率最低的

2. JIT编译器(即时编译):JIT编译器消除了解释器的缺点。执行引擎将在转换字节码时使用解释器的帮助,但是当它发现重复的代码时,将使用JIT编译器,它编译整个字节码并将其更改为本地代码。这个本地代码将直接用于重复的方法调用,这提高了系统的性能。

3. 垃圾收集器:JVM一开始也会解释字节码,但它会监视程序的活动,收集和删除未引用的对象,来释放内存空间。

Java本地方法接口(JNI):JNI(Java Native Interface)提供一个标准的方式让Java程序通过虚拟机与原生代码进行交互,它使得在 JVM 内部运行的Java 代码能够与用其它编程语言(如 C、C++ 和汇编语言)编写的应用程序和库进行互操作。JNI最重要的好处是它没有对底层 Java 虚拟机的实现施加任何限制。

本地方法库:它是执行引擎所需的本地库集合。

本文对jvm体系做一个简单的介绍,如有不同意见,欢迎指正留言。望不吝赐教!!!有兴趣的小伙伴可以持续关注呦。后续有详细的介绍。。。

发布了91 篇原创文章 · 获赞 1 · 访问量 3185

猜你喜欢

转载自blog.csdn.net/duan196_118/article/details/104214447