第二章 结结构
- 常量池是在方法区中用来放基本类型常量的(public static final)JDK 7以下也放字符串,JDK 7以上字符串放到了堆中
- JDK 8 之后方法区被放在本地的元空间取代
对象结构
- 在给新对象分配内存时,堆内内存由使用的GC收集器来决定使用指针碰撞还是空闲列表来分配内存
- HotSpot中,对象在堆中由三个部分组成:对象头,实例数据,对齐填充
- 对象头分为:Mark Word(包括哈 希码(HashCode)、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等)和 类型指针(即对象指向它的类型元数据的指针)
对象引用
有 句柄访问 和 指针访问 两种引用对象的方法
句柄访问: 优点:使用句柄来访问的最大好处就是reference中存储的是稳定句柄地 址,在对象被移动(垃圾收集时移动对象是非常普遍的行为)时只会改变句柄中的实例数据指针,而 reference本身不需要被修改。
缺点:比较慢
指针访问: 优点:比较快
缺点: 要修改本身reference
第三章 GC
- 任何一个对象的finalize方法只会被调用一次
判断对象是否存活
引用计数法:方便但是无法解决互相引用问题
可达分析算法
固定可作为GC Roots的对象
方法区GC
方法区GC收集废弃的常量和不再使用的类型信息
收集废弃常量: 一个字符串”java”进入过常量池但是没有任何对象引用这个值,则判断为废弃
收集废弃类型: 需要该类型满足三个条件:1. 所有实例都已经被回收 2. 对应的类加载器已被回收 3. 对应的java.lang.class对象没有在任何地方被使用,无法通过反射访问该类的方法