偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

JVM優(yōu)化:垃圾回收概述

開發(fā) 前端
“虛引用”顧名思義,它是最弱的一種引用關(guān)系。如果一個(gè)對象僅持有虛引用,在任何時(shí)候都可能被垃圾回收器回 收。虛引用主要用來跟蹤對象被垃圾回收器回收的活動(dòng)。

一、什么是垃圾回收

說起垃圾收集(Garbage Collection, 下文簡稱GC) , 有不少人把這項(xiàng)技術(shù)當(dāng)作Java語言的伴生產(chǎn)物。 事實(shí)上, 垃圾收集的歷史遠(yuǎn)遠(yuǎn)比Java久遠(yuǎn), 在1960年誕生于麻省理工學(xué)院的Lisp是第一門開始使 用內(nèi)存動(dòng)態(tài)分配和垃圾收集 技術(shù)的語言。垃圾收集需要完成的三件事情: 哪些內(nèi)存需要回收? 什么時(shí)候回收? 如何回收?

二、Java垃圾回收的優(yōu)缺點(diǎn)

優(yōu)點(diǎn):

a.不需要考慮內(nèi)存管理,

b.可以有效的防止內(nèi)存泄漏,有效的利用可使用的內(nèi)存,

c.由于有垃圾回收機(jī)制,Java中的對象不再有"作用域"的概念,只有對象的引用才有"作用域"

缺點(diǎn):

java開發(fā)人員不了解自動(dòng)內(nèi)存管理, 內(nèi)存管理就像一個(gè)黑匣子,過度依賴就會(huì)降低我們解決內(nèi)存溢出/內(nèi)存泄漏等問題 的能力。

三、判斷對象是否存活 - 引用計(jì)數(shù)算法

引用計(jì)數(shù)算法可以這樣實(shí)現(xiàn):給每個(gè)創(chuàng)建的對象添加一個(gè)引用計(jì)數(shù)器,每當(dāng)此對象被某個(gè)地方引用時(shí),計(jì)數(shù)值+1, 引用失效時(shí)-1,所以當(dāng)計(jì)數(shù)值為0時(shí)表示對象已經(jīng)不能被使用。引用計(jì)數(shù)算法大多數(shù)情況下是個(gè)比較不錯(cuò)的算法, 簡單直接,也有一些著名的應(yīng)用案例但是對于Java虛擬機(jī)來說,并不是一個(gè)好的選擇,因?yàn)樗茈y解決對象直接相 互循環(huán)引用的問題。

優(yōu)點(diǎn): 實(shí)現(xiàn)簡單,執(zhí)行效率高,很好的和程序交織。

缺點(diǎn): 無法檢測出循環(huán)引用。

譬如有A和B兩個(gè)對象,他們都互相引用,除此之外都沒有任何對外的引用,那么理論上A和B都可以被作為垃 圾回收掉,但實(shí)際如果采用引用計(jì)數(shù)算法,則A、B的引用計(jì)數(shù)都是1,并不滿足被回收的條件,如果A和B之 間的引用一直存在,那么就永遠(yuǎn)無法被回收了

四、判斷對象是否存活-可達(dá)性分析算法

在主流的商用程序語言如Java、C#等的主流實(shí)現(xiàn)中,都是通過可達(dá)性分析(Reachability Analysis)來判斷對象是否存 活的。此算法的基本思路就是通過一系列的“GC Roots”的對象作為起始點(diǎn),從起始點(diǎn)開始向下搜索到對象的路徑。 搜索所經(jīng)過的路徑稱為引用鏈(Reference Chain),當(dāng)一個(gè)對象到任何GC Roots都沒有引用鏈時(shí),則表明對象“不可 達(dá)”,即該對象是不可用的。

在Java語言中,可作為GC Roots的對象包括下面幾種:

  • 棧幀中的局部變量表中的reference引用所引用的對象
  • 方法區(qū)中static靜態(tài)引用的對象
  • 方法區(qū)中final常量引用的對象
  • 本地方法棧中JNI(Native方法)引用的對象
  •  Java虛擬機(jī)內(nèi)部的引用, 如基本數(shù)據(jù)類型對應(yīng)的Class對象, 一些常駐的異常對象(比如 NullPointExcepiton、 OutOfMemoryError) 等, 還有系統(tǒng)類加載器。
  • 所有被同步鎖(synchronized關(guān)鍵字) 持有的對象。
  • 反映Java虛擬機(jī)內(nèi)部情況的JMXBean、 JVMTI中注冊的回調(diào)、 本地代碼緩存等。

五、JVM之判斷對象是否存活

finalize()方法最終判定對象是否存活:

即使在可達(dá)性分析算法中判定為不可達(dá)的對象, 也不是“非死不可”的, 這時(shí)候它們暫時(shí)還處于“緩 刑”階段, 要真 正宣告一個(gè)對象死亡, 至少要經(jīng)歷兩次標(biāo)記過程:

第一次標(biāo)記:

如果對象在進(jìn)行可達(dá)性分析后發(fā)現(xiàn)沒有與GC Roots相連接的引用鏈, 那它將會(huì)被第一次標(biāo)記, 隨后進(jìn)行一次篩 選, 篩選的條件是此對象是否有必要執(zhí)行finalize()方法。

沒有必要:

假如對象沒有覆蓋finalize()方法, 或者finalize()方法已經(jīng)被虛擬機(jī)調(diào)用過, 那么虛擬機(jī)將這兩種情況都視為“沒有必 要執(zhí)行”。

有必要:

如果這個(gè)對象被判定為確有必要執(zhí)行finalize()方法, 那么該對象將會(huì)被放置在一個(gè)名為F-Queue的 隊(duì)列之中, 并在 稍后由一條由虛擬機(jī)自動(dòng)建立的、 低調(diào)度優(yōu)先級的Finalizer線程去執(zhí)行它們的finalize() 方法。 finalize()方法是對 象 逃脫死亡命運(yùn)的最后一次機(jī)會(huì), 稍后收集器將對F-Queue中的對象進(jìn)行第二次小規(guī)模的標(biāo)記, 如果對 象要在 finalize()中成功拯救自己——只要重新與引用鏈上的任何一個(gè)對象建立關(guān)聯(lián)即可, 譬如把自己 (this關(guān)鍵字) 賦值 給某個(gè)類變量或者對象的成員變量, 那在第二次標(biāo)記時(shí)它將被移出“即將回收”的集 合; 如果對象這時(shí)候還沒有逃 脫, 那基本上它就真的要被回收了。

六、再談引用

在JDK1.2以前,Java中引用的定義很傳統(tǒng): 如果引用類型的數(shù)據(jù)中存儲的數(shù)值代表的是另一塊內(nèi)存的起始地址,就 稱這塊內(nèi)存代表著一個(gè)引用。這種定義有些狹隘,一個(gè)對象在這種定義下只有被引用或者沒有被引用兩種狀態(tài)。 我 們希望能描述這一類對象: 當(dāng)內(nèi)存空間還足夠時(shí),則能保存在內(nèi)存中;如果內(nèi)存空間在進(jìn)行垃圾回收后還是非常緊 張,則可以拋棄這些對象。很多系統(tǒng)中的緩存對象都符合這樣的場景。 在JDK1.2之后,Java對引用的概念做了擴(kuò) 充,將引用分為 強(qiáng)引用(Strong Reference) 、 軟引用(Soft Reference) 、 弱引用(Weak Reference) 和 虛引 用(Phantom Reference) 四種,這四種引用的強(qiáng)度依次遞減。

1、強(qiáng)引用

強(qiáng)引用是使用最普遍的引用。如果一個(gè)對象具有強(qiáng)引用,那垃圾回收器絕不會(huì)回收它。當(dāng)內(nèi)存空間不足,Java虛擬 機(jī)寧愿拋出OutOfMemoryError錯(cuò)誤,使程序異常終止,也不會(huì)靠隨意回收具有強(qiáng)引用的對象來解決內(nèi)存不足的問 題。 ps:強(qiáng)引用其實(shí)也就是我們平時(shí)A a = new A()這個(gè)意思。

2、軟引用

如果一個(gè)對象只具有軟引用,則內(nèi)存空間足夠,垃圾回收器就不會(huì)回收它;如果內(nèi)存空間不足了,就會(huì)回收這些對 象的內(nèi)存。只要垃圾回收器沒有回收它,該對象就可以被程序使用。 軟引用可以和一個(gè)引用隊(duì)列 (ReferenceQueue)聯(lián)合使用,如果軟引用所引用的對象被垃圾回收器回收,Java虛擬機(jī)就會(huì)把這個(gè)軟引用加入到 與之關(guān)聯(lián)的引用隊(duì)列中。

3、弱引用

用來描述那些非必須對象, 但是它的強(qiáng)度比軟引用更弱一些, 被弱引用關(guān)聯(lián)的對象只能生存到下一次垃圾收集發(fā) 生為止。 當(dāng)垃圾收集器開始工作, 無論當(dāng)前內(nèi)存是否足夠, 都會(huì)回收掉只 被弱引用關(guān)聯(lián)的對象。 在JDK 1.2版之 后提供了WeakReference類來實(shí)現(xiàn)弱引用。 弱引用可以和一個(gè)引用隊(duì)列(ReferenceQueue)聯(lián)合使用,如果弱引用 所引用的對象被垃圾回收,Java虛擬機(jī)就會(huì)把這個(gè)弱引用加入到與之關(guān)聯(lián)的引用隊(duì)列中。

弱引用與軟引用的區(qū)別在于: ①更短暫的生命周期; ②一旦發(fā)現(xiàn)了只具有弱引用的對象,不管當(dāng)前內(nèi)存空間足夠與否,都會(huì)回收它的內(nèi)存。

4、虛引用

“虛引用”顧名思義,它是最弱的一種引用關(guān)系。如果一個(gè)對象僅持有虛引用,在任何時(shí)候都可能被垃圾回收器回 收。虛引用主要用來跟蹤對象被垃圾回收器回收的活動(dòng)。

虛引用與軟引用和弱引用的一個(gè)區(qū)別在于: ①虛引用必須和引用隊(duì)列 (ReferenceQueue)聯(lián)合使用。 ②當(dāng)垃圾回收器準(zhǔn)備回收一個(gè)對象時(shí),如果發(fā)現(xiàn)它還有虛引用,就會(huì)在回收對象的內(nèi)存之前,把這個(gè)虛引用加入到 與之 關(guān)聯(lián)的引用隊(duì)列中。

責(zé)任編輯:武曉燕 來源: 今日頭條
相關(guān)推薦

2022-01-20 10:34:49

JVM垃圾回收算法

2017-08-04 10:53:30

回收算法JVM垃圾回收器

2022-03-21 11:33:11

JVM垃圾回收器垃圾回收算法

2021-11-05 15:23:20

JVM回收算法

2009-12-30 10:14:29

JVM垃圾回收

2010-09-25 15:33:19

JVM垃圾回收

2022-06-22 09:54:45

JVM垃圾回收Java

2010-09-27 09:01:26

JVM分代垃圾回收

2010-09-26 16:42:04

JVM內(nèi)存組成JVM垃圾回收

2010-09-16 15:10:24

JVM垃圾回收機(jī)制

2017-04-25 14:39:55

JVM內(nèi)存Java

2010-09-25 15:26:12

JVM垃圾回收

2009-12-25 16:15:31

JVM垃圾回收算法

2022-06-07 07:10:40

MinorGCMajorGCFullGC

2022-06-10 07:13:29

JVM垃圾回收

2021-10-05 20:29:55

JVM垃圾回收器

2024-03-11 16:27:02

垃圾回收器JVM

2012-01-09 16:53:36

JavaJVM

2010-09-26 13:29:46

JVM垃圾回收

2010-01-06 09:28:08

JVM分代垃圾回收
點(diǎn)贊
收藏

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