1. 程式人生 > >jvm引用例項分析(強引用,軟使用,弱引用,虛引用)

jvm引用例項分析(強引用,軟使用,弱引用,虛引用)

強引用(Strong Reference)

強引用是指在程式程式碼中普遍存在的,類似“Object obj=new Object()”這類的引用,只要強引用還存在,垃圾收集器永遠不會回收掉被引用的物件。

  1. publicclass StrongReferenceTest {  
  2.     privatestaticclass BiggerObject{//佔用空間的一個大物件
  3.         publicint[] values;  
  4.         public String name;  
  5.         public BiggerObject(String name){  
  6.             this
    .name=name;  
  7.             values=newint[1024];  
  8.         }  
  9.     }  
  10.     publicstaticvoid main(String[] args) {  
  11.         int count=10000;//物件的個數,保證使得堆記憶體溢位
  12.         BiggerObject[] values=new BiggerObject[count];  
  13.         for(int i=0;i<count;i++){  
  14.             values[i]=new BiggerObject("Object-"+i);  
  15.         }  
  16.         for(int i=0;i<10;i++){  
  17.             System.out.println(values[i].name);  
  18.         }   
  19.     }   
  20. }  
輸出:

Java.lang.OutOfMemoryError: Java heap space
Dumping heap to java_pid668.hprof ...
Heap dump file created [13980085 bytes in 0.181 secs]
Exception in thread "main" java.lang.OutOfMemoryError: 

java heap space
    at StrongReferenceTest$BiggerObject.<init>(StrongReferenceTest.java:8)
    at StrongReferenceTest.main(StrongReferenceTest.java:15)

因為垃圾收集器無法回收強引用關聯著的物件,從而導致堆記憶體溢位。

軟引用(Soft Reference)

用來描述一些還有用並非必要的物件。對於軟引用關聯著的物件,在系統將要發生記憶體溢位異常之前,將會把這些物件列入回收範圍進行第二次回收。如果這次回收還沒有足夠的記憶體,才會丟擲記憶體溢位異常。JDK 1.2之後,提供了SoftReference類來實現軟引用。

  1. import java.lang.ref.SoftReference;  
  2. publicclass SoftReferenceTest {  
  3.     privatestaticclass BiggerObject{//佔用空間的一個大物件
  4.         publicint[] values;  
  5.         public String name;  
  6.         public BiggerObject(String name){  
  7.             this.name=name;  
  8.             values=newint[1024];  
  9.         }  
  10.     }  
  11.     publicstaticvoid main(String[] args) {  
  12.         int count=100000;//物件數量為100000,保證使得堆記憶體溢位
  13.         SoftReference[] values=new SoftReference[count];  
  14.         for(int i=0;i<count;i++){  
  15.             values[i]=new SoftReference<BiggerObject>(new BiggerObject("Object-"+i));  
  16.         }  
  17.         System.out.println(((BiggerObject)(values[values.length-1].get())).name);  
  18.         for(int i=0;i<10;i++){  
  19.             System.out.println(((BiggerObject)(values[i].get())).name);  
  20.         }   
  21.     }   
  22. }  
輸出:

Object-99999
Exception in thread "main" java.lang.NullPointerException
    at SoftReferenceTest.main(SoftReferenceTest.java:21)

第一行輸出說明,使用軟引用後,原本由於堆記憶體溢位而無法正常執行的程式碼段“正常的”執行成功;

但是,當我們訪問早期建立的那些物件時,卻報java.lang.NullPointerException異常,說明早期建立的物件已經被垃圾收集器回收了。

  1. import java.lang.ref.SoftReference;  
  2. publicclass SoftReferenceTest {  
  3.     privatestaticclass BiggerObject{//佔用空間的一個大物件
  4.         publicint[] values;  
  5.         public String name;  
  6.         public BiggerObject(String name){  
  7.             this.name=name;  
  8.             values=newint[1024];  
  9.         }  
  10.     }  
  11.     publicstaticvoid main(String[] args) {  
  12.         int count=100;//物件數量改為100,保證堆記憶體不會溢位
  13.         SoftReference[] values=new SoftReference[count];  
  14.         for(int i=0;i<count;i++){  
  15.             values[i]=new SoftReference<BiggerObject>(new BiggerObject("Object-"+i));  
  16.         }  
  17.         System.gc();//強制進行垃圾回收
  18.         System.out.println(((BiggerObject)(values[values.length-1].get())).name);  
  19.         for(int i=0;i<10;i++){  
  20.             System.out.println(((BiggerObject)(values[i].get())).name);  
  21.         }   
  22.     }   
  23. }  

輸出:

Object-99

Object-0

Object-1

Object-2

Object-3

Object-4

Object-5

Object-6

Object-7

Object-8

Object-9

當堆記憶體足夠時,即使我們強制進行垃圾回收,軟引用關聯著的物件也不會被回收。

弱引用(WeakReference)

弱引用也是用來描述非必要物件的,但是他的強度比軟引用更弱一些,被軟引用關聯的物件只能生存到下一次垃圾收集發生之前。當垃圾收集器工作時,無論當前記憶體是否足夠,都會回收掉只被弱引用關聯的物件。JDK 1.2之後,提供了WeakReference類來實現弱引用。

  1. publicclass WeakReferenceTest {  
  2.     privatestaticclass BiggerObject{//佔用空間的一個大物件
  3.         publicint[] values;  
  4.         public String name;  
  5.         public BiggerObject(String name){  
  6.             this.name=name;  
  7.             values=newint[1024];  
  8.         }  
  9.     }  
  10.     publicstaticvoid main(String[] args) {  
  11.         int count=10000;//物件數量為10000,保證使得堆記憶體溢位
  12.         WeakReference[] values=new WeakReference[count];  
  13.         for(int i=0;i<count;i++){  
  14.             values[i]=new WeakReference<BiggerObject>(new BiggerObject("Object-"+i));  
  15.         }   
  16.         System.out.println(((BiggerObject)(values[values.length-1].get())).name);  
  17.         for(int i=0;i<10;i++){  
  18.             System.out.println(((BiggerObject)(values[i].get())).name);  
  19.         }   
  20.     }   
  21. }  
輸出:

Object-9999
Exception in thread "main" java.lang.NullPointerException
    at WeakReferenceTest.main(WeakReferenceTest.java:22)

輸出結果,與軟引用相同。

  1. publicclass WeakReferenceTest {  
  2.     privatestaticclass BiggerObject{//佔用空間的一個大物件
  3.         publicint[] values;  
  4.         public String name;  
  5.         public BiggerObject(String name){  
  6.             this.name=name;  
  7.             values=newint[1024];  
  8.         }  
  9.     }  
  10.     publicstaticvoid main(String[] args) {  
  11.         int count=100;//物件數量改為100,保證堆記憶體不會溢位
  12.         WeakReference[] values=new WeakReference[count];  
  13.         for(int i=0;i<count;i++){  
  14.             values[i]=new WeakReference<BiggerObject>(new BiggerObject("Object-"+i));  
  15.         }   
  16.         System.out.println(((BiggerObject)(values[values.length-1].get())).name);  
  17.         for(int i=0;i<10;i++){  
  18.             System.out.println(((BiggerObject)(values[i].get())).name);  
  19.         }   
  20.     }   
  21. }  
輸出:

Object-99
Object-0
Object-1
Object-2
Object-3
Object-4
Object-5
Object-6
Object-7
Object-8
Object-9

當堆記憶體夠用時,正常輸出。

  1. publicclass WeakReferenceTest {  
  2. 相關推薦

    jvm引用例項分析引用使用引用引用

    強引用(Strong Reference) 強引用是指在程式程式碼中普遍存在的,類似“Object obj=new Object()”這類的引用,只要強引用還存在,垃圾收集器永遠不會回收掉被引用的物件。 publicclass StrongReferenceTes

    python的引用計數分析

    裏的 %20 賦值 手動 計數 python 作用域 新的 pri python所有對象引用計數被減少1的情況: 一.對象的別名被賦予新的對象; a = 23345455 # 增加了一個引用 b = a # 增加了一個引用 print(sys.getrefcount(

    Java引用詳解引用引用引用引用

    強引用(Strong Reference) 強引用是指在程式程式碼中普遍存在的,類似“Object obj=new Object()”這類的引用,只要強引用還存在,垃圾收集器永遠不會回收掉被引用的物件。 public class StrongReferenceTest {

    關於nspm品類產品在行業用戶網絡架構中的研究分析建議安全自動化運維工具開發者了解

    nspm產品如何提升安全運維為配合NSPM產品在不同行業不同類型的網絡架構中最大限度的發揮產品優勢,探索不同網絡架構中對產品的適配性。分多個行業目前的傳統網絡架構與未來演進的架構進行深入調研。 從目前數據中心所使用協議的數據層上看,IT方案都是以二/三層網絡(例如以太網+IP網絡)為基礎的,例如GRE、VXL

    java中引用引用應用、引用

    虛引用:“虛引用”顧名思義,就是形同虛設,與其他幾種引用都不同,虛引用並不會決定物件的生命週期。如果一個物件 僅持有虛引用,那麼它就和沒有任何引用一樣,在任何時候都可能被垃圾回收。 虛引用主要用來跟蹤物件被垃圾回收的活動。虛引用與軟引用和弱引用的一個區別在於:虛引用必須和引用佇列 (ReferenceQue

    圖的BFS和DFS原理及例項分析java

    BFS和DFS是圖的兩種遍歷方式,是最簡單的圖搜尋演算法。 本文將給出給出BFS和DFS的以下幾種實現方式: 1、使用佇列Queue實現圖的BFS遍歷 2、遞迴實現圖的DFS遍歷 3、使用棧Stack迭代實現圖的DFS遍歷 一、BFS(廣度優先搜尋

    【OpenGL】Shader例項分析- 雪花飄落效果

    研究了一個雪花飄落效果,感覺挺不錯的,分享給大家,效果如下: 程式碼如下: Shader "shadertoy/Flakes" { // https://www.shadertoy.com/view/4d2Xzc Properties{ iMouse ("Mo

    Java Class檔案結構例項分析

    發表文章之後,發現很多圖片顯示不了,請閱讀我的公眾號文章,以獲得本文最佳體驗: 本篇我們繼續分析Class檔案結構的方法及屬性部分內容,上節內容回顧請檢視: Class檔案格式資訊 繼續上節例項程式碼 package chapter6; public 

    【OpenGL】Shader例項分析- 照片閃光,圓角和遮罩

    在遊戲中,當戰鬥結束後,對一些獲取的寶貝需要進行閃光處理。這篇文章介紹一個進行閃光處理的shader,執行效果如下: 程式碼如下: Shader "stalendp/imageShine" {       Properties {           _i

    Linux\Unix IPC程序通訊例項分析:共享記憶體通訊---系統V

    前些天看到有個博主寫部落格採用問答式的敘述方法:把很多知識點通過一問一答的形式把文章串起來,我覺得這種形式不錯,便於突出重點。後面我也做下嘗試,一邊寫寫部落格,一邊回顧一下自己對IPC程序通訊的認識。 Q:這些例子來自哪? Q:IBM原文都寫過了,為什麼還要在這裡再寫一

    Java Class檔案結構例項分析

    發表文章之後,發現很多圖片顯示不了,請閱讀我的公眾號文章,以獲得本文最佳體驗: 本文假定讀者對Java Class檔案格式有一些基本的瞭解,建議結合相關書籍進行對照閱讀。 Class檔案格式資訊 例項程式碼 package chapter6; public

    cocos2d-x 強大的shader系列:【OpenGL】Shader例項分析-Wave

    這篇文章主要分析一個Shader,從而感受shader的魅力,並學習相關shader的函式的用法。 下面是程式碼: Shader "shadertoy/Waves" {  //see https://www.shadertoy.com/view/4dsGz

    【OpenGL】Shader例項分析- AngryBots中的主角受傷特效

    AngryBots是Unity官方的一個非常棒的例子,很有研究價值。以前研究的時候,由於其內容豐富,一時間不知道從哪入手寫文章分析。這一段時間研究shader技術比較多一些,就從shader的這一方面開始吧。首先分析其中的一個螢幕特效:當主角受到攻擊時會出現的全屏效果(p

    Android O Settings原始碼流程分析資料載入之獲取及修改預設設定屬性值

    Android O Settings  靜態介面篇 介面渲染篇 資料載入篇之一級選單 資料載入篇之二級選單 資料載入篇之獲取及修改預設設定屬性值 搜尋欄篇 載入預設設定值及修改:(涉及SettingsProvider) 示例:(裝置自動亮

    第五課 迷你商學院案例分析全域性、辯證、換位思維——不要斬釘截鐵的下結論

    1. 待人熱情,對建立良好的人際關係重要嗎? 分析:建立良好的人際關係有很多重要的影響因素:真誠、工作出色、敬業、善良(全域性思維),待人熱情,是一個基本禮貌,是重要的。但我覺得價值匹配才是良好人際關係的根本,比如求職,HR要找一個匹配職位需求的、能為公司創造價值的求職者(別人舒服嗎?),求職者要找一個符合

    解決 mklink 使用中的各種坑硬連結連結/符號連結目錄連結

    通過 mklink 命令可以建立檔案或資料夾的連結,而這種連結跟快捷方式是不一樣的。然而我們還可能會遇到其使用過程中的一些坑,本文將整理這些坑並提供解決方法。 0x00 背景介紹:mklink mklink 可以像建立快捷方式一樣建立檔案或資料夾

    Hibernate物件三種狀態詳細分析轉自http://blog.csdn.net/redarmy_chen/article/details/7069482

    在hibernate中有三種狀態:瞬時態(Transient)、 持久態(Persistent)、脫管態(Detached)。處於持久態的物件也稱為PO(Persistence Object),瞬時物件和脫管物件也稱為VO(Value Object)。通過自己在網上的搜尋,

    IOS微信6.7.4輸入框失去焦點鍵盤關閉後被撐起的頁面無法回退到原來正常的位置

    IOS微信6.7.4輸入框失去焦點,軟鍵盤關閉後,被撐起的頁面無法回退到原來正常的位置   近期在開發微信H5頁面時碰到這個問題,如圖,軟鍵盤彈起後,若原輸入框被遮擋,頁面整體將會上移,然而當輸入框失焦,軟鍵盤收起後,頁面未恢復,這也是ios的微信版本更新6.7.4之後才

    H5鍵盤彈出頁面變形問題

        對於其它的標籤,不要使用top屬性,可以用外邊距margin(例如margin-top)屬性。對於背景圖片,高度不要用css設定,用js動態載入設定,就ok了; 例如:背景圖片: <img src="p.jpg" class="bj"/>.bj{wid

    UNIX硬連結連結(符號連結)檔案複製

    學習APUE第四章被硬連結和符號連結搞的頭暈,下面綜合網上和課本資料總結如下: 一.首先在區別前得搞清楚UNIX檔案系統的基本結構 (2).基本結構:即檔案系統是如何管理資料的,也就是資料結構的型別,此處所講的是inode資料結構。 (3)inode資料結構:(摘自鳥哥私