1 垃圾收集
1.1 要点
- 垃圾回收不是一个独立的平台
- 任何一个进程都不能命令垃圾回收机制做什么,怎么做,做多少。因为垃圾回收机制是服务于所有的java应用程序的,而不是为某个特定的java进程服务的。因此,System.gc()方法是一个不确定的方法,每次调用时,只能保证它向jvm发出了一次gc请求,但不保证一定能够启动垃圾收集。
- p=null,只是表示p不指向任何对象
- 判断一块内存空间是否符合垃圾收集器收集标准的标准只有两条:1.给引入赋予了控制null,以后再没有调用 2.给对象赋予了新值,即重新分配了内存空间
1.2 对象在内存中的状态
- 可达状态:当一个对象被创建后,若与一个以上的引用变量引用它,则这个对象处于可达状态。
- 可恢复状态:当一个对象已经没有任何引用指向它且在调用==finalize()==方法之前,这个对象处于可恢复状态。
- 不可达状态:当一个对象与他的所有引用变量之间的关联已经被切断且系统已经调用了finalize方法之后任然没有变成可达状态,此时称对象为不可达状态,此时系统才会真正回收该对象对应的资源。
1.3 对象的软、弱、虚引用
- 强引用:创建一个对象,并把他赋给一个引用变量。
- 软引用:需要借助SoftReference来实现。只有系统内存空间不足时,垃圾回收机制才可能会回收软引用指向的对象的资源。
- 弱引用:需要借助WeakReference来实现。不管内存资源是否充足,垃圾回收机制都会回收软引用指向的对象的资源。
- 虚引用:需要借助PhantomReference来实现。虚引用完全类似于没有引用,它不能单独存在,必须和引用队列(ReferencQeue)配合使用来跟踪对象被垃圾回收的状态。
上面三个引用类提供了==get()==方法来获取被他们所引用的对象。例子:
public static void main(String[] args) {
String str=new String("我不是小白脸");
ReferenceQueue rq=new ReferenceQueue();
PhantomReference pr=new PhantomReference(str, rq);
str=null;
//虚引入的get()方法返回值始终为空。 Because the referent of aphantom reference is always inaccessible, this method always returns null.
System.out.println(pr.get());
System.out.println(pr);
System.gc();
System.runFinalization();
System.out.println(rq.poll()==pr);
}