JVM整体架构
JVM - Java Virtual Machine 是Java程序运行在物理机上的载体,不同系统具有不同的虚拟机实现。JVM是不跨平台的,但是它是Java程序跨平台的基础。JVM具有三个主要部分:
- 类加载子系统 Class Loader
- 运行时数据区 Runtime Data Area
- 执行引擎 Execution Engine
类加载机制
- 类加载:类加载器将class文件加载到虚拟机的内存(加载->链接->校验->准备->解析->初始化)。Java的Class文件是动态加载的,按需加载。
- 类加载器:
- 引导类加载器:BootstrapClassLoader,负责加载<JAVA_HOME>/lib目录中的类
- 扩展类加载器:ExtensionClassLoader,负责加载<JAVA_HOME>/lib/ext目录中的类
- 系统类加载器:ApplicationClassLoader,负责加载classpath目录中的类
- 自定义加载器:CustomClassLoader
- 类加载机制:
- 全盘负责加载机制
- 双亲委派加载机制:优先由父类加载器加载。具有沙箱安全机制以及避免类重复加载的优势。
运行时数据区
运行时数据区就是Java程序的内存区域。它包含五个部分:
- 程序计数器:独占,记录即将执行的代码位置,存放下一行代码的指针。
- 本地方法栈:独占,等级native方法,在执行引擎执行时加载本地方法库。
- JVM方法栈:独占,每个线程对应一个JVM方法栈,线程中执行的每一个方法对应栈中的一个栈帧。执行时入栈,执行完出栈(后入先出)。栈帧内又分为几个部分:
- 局部变量表:存放局部变量及对应的值。
- 操作数栈:在局部变量运算的过程中临时储存变量数据的栈。
- 动态链接:指向运行时常量池中该栈帧所属方法的符号引用。
- 方法出口:方法后续执行的代码地址。
- 方法区:共享,所有定义的方法的信息都存在方法区,包括静态变量、常量、类信息、运行时常量池。
- 堆:共享,所有对象实例数据保存的内存空间,也是垃圾收集器管理的主要区域。