Java的四种引用
近日打算将之前学习过程中一些关键的点整理写成博客,算是一次复习吧。如有不当之处还望指正,感激不尽。
温故知新(一)
Java的四种引用
强引用
只要引用存在,垃圾回收器永远不会回收。当内存空间不足时,Java虚拟机宁愿抛出OutOfMemoryError,使程序异常终止,也不会回收具有强引用的对象来解决内存不足的问题。
Object object = new Object(); //强引用
object = null; //帮助GC回收此对象
在一个方法内部有一个强引用,这个引用保存在栈中,而真正的引用内容保存在堆中(也就是说,这个栈中的地址指向堆的存储区域)。当这个方法运行完成后就会退出方法栈,则引用内容的引用不存在(强引用定义在方法内部),这个Object会被回收。
生存时间:JVM停止运行时终止
软引用
如果一个对象只具有软引用,需要根据内存空间分情况讨论。若内存空间足够,GC就不会回收它;若内存空间不足,就会回收这些对象的内存。
用途:可用来实现内存敏感的高速缓存。
String str = new String("Siyecho"); //强引用
SoftReference<String> softRef = new SoftReference<String>(str); //软引用
应用场景:浏览器的后退按钮。将浏览完的页面置位软引用,点击后退按钮时,若对象没有被GC回收,就直接获取;否则,将该页面重建。
生存时间:内存不足时终止
弱引用
弱引用与软引用的区别在于只具有弱引用的对象拥有更短的生命周期。在GC线程扫描它所管辖区域的过程中,一旦发现只具有弱引用的对象,不管当前内存空间足够与否,都会回收内存。但由于GC的优先级很低,不一定会很快发现弱引用对象。
String str = new String("Siyecho"); //强引用
WeakReference<String> weakRef = new WeakReference<String>(str); //弱引用
生存时间:GC运行时终止
虚引用
虚引用并不会决定对象的生命周期。若对象仅有虚引用,则和没有引用一样。虚引用主要用来跟踪对象被GC回收的活动。虚引用必须和引用队列联合使用。当GC准备回收一个对象时,若发现它还有虚引用,就会在回收内存之前,把这个虚引用加入到与之关联的引用队列中。
(对于与引用队列联合使用,软引用和弱引用是可选的,而非必须)
生存时间:unknown