引用计数
- 优点:实现简单
- 缺点:难以解决对象循环引用的问题
可达性分析
-
对象是否与 GCroot 可达来判断对象将来是否会被使用
基于图论观点:如果图的连通分量大于 GC root数量,那么就存在不可达的对象,不可达对象是Java编码用户 不可见,jvm运行时不可见的对象
Java中的GC root:
-
虚拟机栈(栈帧中的本地变量表)中的对象:方法堆栈用的参数,局部变量,临时变量等
-
方法区中的 类静态属性引用的变量 static
-
方法区中的 常量引用的对象:字符串常量池(String table)的引用
-
Java虚拟机内部的引用:数据类型对应的class对象,常驻的异常对象,系统加载器等
-
所有被同步锁(synchronized关键字)持有的对象
-
反应Java虚拟机内部情况的 JMXBean,JVMTI中注册的回调,本地代码缓存等
-
不同内存区域,GC root标准不同导致的一些 临时性 加入的的对象等