1. 程式人生 > >JAVA引用 從零開始的記憶體釋放學習

JAVA引用 從零開始的記憶體釋放學習

JAVA引用 從零開始的記憶體釋放學習

當計算機記憶體被過多無用程式碼佔用時,我們可以通過釋放記憶體這種形式來節省java程式執行時所佔用的記憶體。但是,這樣就存在一個弊端。因為並不是電腦記憶體越空曠我們的程式就跑的越快。用簡單的方法想,就是你例項化類以後。將該類記憶體釋放,然後記憶體就空了一塊。但是你如果還需要繼續使用該類的方法就又要重新例項化該類,所以就需要我們要自己判斷需不需要釋放掉某個類的記憶體。

為什麼要釋放記憶體?

需要釋放記憶體的原因很簡單:大量的已經使用過後無用的程式碼堆積會導致記憶體不足並且不在使用的程式碼會讓程式執行效率降低。

因為JVM在執行程式的時候是需要一個一個的查詢如果釋放掉了一些“無用”的程式碼則可以在一定程度上增加程式執行效率。

舉個例子就是:

假如,我給你一副打亂順序的撲克牌讓你在撲克牌中找到撲克牌中的Joker。但是你不知道Joker在哪隻能一張一張的慢慢查詢。如果Joker在撲克牌的底部你需要尋找54次才能找到Joker(只是舉最簡單的遞迴例子說明)。但是假如我釋放掉了一些撲克牌比如JQK這所有花色的這三張丟掉了不用你繼續找就算Joker還在底部你也比找一整套撲克牌查詢次數要少得多。

首先讓我們先來了解下JVM記憶體的基本知識

首先JAVAmain是一個程式的起點,然後在JVM中申請一大片記憶體

JVM記憶體圖:

程式碼:

public class Actionclass{
	public static void main(String[] args){

     }
}

注:具體詳細等講類載入器時詳講。

因為程式什麼都沒執行所以mainJVM的中劃的記憶體是空的

如果在main中例項化程式碼(或呼叫標準庫程式碼)JVM記憶體圖:



程式碼:

public class Actionclass{
	public static void main(String[] args){
Test  t= new Test();
}
}

public class Test{
Test(){
System.out.println(“th’s test”);
}
}

假如當test類執行過後我們不在執行該方法了該方法的存在就是在浪費記憶體所以就需要我們給釋放掉者就用到了我們的引用並且用

GC來釋放記憶體;

引用

引用分為:

強引用   Strong References   

上面再書寫測試程式碼的時候例項化Test就是強引用等級最高 最強的引用比GC沒有辦法回收強引用的欄位只有在程式結束後給JVM回收掉 寧可程式記憶體溢位也不會回收【頭太鐵】


Test  t= new Test();//強引用
Sting s = “123”;//強引用

弱引用   Weak Reference

   弱引用和強引用正好相反假如強引用相當於GC的親兒子那麼弱引用就相當於GC的老公在外面放蕩不羈留下的私生子GC一生氣弱引用就滾蛋(只要呼叫GC弱引用就被釋放)

呼叫方法:

WeakReference<Test> wr =new WeakReference<Test>(new Test());
Wr.get();//返回一個new Test();

例項:

public class Actionclass{
	public static void main(String[] args){
		WeakReference<Test> wr =new WeakReference<Test>(new Test());
		System.out.println(wr.get()==null);
		System.gc();//gc來了弱引用該被釋放了
System.out.println(wr.get()==null);}
}

public class Test{
}

執行結果:
false
true

軟引用   Soft Reference

軟引用是GC孃家侄子 在怎麼調皮搗蛋只要家裡不吃緊(記憶體還夠)就一直存在

和軟引用用法一樣:

SoftReference<Test> wr =new SoftReference<Test>(new Test());
Wr.get();//返回一個new Test();

例項:

ublic class Actionclass{
	public static void main(String[] args){
		SoftReference<Test> wr =new SoftReference<Test>(new Test());
		System.out.println(wr.get()==null);
		System.gc();//gc來了弱引用也不被釋放
System.out.println(wr.get()==null);}
}

public class Test{
}

執行結果:
false
false

幻影引用 Phantom Reference(虛引用、影引用等等...

幻影引用一般用處不大 這個引用就彷彿沒有存在(所以才叫幻影吧)例項化後就立馬被釋放掉了

ReferenceQueue rq = new ReferenceQueue();
PhantomReference<Test> wr =new PhantomReference<Test>(new Test(),rq );

例項:

public class Actionclass{
	public static void main(String[] args){
ReferenceQueue rq = new ReferenceQueue();
		PhantomReference<Test> wr =new PhantomReference<Test>(new Test(),rq );
		System.out.println(wr.get()==null);
}

public class Test{
Test(){
System.out.println(“th’s test”);
}
}
執行結果:
th’s test
true
true


相關推薦

JAVA引用 開始記憶體釋放學習

JAVA引用 從零開始的記憶體釋放學習 當計算機記憶體被過多無用程式碼佔用時,我們可以通過釋放記憶體這種形式來節省java程式執行時所佔用的記憶體。但是,這樣就存在一個弊端。因為並不是電腦記憶體越空曠

開始的Linux學習

日期時間 modules 種類 example arch ssi pri rst systemctl 計算機的組成及其功能 在馮諾依曼體系中,計算機的組成部分有 控制器:負責指揮、協調計算機系統的操作運算器:執行算術和邏輯運算操作存儲器:存儲數據、指令和程序等信息,並在需要

開始的Linux學習

col ctrl name 情況 bcd 刪除 指定 同名 ati Linux上的文件管理類命令 常用的文件管理工具有:cp , mv , rm cp命令——copy:NAMEcp - copy files and directories復制 文件 和 目錄SYNO

開始的Linux學習

重命名 信息 storage centos7 pass ins mem cut 通用 Linux用戶和組管理 今天我們來介紹Linux的用戶和組管理,在Linux系統上,用戶管理是基於用戶名和密碼的方式進行資源分配的。 Linux上的用戶即Username/UID分為:

開始的Python學習Episode 13——常用模組

模組   一、time模組 時間戳(timestamp) :時間戳表示的是從1970年1月1日00:00:00開始按秒計算的偏移量。 元組(struct_time)   :struct_time元組共有9個元素共九個元素:(年,月,日,時,分,秒,一年中第幾周,一年中第幾天,夏令時

開始的Python學習Episode 15——正則表示式

正則表示式   正則表示式(或 RE)是一種小型的、高度專業化的程式語言,(在Python中)它內嵌在Python中,並通過 re 模組實現,所以使用時要匯入re模組。正則表示式模式被編譯成一系列的位元組碼,然後由用 C 編寫的匹配引擎執行。   先說幾個元字元 &nbs

開始的Linux學習日誌

從零開始的Linux學習日誌 從零開始的Linux學習生活 搭建環境 常見的Linux指令 1. echo 2.date 3.reboot和poweroff 4.其他重要指令 小結 從零

開始的Python學習 知識補充sorted

sorted()方法 sorted()可用於任何一個可迭代物件。 原型為sorted(iterable, cmp=None, key=None, reverse=False)   iterable:一個可迭代物件; cmp:用於比較的函式,比較什麼由key決定; key:用列表元素的某個

開始-Machine Learning學習筆記(25)-整合學習

文章目錄 1. Boosting - AdaBoosting 2. Bagging與隨機森林 2.1 Bagging - 並行式整合學習 2.2 隨機森林 3. 結合策略

開始-Machine Learning學習筆記(24)-貝葉斯分類器

  首先還是先取出周志華先生在《機器學習》貝葉斯分類器一章中對於貝葉斯決策論的定義: 貝葉斯決策論是概率框架下實施決策的基本方法。在分類任務中,在所有相關概率都已知的情況下,貝葉斯決策論考慮的是如何基於這些概率和誤判損失來選擇最優的標記。   基於最小化條件風險,我

開始-Machine Learning學習筆記(26)-聚類

文章目錄 0. 前言 1. 聚類的效能度量和距離計算 1.1 效能度量 1.2 距離計算 2. 原型聚類 2.1 K-means 2.2 學

開始系統化的學習寫Python爬蟲

主要是記錄一下自己寫Python爬蟲的經過與心得。 同時也是為了分享一下如何能更高效率的學習寫爬蟲。 IDE:Vscode Python版本: 3.6       用Python自動填寫問卷星 更多Python課程資料請加pyth

開始-Machine Learning學習筆記(31)-規則學習

文章目錄 1. 基本概念 2. 序貫覆蓋 3. 剪枝優化 3.1 預剪枝-CN2演算法 3.2 後剪枝-RIPPER演算法 4. 一階規則學習 5. 歸納邏

開始-Machine Learning學習筆記(30)-概率圖模型

文章目錄 1. 隱馬爾可夫模型(Hidden Markov Model,HMM) 2. 馬爾科夫隨機場(Markov Random Field, MRF) 3. 條件隨機場(Conditional Random Field,

開始-Machine Learning學習筆記(29)-半監督學習

文章目錄 1. 生成式方法 2. 半監督SVM(Semi-Supervised Support Vector Machine, S3VM) 3. 圖半監督學習 3.1 針對於二分類問題的標記傳播

開始-Machine Learning學習筆記(27)-降維與度量學習

文章目錄 1. k近鄰學習 - (k-Nearest Neighbor, KNN) 2. 低維嵌入 3. 主成分分析(Principal Component Analysis, PCA) 4. 核化線性降維 - K

開始學深度學習二:神經網路

本課程筆記來源於深享網課程《深度學習理論與實戰TensorFlow》 2.1學習的種類 學習的種類主要分成以下三類:監督學習、非監督學習和強化學習三種。接下來,將分別對這三種學習進行介紹。 監督學習: 對已經標記的訓練樣本進行學習,然後對樣本外的資料進行標記

開始學深度學習三:logistic迴歸模型

本筆記來源於深享網課程《深度學習理論與實戰TensorFlow》 Logistic迴歸模型是一種廣義的迴歸模型,其與多元線性迴歸有很多相似之處,模型的基本形式相同,雖然也被稱為迴歸模型,但是需要注意的是,Logistic更多應用在分類問題中,但是又以二分類最

開始-Machine Learning學習筆記(19)-One-hot與啞變數的區別與聯絡

One-hot與啞變數的區別與聯絡 1. One-hot編碼   獨熱編碼直觀來說就是有多少個狀態就有多少個bit,且只有一個bit是1,其餘全是0的一種編碼方式。舉個例子就是一個氣球有四種顏色紅色R,紫色P,藍色B和黃色Y,我們使用One-hot進行編碼就可以

開始的Linux學習日誌(2)

重定向命令列 1.標準輸入輸出重定向 標準輸入重定向(STDIN,檔案描述符為0) 預設從鍵盤輸入,也可從檔案或命令輸入。 標準輸出重定向(STDOUT,檔案描述符為1) 預設輸出到螢幕 錯誤輸出重定向(STDERR,檔案描述符為2) 預設