JVM复习
首先自己画一个JVM内存模型的图
类加载子系统
- 类加载子系统负责加载class文件
- 只负责加载 能否运行由执行引擎决定
- 加载好的类信息被放在了方法区中。
加载-》验证-》准备-》解析-》初始化
- 加载:通过这个类的全限定名获取这个类的二进制字节流
- 验证:比如验证cafebabe 就是对象头的这个内容
- 准备:为类变量分配内存并且设置该变量的初始值
- 解析:将常量池的符号引用转换为直接饮用的过程
- 初始化:执行这个类的构造器方法的过程
双亲委派机制
首先是由应用程序类加载器(系统类加载器)进行委托,委托至拓展类加载器,再向上委托至启动类加载器具。
如果其中有人加载过了,则直接调用,如果没有继续询问。然后一层一层再问询下来,直到能加载这个类的的加载器进行加载。
如果希望打破双亲委派机制,需要重写loadClass这一方法。让他不进行findclass这一方法,直接加载。
双亲委派的优势在于,不会重复加载,节省资源。以及保证安全性,防止一些系统级的类被篡改。
堆
用来存放变量,那些动态的。比如new出来的。
栈
栈中存放的是基本数据类型,以及对于堆中对象的引用。
局部变量表
操作数栈
动态链接
方法出口
本地方法栈
一些native方法被调用时用到的。
方法区
用来保存。加载后的类信息(完整名字),域信息,方法信息,常量池,静态变量,指向类加载器的引用,方法表。
程序计数器
多线程切换时用于记录目前这个线程中运行到了哪一步。