

如何判断堆上的对象没有被引用?
1、引用计数法
引用计数法会为每个对象维护一个引用计数器,当对象被引用时加1,取消引用时减1。
缺点:
1.每次引用和取消引用都需要维护计数器,对系统性能会有一定的影响
2.存在循环引用问题,所谓循环引用就是当A引用B,B同时引用A时会出现对象无法回收的问题。
比如 引用计数法 在上图 回收2中 a1=null;b1=null;后 a1,b1不会被回收 因为a1,b1循环引用 计数器都为1
2、可达性分析法

将对象分为两类:GC-ROOT对象 普通对象
GC ROOT对象分为四类:
1、线程Thread对象
引用线程栈帧中的方法参数、局部变量等
2、系统类加载器加载的java.lang.Class对象
引用类中的静态变量
例如: sun.misc.Launcher 就是GC ROOT对象(系统类加载器加载的java.lang.Class对象) -> 应用程序类加载器 -> 某静态变量
3、监视器对象
用来保存同步锁synchronized关键字持有的对象
例如:synchronized(A.class) 则 监视器对象(GC ROOT) -> A.class对象 则A.class对象无法被回收
4、本地方法调用时使用的全局对象(由虚拟机控制调用 无需过多关注)
其他:
查看垃圾回收日志
-verbose:gc