GC
当一个对象object被创建时,它被放在Heap里。
当GC运行的时候,如果发现没有任何引用指向object,object就会被回收以腾出内存空间。
或者换句话说,一个对象被回收,必须满足两个条件:
1)没有任何引用指向它
2)GC被运行.
System.gc();
//告诉垃圾收集器打算进行垃圾收集,而垃圾收集器进不进行收集是不确定的
System.runFinalization();
//强制调用已经失去引用的对象的finalize方法
WeakReference
当一个对象仅仅被weak reference(弱引用)指向, 而没有任何其他strong reference(强引用)指向的时候, 如果GC运行, 那么这个对象就会被回收。weak reference的语法是:
WeakReference<T> weakref = new WeakReference<T>();
当要获得WeakReference的object时, 首先需要判断它是否已经被GC回收,若被收回,则下列返回值为空:
weakref.get();
所以在上述代码中,经过a=null; System.gc()后,
在WeakReference<String> b = new WeakReference<String>(a);中a为空已经被系统收回了,而b已经没有强引用指向了,所以b也被系统GC收回了。
所以当代码运行到c = b.get().replace("a", "b");时,由于b.get()为null,会抛出异常。
WeakHashMap
WeakHashMap其实和HashMap用法类似,它们之间唯一的区别就是:HashMap中的key保存的是实际对象的强引用,因此只要对象不被销毁,即该key所对应的key-value都不会被垃圾回收机制回收。但是WeakHashMap保存的实际对象是弱引用,这意味着只要该对象没有被强对象引用就有可能会被垃圾回收机制回收对应的Key-value。