JVM基础原理
jvm基础
jvm是什么?
jvm是运行在操作系统上的执行.class文件的虚拟机
jvm与操作系统的关系?
相同点都是可以执行对应的程序
不同点是jvm是可执行class文件与操作系统中间的一层(ps:某人说过计算机世界中的问题如果一个中间层不能解决就再加一个☺️)
jvm、jdk、jre之间的关系?
- jdk>jre>jvm>操作系统
java虚拟机规范与Java语言规范之间的关系?
java虚拟机规范是定义执行.class文件的虚拟机的规范;
java语言规范是定义java文件的规范
jvm中的内存划分
java比c等系列的语言引以为豪的就是引入来自动内存管理机制,不让使用者在关心内存的管理。
- 内存划分
- 堆区
- 栈区(本地方法栈、java虚拟机栈)
- 程序计数器
- 本地内存(元空间、直接内存)
堆区
堆是一个由线程之间共享的内存区域。基本类型的对象会中栈上进行分配,而普通类型的对象会栈堆上进行分配。由于栈是线程独立的,因此就不存在并发问题
栈区
- 虚拟机栈
Java虚拟机栈是基于线程级别的,每个线程都拥有独立都虚拟机栈。虚拟机栈的作用是存储栈帧,栈帧的作用是是保存每个线程当前运行方法的状态或值。
栈值中分为:
- 局部变量表(用于存放方法参数和方法内定义的局部变量)
- 操作数栈(存放方法运行期间的操作数或结果)
- 动态连接(方法调用过程中的动态连接)
- 方法返回地址
程序计数器
程序计数器是用来标记当前线程正在执行的程序运行到哪了一行。
元数据空间
元数据空间是JDK8中划分出来的,用于替代JDK7已经之前的Perm区(永久代)。
元数据空间存储class信息、常量池、方法数据、方法代码等等
总结
jvm中运行的参数是在栈上的信息,栈上保存的引用指向的是堆中的对象,类信息、常量等信息则是放在元数据空间中。
类的加载机制
流程
加载 > 验证 > 准备 > 解析 > 初始化
类加载器
- Bootstrap ClassLoader
最底层的类加载器,用于加载java底层类的类加载器
- Extention ClassLoader
扩展类的类加载器,用于加载lib/ext下的文件
- App ClassLoader
应用加载器,用于加载classPath下的文件
- Custom ClassLoader
自定义的类加载器