方法区(常量池...) 永久代 Class对象在方法区
堆---新生代(eden ,from survivor,to survivor),老年代(old)
虚拟机栈
程序计数器 线程独占
本地方法栈
对象的创建:内存分配:1.指针碰撞,顺序整块分配。2.空闲列表,找到足够大小的空间分配。
对象头【自身运行时数据(mark word 、hashcode、gc年龄、锁标志。。。),类型指针(对象指向其类元数据,可确 定类的大小,数组不行,不一定所有对象都有查找元数据信息不一定要根据对象本身即通过句柄)】
对象 实例数据
对齐填充
对象索引:1.句柄(不需要修改reference)。2.直接指针(速度快,节省一次指针开销)
GC:1.引用计数器法
2.可达性分析算法(GC Roots)
虚拟机栈中引用的对象、方法区中静态属性引用的对象、方法区中常量引用的对象、本地方法栈中引用的对象JNI。
引用:强(不会被回收)、软(有用但非必须,在内存溢出之前会进行二次回收)、弱(非必须,能生存到下次gc之前)、 、、、虚 (回收前给个提示)。
一个对象被回收至少经历两次标记,第一次可达性分析后进行筛选,筛选的条件是是否有必要执行finalize()方法,没有重写该方法或者已经被调用一次视为没必要执行。
判定一个类是否可回收:1.所以实例被回收2.加载该类的ClassLoader被回收3.该类的Class对象没有在任何地方引用
垃圾回收算法:
1.标记-清除(效率不高,产生大量内存碎片,遇到大对象容易导致GC)
2.复制算法(内存分为两块,存活对象之间复制到另外一半,然后清理,内存开销浪费,运行高效,新生代算法8:1:1)
3.标记-整理(存活率高的情况下,效率低下。老年代算法) !!分配担保机制,新生代空间不足直接进入老年代
安全点:gc发生在该时间点,hotspot 通过OopMap枚举根节点
gc发生时,所有线程停顿,1.抢先式中断(先中断,不在安全点再恢复运行) 2.主动式中断(设置一个标记,轮询,为真就挂起)
线程处于sleep或者blocked状态不会响应中断,这个时候需要用到 安全区域