
1、判断对象是否可回收
① 引用计数算法(Reference Counting):给对象添加一个引用计数器,每当有地方引用它
时,计数器加1,引用失效时减1,当计数器为0时该对象就是不可再被使用的。优点是实现简
单,判定效率高,缺点是很难解决循环引用的问题。
② 可达性分析算法(Reachability Analysis)是通过一系列称为“GC Roots”的对象作为起始
点向下搜索,搜索走过的路径称为引用链(Reference Chain),当对象到GC Roots没有任
何引用链相连时就证明对象不可用了。在Java语言中可作为GC Roots的对象包括:
● 虚拟机栈(栈帧中的本地变量表)中引用的对象
● 方法区中类静态属性引用的对象
● 方法区中常量引用的对象
● 本地方法栈中JNI(Native方法)引用的对象
2、引用
如果reference类型的数据中存储的数值代表的是另一块内存的起始地址,就称为这块内存代表着一
个引用。在JDK1.2后,引用的概念扩充为4种,由强到弱分别为:
① 强引用:类似“Object obj = new Object()”这样的引用,永远不会被回收的引用。
② 软引用(SoftReference):在系统将要内存溢出之前,会讲软引用对象进行二次回收,如
果仍然没有足够的内存则抛出异常。
③ 弱引用(WeakReference):无论内存是否够用,在下一次垃圾收集时弱引用都将被回收。
④ 虚引用(PhantomReference):虚引用无法获得一个对象的实例,使用它的目的是在垃圾
回收时收到一个系统通知。
3、回收
如果对象在可达性分析中没有发现与GC Roots相连接的引用链,那么它会被第一次标记并进行一次
筛选,筛选的条件是它是否有必要执行finalize()方法:如果对象没有复写finalize()方法或者该
对象的finalize()方法已经被虚拟机执行过,则筛选失败。
如果筛选成功,那么该对象会被放置在F-Queue队列中,稍后虚拟机会自动建立一个低优先级的
Finalizer线程去触发该对象的finalize()方法,但不承诺会等待它运行结束,避免阻塞队列。然后虚
拟机会对F-Queue中的对象进行第二次标记,如果在第一次标记中finalize()方法将对象与任意一
个GC Roots连接上,那么它这次将被移除回收队列,保持存活,反之则被回收掉。
4、回收方法区
Java虚拟机规范中不强制要求虚拟机在方法区实现垃圾收集。回收主要分两部分:废弃常量和无用的

类。
① 废弃常量:当没有任何一个String叫做“abc”时,“abc”将被清理出常量池。常量池中的其
他类(接口)、方法、字段的符号引用也是同理。
② 无用的类:满足一下三点虚拟机会判定类为无用:
● 该类所有的实例都被回收。
● 加载该类的ClassLoader已经被回收。
● 该类对应的java.lang.Class对象没有在任何地方被引用,无法在任何地方通过反射访
问该类的方法。java queue 使用
满足三点也不代表着一定会回收该类,是否进行回收HotSpot提供了-Xnoclassgc参数进行控制,还
可以使用-verbose:class以及-XX:+TraceClassLoading、-XX:+TraceClassUnLoading查看类
加载和卸载的信息。
在大量使用反射、动态代理、CGLib等ByteCode框架、动态生成JSP以及OSGi这类频繁自定义
ClassLoader的场景中都需要虚拟机具备类卸载的功能,保证永久代不会溢出。
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-82147-1.html
请问还能经济发展吗
最多就抗议一下
MV拍得很美~歌好听~