jvm内存区域

  • jdk1.8之前:jvm分为堆,栈(本地方法栈,虚拟机栈),方法区(包含常量池),程序计数器。
  • jdk1.8以后:jvm分为堆,栈(本地方法栈,虚拟机栈),程序计数器,方法区被原空间替代。
  • 堆,方法区是线程公有的,栈,程序计数器是线程私有的
  • 程序计数器:指示当前线程所执行的字节码的行号指示器。
  • 方法区:存储已被虚拟机加载的类信息,常量,静态变量。运行时常量池
  • 栈:本地方法栈为虚拟机使用本地方法服务。java虚拟机栈为java方法服务。栈中有局部变量表(存储着基本类型和其他对象引用类型的基本信息),常量池引用。
  • 堆:存储实例化的对象,几乎所有的对象和数组都在这分配内存。
  • 堆中的新生代老年代

    类创建过程

  1. 类加载检查:检查能否在常量池中定位到这个类的符号引用
  2. 分配内存
  3. 零值填充
  4. 设置对象头
  5. 执行init方法

一说:加载,验证,准备,解析,初始化

垃圾回收策略

  1. 引用计数法
  2. 可达性分析法

    垃圾回收方法

  3. 标记-清除算法

  4. 标记-整理算法
  5. 标记-复制算法
  6. 分代收集

    1. 新生代,老年代

      类加载器

  7. 启动类加载器

  8. 扩展类加载器
  9. 引用程序类加载器

双亲委派模型:加载时先交给父加载器加载,加载失败后再由子加载器加载,这样做可以保证java类和加载器一样有一种优先级的层次关系,从而让基础类得到统一。