目录
1.基础知识
1.栈
2.本地方法栈
3.程序计数器
4.堆
5.方法区
6.JVM内存可见性
2.虚拟机类加载机制
1.加载
2.验证
3.准备
4.解析
5.初始化
6.使用
7.卸载
1.基础知识
JVM内存模型(5种):栈,本地方法栈,程序计数器,堆,方法区。
1.栈
又称方法栈,线程私有的,线程执行方法是都会创建一个栈阵,用来存储局部变量表,操作栈,动态链接,方法出口等信息
调用方法时执行入栈,方法返回时执行出栈。
2.本地方法栈
与栈类似,也是用来保存执行方法的信息.
执行Java方法是使用栈,执行Native方法时使用本地方法栈
3.程序计数器
保存着当前线程执行的字节码位置,每个线程工作时都有独立的计数器,只为执行Java方法服务,执行
Native方法时,程序计数器为空
4.堆
JVM内存管理最大的一块,被线程共享,目的是存放对象的实例,几乎所有的对象实例都会放在这里,
当堆没有可用空间时,会抛出OOM异常(内存溢出,Out Of Memory,简称OOM)。
根据对象的存活周期不同,JVM把对象进行分代管理,由垃圾回收器进行垃圾的回收管理
5.方法区
又称非堆区,用于存储已被虚拟机加载的类信息,常量,静态变量,即时编译器优化后的代码等数据。
6.JVM内存可见性
JMM(Java内存模型Java Memory Model)本身是一种抽象的概念并不真实存在,它仅仅描述的是一组约定或规范,通过这组规范定义了程序中(尤其是多线程)各个变量的读写访问方式并决定一个线程对共享变量的写入以及如何变成对另一个线程可见,关键技术点都是围绕多线程的原子性、可见性和有序性展开的。
JMM定义程序中变量的访问规则,线程对于变量的操作只能在自己的工作内存中进行,而不能直接对主内存进行操作。
2.虚拟机类加载机制
从类被加载到虚拟机内存中开始,到释放内存总共有7个步骤:加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)、 卸载(Unloading)。其中验证,准备,解析三个部分统称为连接。
1.加载
通过类的完全限定名,查找此类字节码文件,利用字节码文件创建Class对象
- 通过一个类的全限定名来获取定义此类的二进制字节流
- 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构
- 在Java堆中生成一个代表这个类的java.lang.Class对象,作为方法区这些数据的访问入口
2.验证
确保Class文件的字节流中包含的信息符合当前虚拟机的要求,并且不会危害虚拟机自身安全
- 文件格式验证
- 元数据验证
- 字节码验证
- 符号引用验证
3.准备
进行内存分配,为static修饰的类变量分配内存,并设置初始值(0或null).不包含final修饰的静态变量,因为final变量在编译时分配.
4.解析
将常量池中的符号引用替换为直接引用的过程.
符号引用(Symbolic References): 符号引用以一组符号来描述所引用的目标,符号可以使任何形式的字面量,只要使用时能无歧义地定位到目标即可。符号引用于虚拟机实现的内存布局无关,引用的目标不一定已经加载到内存中。
直接引用(Direct References):直接引用可以是直接指向目标的指针,相对偏移量或是一个能简介定位到目标的句柄,直接引用是与虚拟机实现的内存布局相关的,统一符号引用在不同虚拟机实例上翻译出来的直接引用一般不会相同,如果有了直接引用,那引用的目标必定已经在内存中存在。
5.初始化
主要完成静态块执行以及静态变量的赋值.先初始化父类,再初始化当前类.只有对类主动使用时才会初始化
6.使用
7.卸载
总结:这几天额要写JVM专栏啦!