Java的引用类型(附图说明)
本章的主要內容來自:javaconceptoftheday 一小部分是自己整理的,英文OK的可以直接讀原文
Java的一個優點是程序員不需要關心內存是如何被分配的,Java有一套自己的機制去管理它,程序員不需要考慮當對象不用時要釋放該內存。垃圾回收器會有一套自己的算法去負責何時清理垃圾,我們無法控制垃圾回收器怎樣回收垃圾,但我們能夠通過靈活地使用Java的引用類型在一定程度上控制內存的分配。
Java引用類型分為
強引用
這種引用類型我們幾乎每天都能看到(如果你在coding時),任何對象只要它是強引用,垃圾回收器就不會回收它,即使內存空間不足導致JVM拋出OutOfMemoryError錯誤以致程序異常退出。所以當你所創建的對象不再使用時最好給它置null(特別是嵌入式編程)例如,下述代碼中的變量a就是強引用
class A{//class A } public class mainClass{public static void main(String[] args){//強引用A a = new A(); //告訴垃圾回收器a對象可以被回收了a = null; } }看下面的圖你會對對象在內存中如何被分配有更清晰的了解
軟引用
軟引用的對象一般不會被垃圾回收器回收,除非JVM非常需要內存。如果內存吃緊,軟引用對象將會從內存中清除掉。下述代碼向你展示如何創建一個軟引用的對象
class A{//A class }class class MainClass{public static void main(String[] args){//強引用A a = new A(); //創建一個軟引用對象,該對象指向變量a所指的對象SoftReference<A> softA = new SoftReferences<A>(a);//現在a變量置null了,但a對象不會被釋放除非JVM非常需要內存a = null; //你可以通過Reference.get()方法獲取a對象a = softA.get(); } }下面的圖會加深你對軟引用的理解
注意:如果內存吃緊,軟引用所指向的對象很可能被垃圾回收器回收,此時Reference.get()返回為null
弱引用
JVM會忽視弱引用,換句話說就是僅僅持有弱引用的對象是會被垃圾回收器回收的,下述代碼向你展示了如何創建一個弱引用對象
class A{//A class }public class MainClass{public static void main(String[] args){//強引用A a = new A(); //創建一個弱引用,該引用持有a對象的引用WeakReference<A> weakA = new WeakReference<A>(a);//a變量置nulla = null;//你可以通過Reference.get()方法來恢復aa = weakA.get();} }看下述圖,你會對其有更深的理解
虛引用
被虛引用引用的對象垃圾回收器是能夠回收對,但是,在回收對象前JVM會把它們放到一個叫 ‘reference queue’ 的隊列。它們在調用finalize()方法后回進入reference queue,你不能通過虛引用來恢復對象,也就是說Reference.get()返回的總是null,下述代碼向你展示了如何創建虛引用
class A{//A class }public class MainClass{public static void main(String[] args){//強引用A a = new A(); //創建一個引用隊列ReferenceQueue<A> refQueue = new ReferenceQueue<A>();//創建一個虛引用,并指向a所指向的地方PhantomReference<A> phantomA = new PhantomReference<A>(a, refQueue);//現在a對象能被垃圾回收器回收,但是a對象在回收前會一直保持在refQueue隊列中a = null; //總是返回nulla = phantomA.get(); }} }總結
以上是生活随笔為你收集整理的Java的引用类型(附图说明)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: AndroidStudio常用快捷键及其
- 下一篇: Android 优化电池使用时间 ——监