jvm内存区域
- jdk1.8之前:jvm分为堆,栈(本地方法栈,虚拟机栈),方法区(包含常量池),程序计数器。
- jdk1.8以后:jvm分为堆,栈(本地方法栈,虚拟机栈),程序计数器,方法区被原空间替代。
- 堆,方法区是线程公有的,栈,程序计数器是线程私有的
- 程序计数器:指示当前线程所执行的字节码的行号指示器。
- 方法区:存储已被虚拟机加载的类信息,常量,静态变量。运行时常量池
- 栈:本地方法栈为虚拟机使用本地方法服务。java虚拟机栈为java方法服务。栈中有局部变量表(存储着基本类型和其他对象引用类型的基本信息),常量池引用。
- 堆:存储实例化的对象,几乎所有的对象和数组都在这分配内存。
- 堆中的新生代老年代
类创建过程
- 类加载检查:检查能否在常量池中定位到这个类的符号引用
- 分配内存
- 零值填充
- 设置对象头
- 执行init方法
垃圾回收策略
双亲委派模型:加载时先交给父加载器加载,加载失败后再由子加载器加载,这样做可以保证java类和加载器一样有一种优先级的层次关系,从而让基础类得到统一。