垃圾回收的前提是判断对象是否存活,对象不再存活时将会被回收,下面是2种判断的方法。
引用计数法:
主流的Java虚拟机并没有使用引用计数法来管理内存,重要的原因就是循环引用的问题难以解决。
可达性分析法:
这个算法的基本思路是:通过一系列称为“GC Roots”的对象作为起始点,向下搜索,走过的路径称为引用链,当对象到GC Roots没有任何的引用链时,则认为对象是可以被回收的。
Java中,可以作为GC Roots的对象包括:
1》虚拟机栈中引用的对象
2》方法区中静态属性引用的对象
3》方法区中常量引用的对象
4》JNI引用的对象
JDK1.2之后对象的引用可以分为强引用,软引用,弱引用,虚引用4种,引用的强度依次地减弱。
强引用,通过new对象来实现的引用。
软引用,内存充足时不进行回收,内存不足时会被回收。
弱引用,不管内存是否充足都会被回收。
虚引用,无法通过虚引用来获取一个对象实例,为一个对象设置虚引用的唯一目的就是能在这个对象被回收时收到一个系统通知。
方法区中的回收主要包含2部分:废弃的常量和无用的类。
例如常量池中有一个名为“abc”的字符串常量,但是没有被系统中的任何字符串所引用,则将对其进行回收。
类需要同时满足下面3个条件才能被定义为无用的类:
1》该类所有的实例都已经被回收
2》加载该类的ClassLoader已经被回收
3》该类的Class对象在任何地方没有被引用,无法在任何地方通过反射访问该类
垃圾回收算法
标记清除法
该算法存在2个问题:
一是效率不高,标记和清除2个过程的效率都不是很高
二是产生大量碎片的问题,再给大对象分配内存时可能会因为无法找到足够大的连续的内存,又进行一次垃圾回收。
复制算法