自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

詳細(xì)介紹Java垃圾回收機(jī)制

開發(fā) 后端
本文介紹的是Java垃圾回收機(jī)制。垃圾收集GC(Garbage Collection)是Java語言的核心技術(shù)之一,之前我們曾專門探討過Java 7新增的垃圾回收器G1的新特性,但在JVM的內(nèi)部運(yùn)行機(jī)制上看,Java的垃圾回收原理與機(jī)制并未改變。

垃圾收集GC(Garbage Collection)是Java語言的核心技術(shù)之一,之前我們曾專門探討過Java 7新增的垃圾回收器G1的新特性,但在JVM的內(nèi)部運(yùn)行機(jī)制上看,Java的垃圾回收原理與機(jī)制并未改變。垃圾收集的目的在于清除不再使用的對象。GC通過確定對象是否被活動對象引用來確定是否收集該對象。GC首先要判斷該對象是否是時候可以收集。兩種常用的方法是引用計數(shù)和對象引用遍歷。

引用計數(shù)收集器

引用計數(shù)是垃圾收集器中的早期策略。在這種方法中,堆中每個對象(不是引用)都有一個引用計數(shù)。當(dāng)一個對象被創(chuàng)建時,且將該對象分配給一個變量,該變量計數(shù)設(shè)置為1。當(dāng)任何其它變量被賦值為這個對象的引用時,計數(shù)加1(a = b,則b引用的對象+1),但當(dāng)一個對象的某個引用超過了生命周期或者被設(shè)置為一個新值時,對象的引用計數(shù)減1。任何引用計數(shù)為0的對象可以被當(dāng)作垃圾收集。當(dāng)一個對象被垃圾收集時,它引用的任何對象計數(shù)減1。

優(yōu)點:引用計數(shù)收集器可以很快的執(zhí)行,交織在程序運(yùn)行中。對程序不被長時間打斷的實時環(huán)境比較有利。

缺點: 無法檢測出循環(huán)引用。如父對象有一個對子對象的引用,子對象反過來引用父對象。這樣,他們的引用計數(shù)永遠(yuǎn)不可能為0.

跟蹤收集器

早期的JVM使用引用計數(shù),現(xiàn)在大多數(shù)JVM采用對象引用遍歷。對象引用遍歷從一組對象開始,沿著整個對象圖上的每條鏈接,遞歸確定可到達(dá)(reachable)的對象。如果某對象不能從這些根對象的一個(至少一個)到達(dá),則將它作為垃圾收集。在對象遍歷階段,GC必須記住哪些對象可以到達(dá),以便刪除不可到達(dá)的對象,這稱為標(biāo)記(marking)對象。

下一步,GC要刪除不可到達(dá)的對象。刪除時,有些GC只是簡單的掃描堆棧,刪除未標(biāo)記的未標(biāo)記的對象,并釋放它們的內(nèi)存以生成新的對象,這叫做清除(sweeping)。這種方法的問題在于內(nèi)存會分成好多小段,而它們不足以用于新的對象,但是組合起來卻很大。因此,許多GC可以重新組織內(nèi)存中的對象,并進(jìn)行壓縮(compact),形成可利用的空間。

為此,GC需要停止其他的活動活動。這種方法意味著所有與應(yīng)用程序相關(guān)的工作停止,只有GC運(yùn)行。結(jié)果,在響應(yīng)期間增減了許多混雜請求。另外,更復(fù)雜的 GC不斷增加或同時運(yùn)行以減少或者清除應(yīng)用程序的中斷。有的GC使用單線程完成這項工作,有的則采用多線程以增加效率。

#p#

一些常用的垃圾收集器

(1)標(biāo)記-清除收集器

這種收集器首先遍歷對象圖并標(biāo)記可到達(dá)的對象,然后掃描堆棧以尋找未標(biāo)記對象并釋放它們的內(nèi)存。這種收集器一般使用單線程工作并停止其他操作。并且,由于它只是清除了那些未標(biāo)記的對象,而并沒有對標(biāo)記對象進(jìn)行壓縮,導(dǎo)致會產(chǎn)生大量內(nèi)存碎片,從而浪費(fèi)內(nèi)存。

(2)標(biāo)記-壓縮收集器

有時也叫標(biāo)記-清除-壓縮收集器,與標(biāo)記-清除收集器有相同的標(biāo)記階段。在第二階段,則把標(biāo)記對象復(fù)制到堆棧的新域中以便壓縮堆棧。這種收集器也停止其他操作。

復(fù)制收集器

這種收集器將堆棧分為兩個域,常稱為半空間。每次僅使用一半的空間,JVM生成的新對象則放在另一半空間中。GC運(yùn)行時,它把可到達(dá)對象復(fù)制到另一半空間,從而壓縮了堆棧。這種方法適用于短生存期的對象,持續(xù)復(fù)制長生存期的對象則導(dǎo)致效率降低。并且對于指定大小堆來說,需要兩倍大小的內(nèi)存,因為任何時候都只使用其中的一半。

增量收集器

增量收集器把堆棧分為多個域,每次僅從一個域收集垃圾,也可理解為把堆棧分成一小塊一小塊,每次僅對某一個塊進(jìn)行垃圾收集。這會造成較小的應(yīng)用程序中斷時間,使得用戶一般不能覺察到垃圾收集器正在工作。

分代收集器

復(fù)制收集器的缺點是:每次收集時,所有的標(biāo)記對象都要被拷貝,從而導(dǎo)致一些生命周期很長的對象被來回拷貝多次,消耗大量的時間。而分代收集器則可解決這個問題,分代收集器把堆棧分為兩個或多個域,用以存放不同壽命的對象。JVM生成的新對象一般放在其中的某個域中。過一段時間,繼續(xù)存在的對象(非短命對象)將獲得使用期并轉(zhuǎn)入更長壽命的域中。分代收集器對不同的域使用不同的算法以優(yōu)化性能。

并行收集器

并行收集器使用某種傳統(tǒng)的算法并使用多線程并行的執(zhí)行它們的工作。在多CPU機(jī)器上使用多線程技術(shù)可以顯著的提高java應(yīng)用程序的可擴(kuò)展性。

***,貼出一個非常簡單的跟蹤收集器的例圖,以便大家加深對收集器的理解:

跟蹤收集器的例圖

跟蹤收集器圖例

使用垃圾收集器要注意的地方

下面將提出一些有關(guān)垃圾收集器要注意的地方,垃圾收集器知識很多,下面只列出一部分必要的知識:

(1)每個對象只能調(diào)用finalize( )方法一次。如果在finalize( )方法執(zhí)行時產(chǎn)生異常(exception),則該對象仍可以被垃圾收集器收集。

(2)垃圾收集器跟蹤每一個對象,收集那些不可觸及的對象(即該對象不再被程序引用 了),回收其占有的內(nèi)存空間。但在進(jìn)行垃圾收集的時候,垃圾收集器會調(diào)用該對象的finalize( )方法(如果有)。如果在finalize()方法中,又使得該對象被程序引用(俗稱復(fù)活了),則該對象就變成了可觸及的對象,暫時不會被垃圾收集了。但是由于每個對象只能調(diào)用一次finalize( )方法,所以每個對象也只可能 "復(fù)活 "一次。

(3)Java語言允許程序員為任何方法添加finalize( )方法,該方法會在垃圾收集器交換回收對象之前被調(diào)用。但不要過分依賴該方法對系統(tǒng)資源進(jìn)行回收和再利用,因為該方法調(diào)用后的執(zhí)行結(jié)果是不可預(yù)知的。

(4)垃圾收集器不可以被強(qiáng)制執(zhí)行,但程序員可以通過調(diào)研System.gc方法來建議執(zhí)行垃圾收集。記住,只是建議。一般不建議自己寫System.gc,因為會加大垃圾收集工作量。

到此就介紹完了,希望本文對你有幫助。

【編輯推薦】

  1. 詳細(xì)介紹JAVA和C++區(qū)別
  2. 詳細(xì)介紹JavaScript中的cookie
  3. 分析JAVA的Random類
  4. JAVA開發(fā) 分析JNI標(biāo)準(zhǔn)原理
  5. 談JavaScript中的移除空事件處理程序

 

責(zé)任編輯:于鐵 來源: 網(wǎng)管之家bitsCN.com
相關(guān)推薦

2009-06-23 14:15:00

Java垃圾回收

2011-07-04 16:48:56

JAVA垃圾回收機(jī)制GC

2015-06-04 09:38:39

Java垃圾回收機(jī)

2010-09-25 15:33:19

JVM垃圾回收

2017-03-03 09:26:48

PHP垃圾回收機(jī)制

2017-08-17 15:40:08

大數(shù)據(jù)Python垃圾回收機(jī)制

2010-10-13 10:24:38

垃圾回收機(jī)制JVMJava

2021-11-05 15:23:20

JVM回收算法

2021-05-27 21:47:12

Python垃圾回收

2010-09-25 15:26:12

JVM垃圾回收

2010-09-16 15:10:24

JVM垃圾回收機(jī)制

2010-09-26 14:08:41

Java垃圾回收

2017-06-12 17:38:32

Python垃圾回收引用

2016-08-11 14:26:29

Java垃圾回收機(jī)制內(nèi)存分配

2016-08-11 15:02:54

Java垃圾回收機(jī)制內(nèi)存

2021-12-07 08:01:33

Javascript 垃圾回收機(jī)制前端

2009-12-09 17:28:34

PHP垃圾回收機(jī)制

2024-10-28 13:18:54

2021-02-26 05:24:35

Java垃圾回收

2016-08-11 14:49:34

Java垃圾回收機(jī)制異常
點贊
收藏

51CTO技術(shù)棧公眾號