1.判断是否是存活对象?
1.1 引用计数算法
注意:引用计数算法存在的问题:对象循环引用
1.2 可达性分析算法
1.3.Java 中的四种引用类型
1.3.1.强引用(Strong Reference)
强引用 :
Object strongReference =new Object();
如果强引用对象不使用时,需要弱化从而使GC能够回收。
强引用弱化方式1:
strongReference =null;
public void clear(){
modCount++;
// clear to let Gc do its work
for(inti=0;i<size; i++)
elementDatali]=null
size = 0;
}
强引用弱化方式2:
public void test(){
Object strongReference =new object();
//省略其他操作
}
1.3.2.软引用(Soft Reference)
创建软引用,可以使用Soft Reference
//定义和访问软引用
//强引用
String strongReference = new String("abc");
// 软引用
String str = new String("abc");
SoftReference<String>softReference = new SoftReference<String>(str);
// 访问软引用
softReference.get();
//回收软引用
//软引用
String str = new String("abc");
SoftReference<string>softReference = new SoftReference<>(str);
str = null;
// NotifyGC
System.gc();
try {
byte[]buff1 = new byte[900000000];// 内存充沛
// byte[]buff2 = new byte[900000000];// 内存不足
catch(Error e){
e.printstackTrace();
}
System.out.println(softReference.get());//abc 或null
1.3.3.弱引用(Weak Reference)
创建弱引用,使用 WeakReference
String str = new String("abc");
SoftReference<string>softReference = new SoftReference<>(str);
str = null;
// NotifyGC
System.gc();
// 一旦发生GC,弱引用一定会被回收
System.out.println(weakReference.get());
1.3.4.虚引用(Phantom Reference)
1.3.5.小结
2.垃圾收集算法
2.1.分代收集理论
目前主流 JvM 虚拟机中的垃圾收集器都遵循分代收集理论:
- 弱分代:绝大多数对象都是朝生夕灭
- 强分代:经历越多次垃圾收集过程的对象,越难以回收,难以消亡
按照分代收集理论设计的“分代垃圾收集器”,所采用的设计原则:
收集器应该将 Java 堆划分成不同的区域,然后将回收对象依据其年龄(年龄即对象经历过垃圾收集过程的次数)分配到不同的区域存储。
2.1.1.分代存储
2.1.2.分代收集
2.2.垃圾收集算法
2.2.1.标记-清除算法(Mark-Sweep)
2.2.2.标记-复制算法(Copying )
2.2.3.标记-整理算法(Mark-Compact )
2.3.综上所述
3.垃圾收集器
3.1.Serial 收集器(新生代)
3.2.Serial Old 收集器(老年代)
3.3.ParNew 收集器(新生代)
3.4.Parallel Scavenge 收集器(新生代)
3.5.Parallel Old 收集器(老年代)
3.6.CMS 收集器(老年代)
3.7.G1收集器(老年代)