跨代引用

跨代引用

跨代应用:也就是一个代中的对象引用另一个代中的对象。

跨代引用假说:跨代引用相对于同代应用来说只是极少数

隐含推论:存在互相引用关系的两个对象,是应该倾向于同时生存或同时消亡的。

记忆集:一种用于记录从非收集区域指向收集区域的指针集合的抽象数据结构

字长精度:每个记录精确到一个机器字长,该字包含跨代指针

对象精度:每个记录精确到一个对象,该对象里有字段含有跨代指针

卡精度:每个记录精确到一块内存区域,该区域内有对象含有跨代指针

(最常用的是:卡精度=卡表)

卡表(Card Table):是记忆集的一种具体实现,定义了记忆集的记录精度和与堆内存的映射关系等

卡表的每个元素都对应着其标识的内存区域中一块特定大小的内存块,这个内存块称为卡页(Card Page)

在HotSpot中通过写屏障来维护卡表里面的状态

写屏障可以看成是JVM对“应用类型字段赋值”这个动作的AOP

通过写屏障来实现当对象状态改变后,维护卡表状态

判断是否垃圾的步骤:

  1. 根据搜索算法判断不可用

  2. 看是否有必要执行 finalize()方法

  3. 两个步骤走完后对象仍然没有人使用,那就属于垃圾

可以在finalize()方法里实现对象自救

MinorGC/YoungGC:发生在新生代的收集动作

MajorGC/OldGC:发生在老年代的GC,目前只有CMS收集器会有单独收集老年代的行为

MixedGC:收集整个新生代以及部分老年代,目前只有G1收集器会有这种行为

FullGC:收集整个Java堆和方法区的GC

Stop-the-World:是java中一种全局暂停现象,多半由于GC引起。所谓全局停顿,就是所有Java代码停止运行,native代码可以执行,但不能和JVM交互。

其危害是长时间服务停止,没有响应;对HA系统,可能引起主备切换,严重危害生产环境。

垃圾收集类型:

  1. 串行收集:GC单线程内存回收、会暂停所有的用户线程,如:Serial
  2. 并行收集:多个GC线程并发工作,此时用户线程是暂停的,如:Parallel
  3. 并发收集:用户线程和GC线程同时执行(不一定是并行,可能是交替执行),不需要停顿用户线程,如:CMS

判断类无用的条件:

  1. JVM中该类的所有实例都已经被回收
  2. 加载该类的ClassLoader已经被回收
  3. 没有任何地方应用该类的Class对象
  4. 无法在任何地方通过反射访问这个类

知识点:

  1. 理解什么是垃圾、如何判定是垃圾
  2. 理解根搜索算法、引用分类、GC类型、垃圾收集类型
---- The end of this article ----