JVM

运行时数据区域

线程共享区域

新生代

  1. 区域
    1. Edan区(伊甸园)
      1. 新生的对象无忧无虑的生活着,知道人满了迎来了世界末日(Minor GC [轻微的GC] )
    2. S0 (幸存区)
    3. S1 (幸存区)
  2. 操作

老年代

就是长期存在的对象存放的地方

对象在内存(堆)中的存储布局

  1. 对象头 (Header)
    1.标记字段
    2.类型指针
  2. 实例数据 (Instance data)
  3. 对齐填充 (Padding)

线程私有区域

程序计数器

  • 用来记录程序记录未知,以及下一步要执行的位置,和计算机组成中的程序计数器作用一致

栈(虚拟机栈)

主要服务Java虚拟机的方法
主要研究stack farme的主要结构

  1. 局部变量表
  2. 操作数栈
  3. 动态链接区
    1. 静态方法/私有方法
    2. 虚方法/多态方法
  4. 方法返回地址

本地方法栈

主要服务 native 方法
结构大概和虚拟机栈一致

对象分配过程

  1. 类加载检查
  2. 分配内存
    • 分配内存方法
      1. 指针碰撞
      2. 空闲列表
    • 创建对象分配内存线程安全解决问题
      1. CAS方法 :乐观锁,比较然后替换
      2. TLAB方法 :每个线程都有自己的buffer在eden区,然后进行指针碰撞
  3. 初始化0值
  4. 设置对象头
  5. 执行<init>方法
    • 包含的东西
      1. 属性的赋值
      2. 静态代码块
      3. 构造方法

问题

  1. s1什么时候被移入对象
  2. 为什么s1上次GC后还有对象
    1. 两个Survivor区域会互换角色(fromto 区域)
  3. 该类对应的 java.lang.Class对象没有被任何地方引用(无法通过反射访问该类)。这时什么意思举个例子
  4. 动态年龄判定:如果在Survivor空间中,相同年龄的所有对象大小的总和大于Survivor空间的一半,那么年龄大于或等于该年龄的对象就可以直接进入老年代,而无需等到MaxTenuringThreshold。

原文: https://www.yuque.com/duifangzhengzaishuru-rqbua/axyc58/zs8emr29fvl5aq21