jvm 主要组成部分以及其作用
jvm 组成部分(包含两个子系统和两个组件)
两个子系统
- Class Loader (类装载器):根据给定的全限定名类名(如java.lang.Object)来装载class 文件到Runtime data area(运行时数据区) 中的method area(方法区)
- Execution engin(命令解析器执行引擎) :执行class 中的指令
两个组件
- Native Interface (本地接口) : 与native libraries 交互,是其他编程语言交互的接口
- Runtime data area (运行时数据区域):这就是我们常说的jvm 内存
jvm 作用
首先通过编译器把java 代码转换成字节码,类加载器(Class Loader) 在把字节码加载到内存中,将其放在运行时数据区(runtime date area)的方法区内,而字节码文件只是jvm 的一套指令规范,并不能直接交给底层操作系统执行,因此需要特定的命令解析器执行引擎(Execution engin),将字节码翻译成底层系统执行指令,再交又CPU 去执行,而这个过程中需要调用其他语言的本地库接口(native interface)来实现整个程序的功能。
jvm 运行时数据区
定义:java虚拟机在执行过程中会把所管理的内存区域划分为若干个不同的数据区域。
这些区域都有各自的用途,以及创建和销毁时间,有些区域随着虚拟机进程的启动而存在,有些区域则是依赖线程的启动和结束而建立和销毁。java 虚拟机所管理的内存被划分为如下几个区域
不同虚拟机的运行时数据去可能略微有所不同,但都会遵从java 虚拟机规范,Java 虚拟机规范规定的区域分为以下5个部分:
- 程序计数器(Program Counter Register): 当前线程所执行的字节码的行号指示器,字节码解析器的工作是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能,都需要依赖这个计数器来完成;
- Java 虚拟机栈(JVM Stacks): 用于存储局部变量的表、操作数栈、动态链接、方法出口等信息;
- 本地方法栈(Native Method Stack):与虚拟机栈的作用是一样的,只不过虚拟机栈是服务Java 方法,而本地方法是为虚拟机调用Native 方法服务的
- Java 堆(Java Heap): Java 虚拟机中内存最大的一块,是被所有线程共享的,几乎所有的对象实例都在这里分配内存
- 方法区(Methed Area): 用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译的代码等数据。