亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

淺談Java垃圾回收的實現過程

2024-07-13 10:14:40
字體:
來源:轉載
供稿:網友

本教程是為了理解基本的Java垃圾回收以及它是如何工作的。這是垃圾回收教程系列的第二部分。希望你已經讀過了第一部分:《簡單介紹Java垃圾回收機制》。

Java垃圾回收是一項自動化的過程,用來管理程序所使用的運行時內存。通過這一自動化過程,JVM解除了程序員在程序中分配和釋放內存資源的開銷。

啟動Java垃圾回收

作為一個自動的過程,程序員不需要在代碼中顯示地啟動垃圾回收過程。System.gc()和Runtime.gc()用來請求JVM啟動垃圾回收。

雖然這個請求機制提供給程序員一個啟動GC過程的機會,但是啟動由JVM負責。JVM可以拒絕這個請求,所以并不保證這些調用都將執行垃圾回收。啟動時機的選擇由JVM決定,并且取決于堆內存中Eden區是否可用。JVM將這個選擇留給了Java規范的實現,不同實現具體使用的算法不盡相同。

毋庸置疑,我們知道垃圾回收過程是不能被強制執行的。我剛剛發現了一個調用System.gc()有意義的場景。通過這篇文章了解一下適合調用System.gc()這種極端情況。

Java垃圾回收過程

垃圾回收是一種回收無用內存空間并使其對未來實例可用的過程。

java,垃圾回收過程,java垃圾回收機制,java垃圾回收,java的垃圾回收機制

Eden區:當一個實例被創建了,首先會被存儲在堆內存年輕代的Eden區中。

注意:如果你不能理解這些詞匯,我建議你閱讀這篇垃圾回收介紹,這篇教程詳細地介紹了內存模型、JVM架構以及這些術語。

Survivor區(S0和S1):作為年輕代GC(MinorGC)周期的一部分,存活的對象(仍然被引用的)從Eden區被移動到Survivor區的S0中。類似的,垃圾回收器會掃描S0然后將存活的實例移動到S1中。

(譯注:此處不應該是Eden和S0中存活的都移到S1么,為什么會先移到S0再從S0移到S1?)

死亡的實例(不再被引用)被標記為垃圾回收。根據垃圾回收器(有四種常用的垃圾回收器,將在下一教程中介紹它們)選擇的不同,要么被標記的實例都會不停地從內存中移除,要么回收過程會在一個單獨的進程中完成。

老年代:老年代(Oldortenuredgeneration)是堆內存中的第二塊邏輯區。當垃圾回收器執行MinorGC周期時,在S1Survivor區中的存活實例將會被晉升到老年代,而未被引用的對象被標記為回收。

老年代GC(MajorGC):相對于Java垃圾回收過程,老年代是實例生命周期的最后階段。MajorGC掃描老年代的垃圾回收過程。如果實例不再被引用,那么它們會被標記為回收,否則它們會繼續留在老年代中。

內存碎片:一旦實例從堆內存中被刪除,其位置就會變空并且可用于未來實例的分配。這些空出的空間將會使整個內存區域碎片化。為了實例的快速分配,需要進行碎片整理?;诶厥掌鞯牟煌x擇,回收的內存區域要么被不停地被整理,要么在一個單獨的GC進程中完成。

垃圾回收中實例的終結

在釋放一個實例和回收內存空間之前,Java垃圾回收器會調用實例各自的finalize()方法,從而該實例有機會釋放所持有的資源。雖然可以保證finalize()會在回收內存空間之前被調用,但是沒有指定的順序和時間。多個實例間的順序是無法被預知,甚至可能會并行發生。程序不應該預先調整實例之間的順序并使用finalize()方法回收資源。

任何在finalize過程中未被捕獲的異常會自動被忽略,然后該實例的finalize過程被取消。

JVM規范中并沒有討論關于弱引用的垃圾回收機制,也沒有很明確的要求。具體的實現都由實現方決定。

垃圾回收是由一個守護線程完成的。

對象什么時候符合垃圾回收的條件?

所有實例都沒有活動線程訪問。

沒有被其他任何實例訪問的循環引用實例。

Java中有不同的引用類型。判斷實例是否符合垃圾收集的條件都依賴于它的引用類型。

 

引用類型 垃圾收集
強引用(Strong Reference) 不符合垃圾收集
軟引用(Soft Reference) 垃圾收集可能會執行,但會作為最后的選擇
弱引用(Weak Reference) 符合垃圾收集
虛引用(Phantom Reference) 符合垃圾收集

 

在編譯過程中作為一種優化技術,Java 編譯器能選擇給實例賦 null 值,從而標記實例為可回收。

class Animal {  public static void main(String[] args) {    Animal lion = new Animal();    System.out.println("Main is completed.");  }   protected void finalize() {    System.out.println("Rest in Peace!");  }}

在上面的類中,lion對象在實例化行后從未被使用過。因此Java編譯器作為一種優化措施可以直接在實例化行后賦值lion=null。因此,即使在SOP輸出之前,finalize函數也能夠打印出'RestinPeace!'。我們不能證明這確定會發生,因為它依賴JVM的實現方式和運行時使用的內存。然而,我們還能學習到一點:如果編譯器看到該實例在未來再也不會被引用,能夠選擇并提早釋放實例空間。

關于對象什么時候符合垃圾回收有一個更好的例子。實例的所有屬性能被存儲在寄存器中,隨后寄存器將被訪問并讀取內容。無一例外,這些值將被寫回到實例中。雖然這些值在將來能被使用,這個實例仍然能被標記為符合垃圾回收。這是一個很經典的例子,不是嗎?

當被賦值為null時,這是很簡單的一個符合垃圾回收的示例。當然,復雜的情況可以像上面的幾點。這是由JVM實現者所做的選擇。目的是留下盡可能小的內存占用,加快響應速度,提高吞吐量。為了實現這一目標,JVM的實現者可以選擇一個更好的方案或算法在垃圾回收過程中回收內存空間。

當finalize()方法被調用時,JVM會釋放該線程上的所有同步鎖。

GCScope示例程序

Class GCScope {	GCScope t;	static int i = 1;	public static void main(String args[]) {		GCScope t1 = new GCScope();		GCScope t2 = new GCScope();		GCScope t3 = new GCScope();		// No Object Is Eligible for GC		t1.t = t2;		// No Object Is Eligible for GC		t2.t = t3;		// No Object Is Eligible for GC		t3.t = t1;		// No Object Is Eligible for GC		t1 = null;		// No Object Is Eligible for GC (t3.t still has a reference to t1)		t2 = null;		// No Object Is Eligible for GC (t3.t.t still has a reference to t2)		t3 = null;		// All the 3 Object Is Eligible for GC (None of them have a reference.		// only the variable t of the objects are referring each other in a		// rounded fashion forming the Island of objects with out any external		// reference)	}	protected void finalize() {		System.out.println("Garbage collected from object" + i);		i++;	}	class GCScope {		GCScope t;		static int i = 1;		public static void main(String args[]) {			GCScope t1 = new GCScope();			GCScope t2 = new GCScope();			GCScope t3 = new GCScope();			// 沒有對象符合GC			t1.t = t2;			// 沒有對象符合GC			t2.t = t3;			// 沒有對象符合GC			t3.t = t1;			// 沒有對象符合GC			t1 = null;			// 沒有對象符合GC (t3.t 仍然有一個到 t1 的引用)			t2 = null;			// 沒有對象符合GC (t3.t.t 仍然有一個到 t2 的引用)			t3 = null;			// 所有三個對象都符合GC (它們中沒有一個擁有引用。			// 只有各對象的變量 t 還指向了彼此,			// 形成了一個由對象組成的環形的島,而沒有任何外部的引用。)		}		protected void finalize() {			System.out.println("Garbage collected from object" + i);			i++;		}

GC OutOfMemoryError 的示例程序

GC并不保證內存溢出問題的安全性,粗心寫下的代碼會導致 OutOfMemoryError。

import java.util.LinkedList;import java.util.List;public class GC {	public static void main(String[] main) {		List l = new LinkedList();		// Enter infinite loop which will add a String to the list: l on each		// iteration.		do {			l.add(new String("Hello, World"));		}		while (true);	}}

輸出:

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space  at java.util.LinkedList.linkLast(LinkedList.java:142)  at java.util.LinkedList.add(LinkedList.java:338)  at com.javapapers.java.GCScope.main(GCScope.java:12)

總結

以上就是本文關于淺談Java垃圾回收的實現過程的全部內容,希望對大家有所幫助。感興趣的朋友可以繼續參閱本站其他相關專題,如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩欧美国产激情| 欧美日韩亚洲一区二区三区| 国产亚洲欧洲在线| 欧美国产极速在线| 亚洲精品动漫100p| 国产一区二区三区直播精品电影| 亚洲欧洲激情在线| 疯狂做受xxxx高潮欧美日本| 国产精品视频久久久| 亚洲在线视频观看| 孩xxxx性bbbb欧美| 少妇精69xxtheporn| 亚洲综合第一页| 综合网中文字幕| 欧美日韩国产精品一区二区不卡中文| 97视频色精品| 国产精品三级网站| 在线亚洲国产精品网| 一二美女精品欧洲| 久久99久国产精品黄毛片入口| 亚洲欧美日韩一区在线| 欧美国产日韩中文字幕在线| 亚洲视频电影图片偷拍一区| 久久久中文字幕| 亚洲精品ady| 久久99国产综合精品女同| 国产精品揄拍一区二区| 欧美激情一级精品国产| 国外成人性视频| 欧美野外猛男的大粗鳮| 国产欧美va欧美va香蕉在线| 欧美日韩激情视频| 亚洲国产精品va在看黑人| 亚洲电影第1页| 91精品在线观看视频| xxxxxxxxx欧美| 久久91精品国产91久久久| 日韩中文在线中文网三级| 日韩精品免费在线| 成人情趣片在线观看免费| 欧美精品videosex性欧美| 国产精品国产自产拍高清av水多| 亚洲精品国精品久久99热一| 亚洲国产毛片完整版| 成人黄色免费网站在线观看| 亚洲另类图片色| 91黄色8090| 国产激情久久久| 国产精品成人v| 国产亚洲成av人片在线观看桃| 欧美性视频在线| 91精品国产91久久久久久不卡| 国产精品视频一区国模私拍| 亚洲一区中文字幕在线观看| 欧美色videos| 欧美在线视频免费观看| 日本成人在线视频网址| 欧美一级淫片丝袜脚交| 久久精品成人动漫| 秋霞成人午夜鲁丝一区二区三区| 91夜夜未满十八勿入爽爽影院| 日韩极品精品视频免费观看| 亚洲国产精品久久精品怡红院| 国产人妖伪娘一区91| 狠狠色噜噜狠狠狠狠97| 日韩av免费在线观看| 国产精品一区二区三区免费视频| 岛国av一区二区在线在线观看| 久久人人97超碰精品888| 亚洲国产另类久久精品| 亚洲sss综合天堂久久| 亚洲一级黄色av| 久久精品国产欧美亚洲人人爽| 久久精品亚洲国产| 国产91av在线| 国产精品91视频| 欧美成人小视频| 色噜噜国产精品视频一区二区| 国产视频999| 国产+成+人+亚洲欧洲| 青青草成人在线| 亚洲欧美日韩中文在线| 国产精品日韩欧美大师| 国产精品自拍偷拍视频| 68精品国产免费久久久久久婷婷| 中文字幕精品av| 97精品一区二区视频在线观看| 欧美老少配视频| 7m精品福利视频导航| 韩曰欧美视频免费观看| 色综合天天狠天天透天天伊人| 97**国产露脸精品国产| 欧美精品一本久久男人的天堂| 亚洲第一精品夜夜躁人人躁| 国产精品草莓在线免费观看| 亚洲精品日产aⅴ| 性欧美xxxx交| 国产精品一区二区久久国产| 久久久久久久久久久成人| 亚洲第一天堂av| 伊人亚洲福利一区二区三区| 91久久综合亚洲鲁鲁五月天| 最近2019中文字幕mv免费看| 亚洲国产精品999| 国产日韩在线一区| 欧美精品福利在线| 亚洲人成电影网站色xx| 亚洲天堂男人天堂女人天堂| 国产精品丝袜高跟| 国产视频在线一区二区| 狠狠久久五月精品中文字幕| 亚洲第一视频在线观看| 亚洲香蕉成人av网站在线观看| 亚洲另类激情图| 国产午夜精品一区二区三区| 欧美国产视频日韩| 国产色婷婷国产综合在线理论片a| 成人xvideos免费视频| 日韩av片免费在线观看| 久久亚洲精品毛片| 在线日韩中文字幕| 福利视频一区二区| 久久精品久久久久电影| 亚洲性线免费观看视频成熟| 国产成人精品综合| 成人欧美在线视频| 精品国产老师黑色丝袜高跟鞋| 久久影院在线观看| 国产一区二区黑人欧美xxxx| 国产成人亚洲综合青青| 高跟丝袜一区二区三区| 国产精品网红福利| wwwwwwww亚洲| 久久人人97超碰精品888| 精品视频9999| 国产精品99蜜臀久久不卡二区| 久久久久久伊人| 日韩在线一区二区三区免费视频| 伊人亚洲福利一区二区三区| 亚洲国产欧美在线成人app| 国产精品永久免费视频| 国产成人精品一区二区三区| 国产成人精品av在线| 91精品国产综合久久香蕉最新版| 亚洲精品456在线播放狼人| 久久久久久久久久久久av| 久久男人的天堂| 人人爽久久涩噜噜噜网站| 欧美伊久线香蕉线新在线| 成人午夜小视频| 亚洲欧美国产va在线影院| 久久亚洲精品小早川怜子66| 日韩国产精品一区| 黑人与娇小精品av专区| 国内久久久精品| 日本国产欧美一区二区三区| 亚洲第一男人天堂| 国产mv免费观看入口亚洲| 日韩免费电影在线观看| 亚洲男人av在线| 97成人精品视频在线观看| 国产成一区二区| 国产一区二区欧美日韩| 国产日韩欧美在线播放|