1. 程式人生 > >Java Reference

Java Reference

在 jdk 1.2 及其以後,引入了強引用、軟引用、弱引用、虛引用這四個概念。網上很多關於這四個概念的解釋,但大多是概念性的泛泛而談,今天我結合著程式碼分析了一下,首先我們先來看定義與大概解釋(引用型別在包 java.lang.ref 裡)。

  1、強引用(StrongReference)

    強引用不會被GC回收,並且在java.lang.ref裡也沒有實際的對應型別。舉個例子來說:
    Object obj = new Object();
    這裡的obj引用便是一個強引用,不會被GC回收。

  2、軟引用(SoftReference)

    軟引用在JVM報告記憶體不足的時候才會被GC回收,否則不會回收,正是由於這種特性軟引用在caching和pooling中用處廣泛。軟引用的用法:

1 2 3 4 Object obj = new Object(); SoftReference<Object> softRef = new SoftReference(obj); // 使用 softRef.get() 獲取軟引用所引用的物件 Object objg = softRef.get();

  3、弱引用(WeakReference)

    當GC一但發現了弱引用物件,將會釋放WeakReference所引用的物件。弱引用使用方法與軟引用類似,但回收策略不同。

  4、虛引用(PhantomReference)

    當GC一但發現了虛引用物件,將會將PhantomReference物件插入ReferenceQueue佇列,而此時PhantomReference所指向的物件並沒有被GC回收,而是要等到ReferenceQueue被你真正的處理後才會被回收。虛引用的用法:

1 2 3 4 5 6 7 8 9 Object obj = new Object(); ReferenceQueue<Object> refQueue = 
new ReferenceQueue<Object>(); PhantomReference<Object> phanRef = new PhantomReference<Object>(obj, refQueue); // 呼叫phanRef.get()不管在什麼情況下會一直返回null Object objg = phanRef.get(); // 如果obj被置為null,當GC發現了虛引用,GC會將phanRef插入進我們之前建立時傳入的refQueue佇列 // 注意,此時phanRef所引用的obj物件,並沒有被GC回收,在我們顯式地呼叫refQueue.poll返回phanRef之後 // 當GC第二次發現虛引用,而此時JVM將phanRef插入到refQueue會插入失敗,此時GC才會對obj進行回收 Reference<? extends Object> phanRefP = refQueue.poll();

看了簡單的定義之後,我們結合著程式碼來測試一下,強引用就不用說了,軟引用的描述也很清楚,關鍵是 “弱引用” 與 “虛引用”。

弱引用

1 2 3 4 5 6 7 8 9 10 11 public static void main(String[] args) throws InterruptedException { Object obj = new Object(); ReferenceQueue<Object> refQueue = new ReferenceQueue<Object>();
java 引用傳遞(call by reference)與值傳遞(call by value)

引用資料型別是引用傳遞(call by reference),基本資料型別是值傳遞(call by value) (1)值傳遞不可以改變原變數的內容和地址---》函式呼叫時是把實參的值傳給形參,函式呼叫結束後形參的值不能帶回給實參。 (2)引用傳遞不可以改變原變數的地址,但可以

java 中的 Cannot make a static reference to the non-static method

原文: https://blog.csdn.net/q610376681/article/details/49359819   今天敲程式碼的時候遇到了這個問題,大體這個問題可以簡化成這樣; public class Test1 {     pu

你不可不知的Java引用型別之——Reference原始碼解析

定義 Reference是所有引用型別的父類,定義了引用的公共行為和操作。 reference指代引用物件本身,referent指代reference引用的物件,下文介紹會以reference,referent形式出現。 說明 Reference類與垃圾回收是密切配合的,所以該類不能被直接子類化。簡單來

java cannot make a static reference to the non-static method

我最後,還是無法理解和運用static, 這似乎太難. I am not able to understand what is wrong with my code. class Two { public static void main(String[] args) { in

myeclipse報錯An internal error occurred during: "Building Spring AOP reference model". java.lang.Illeg

報錯:An internal error occurred during: "Building Spring AOP reference model". java.lang.IllegalArgumentException 解決方法: windows------->pre

java.lang.NullPointerException:RelativeLayout.setAlpha(float)' on a null object reference

透明度的問題,困老了我好幾個小時,終於終於找到了解決辦法,再次記一下  給控制元件新增透明度,之前寫過,後邊忘記了,再用的時候竟然報錯了,也回憶不起來了,到底少了哪步,哎,老阿姨了,記憶力下降了。 佈局裡面新增NestedScrollView與ViewPager,往上滑的

Java中方法呼叫引數傳遞的方式是傳值,儘管傳的是引用的值而不是物件的值。(Does Java pass by reference or pass by value?)

原文地址:http://www.javaworld.com/javaworld/javaqa/2000-05/03-qa-0526-pass.html 在Java中,所有的物件變數都是引用,Java通過引用來管理物件。然而在給方法傳參時,Java並沒有使用傳引用的方式,而是

[Error!]the type java.lang.object cannot be resolved. it is indirectly reference

MyEclipse 匯入專案時出現如下錯誤,檢查過,包的匯入都正常Error!]the type java.lang.object cannot be resolved. it is indirectly referenced from required .class files找了半天,才發現,原來是jdk

String is passed by “reference” in Java[轉]

轉自:http://www.programcreek.com/2013/09/string-is-passed-by-reference-in-java/ 先看String的不變性可以更好的理解文章內容,String的不變性網址為:http://www.programc

什麼是Java的弱引用(Weak Reference)

 之前一直沒有接觸過弱引用這個概念,今天看到以後覺得挺新鮮,就查了查資料總結一下,希望對大家有所幫助。 要理解弱引用,首先要先了解一下強引用(Strong Reference),  其實我之前也並不瞭解強引用,雖然天天都在用。舉例來說:          String abc

Java中的Reference

快速 www .cn vat out 分享 調用 exce public Java中的Reference 1. 常用四種引用 快速記憶法:“硬(俗稱的強引用) --> 軟(SoftReference) --> 弱(WeakReference) --> 虛

Java中各種引用(Reference)解析

目錄 1,引用型別 2, FinalReference 2.1, Finalizer 3, SoftReference 4, WeakReference 5,