一、java内存模型(JMM)
1.1堆 -Xms Xms:初始堆大小 -Xmx:最大堆大小
1.2栈(栈帧 局部变量表、操作数栈、方法出口、动态链接)栈帧 线程
1.3方法区 (运行时常量池) 常量、静态变量、类的类型信息 JDK1.7使用了永久代实现了方法区
JDK1.8使用了元空间来存放方法区,这个区域垃圾回收针对的是常量池的回收和类型的卸载
1.4寄存器 线程私有
1.5直接内存 元空间使用的与对不相关的本地内存
1.6元空间 1.8方法区存放的地方
二、gc root 对象
1.虚拟机栈引用的对象
2.方法区常量引用的对象
3.方法区静态属性引用的对象
4.JVM虚拟机引用的对象(基本数据类型引用的class对象、系统类加载器)
5.同步锁持有多的对象
三、类的加载过程
1.加载
1.1 通过类的全限定名来获取定义的类的二进制字节流
1.2 根据二进制字节流所代表的静态存储结构转化为方法区的运行时数据结构
1.3 在内存中生成一个class对象,作为方法区的这个类入口
2.验证 确保class文件的字节流符合jvm规范的约束要求
2.1.文件格式验证
2.2.元数据验证
2.3 字节码验证
2.4 符号引用验证
3.准备 正式将静态变量分配内存并设置初始值
public static int value = 123;
那变量准备阶段的初始值是0,123是在初始化阶段
4.解析
4.1类或者接口的解析
4.2方法的解析
4.3字段的解析
4.4接口方法的解析
5.初始化 执行类构造器clinit方法赋值,