欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

JVM垃圾回收機制總結(2) :基本算法概述

系統 1611 0

1、引用計數收集器 (Reference Counting)

?

????? 引用計數是垃圾收集的早期策略。在這種方法中, 堆中每一個對象都有一個引用計數。一個對象被創建了,并且指向該對象的引用被分配給一個變量,這個對象的引用計數被置為1。當任何其他變量被賦值為對這個對象的引用時,計數加1。當一個對象的引用超過了生存期或者被設置一個新的值時,對象的引用計數減1。任何引用計數為0的對象可以被當作垃圾收集。當一個對象被垃圾收集的時候,它引用的任何對象計數值減1。 在這種方法中,一個對象被垃圾收集后可能導致后續其他對象的垃圾收集行動。
????? 這種方法的好處是,引用計數收集器可以很快地執行,交織在程序的運行之中。這個特性對于程序不能被長時間打斷的實時環境很有利。壞處就是,引用計數無法檢測出循環(即兩個或者更多的對象互相引用)。 循環的例子如,父對象有一個對子對象的引用,子對象又反過來引用父對象。這些對象永遠都不可能計數為0,就算它們已經無法被執行程序的根對象可觸及。還有一個壞處就是,每次引用計數的增加或者減少都帶來額外開銷。
????? 因為引用計數方法固有的缺陷,這種技術現在已經不為人所接受?,F實生活中所遇到的Java虛擬機更有可能在垃圾收集堆中使用追蹤算法。

?

2、標記-清除收集器(Mark-Sweep)或追蹤回收器( Tracing Collector

?

???? ? 跟蹤收集器追蹤從根結點開始的對象引用圖。在追蹤過程中遇到的對象以某種方式打上標記。 總的來說,要么在對象本身設置標記,要么用一個獨立的位圖來設置標記。 當追蹤結束時,未被標記的對象就知道是無法觸及的,從而可以被收集。
????? 基本的追蹤算法被稱作“標記并清除”。這個名字指出垃圾收集過程的兩個階段。在標記階段,垃圾收集器遍歷引用樹,標記每一個遇到的對象。在清除階段,未被標記的對象被釋放了,使用的內存被返回到正在執行的程序。在Java虛擬機中,清除步驟必須包括對象的終結。下面的圖示顯示了這種收集器的收集過程:

?

垃圾回收器回收了堆中的對象之后,自然會在堆內存中遺留下一些內存空閑的間隙,下面就是完成上圖所示的標記-清除垃圾回收之后的堆內存變化,我們能很清楚的看到這一點。

?

下面我們就要討論如何對付這些回收對象后產生的內存碎塊的垃圾回收器。

?

3、基于標記-清除的壓縮收集器

????? 壓縮方法把活動的對象越過空閑區滑動到堆的一端,在這個過程中,堆的另一端出現一個大的連續空閑區。所有被移動的對象的引用也被更新,指向新的位置。
????? 更新被移動的對象的引用有時候通過一個間接對象引用層可以變得更簡單。不直接引用堆中的對象,對象的引用實際上指向一個對象句柄表。對象句柄才指向堆中對象的實際位置。當對象被移動了,只有這個句柄需要被更新為新位置。所有的程序中對這個對象的引用仍然指向這個具有新值的句柄,而句柄本身沒有移動。這種方法簡化了消除堆碎塊的工作,但是每一次對象訪問都帶來了性能損失。

?

4、拷貝收集器

????? 一般的拷貝算法被稱為“停止并拷貝”、,在這個方案中,堆被分為兩個區域,任何時候都只使用其中的一個區域。對象在同一個區域中分配,直到這個區域被耗盡。此時,程序執行被中止、堆被遍歷,遍歷時遇到的活動對象被拷貝到另外一個區域。當停止和拷貝過程結束時。程序恢復執行。內存將從新的堆區域中分配,直到它也被用盡。那時程序將再次中止。遍歷堆、活動對象又被拷貝回原來的區域‘這種方一法帶來的代價就是,對于指定大小的堆來說需要兩倍大小的內存,因為任何時候都只能使用其中的一半。下圖就是一個停止并拷貝的過程:

?

5、按代收集器(Generational Collector)?

????? 簡單的停止并拷貝收集器的缺點是每一次收集時,所有的活動對象都必須被拷貝。大部分語言的大多數程序都有以下特點,如果我們全面考慮這些,拷貝算法的這個缺點足可以被改進的。

????? (1) 大多數程序創建的大部分對象都具有很短的生命期。
????? (2)大多數程序都創建一些具有非常長生命周期的對象。

????? 簡單的拷貝收集器浪費效率的一個上要原因就是、它們每次都把這些生命周期很長的對象來回拷貝,消耗大量時間。???

????? 按代收集的收集器通過把對象按照壽命來分組解決這個效率低下的問題,更多地收集那些短暫出現的年幼對象,而非壽命較長的對象。在這種方法里,堆被劃分成兩個或者更多的子堆,
每一個子堆為一“代”對象服務。最年幼的那一代進行最頻繁的垃圾收集。因為大多數對象都是短促出現的,只有很小部分的年幼對象可以在它們經歷第一次收集后還存活。如果一個最年幼的對象經歷了好幾次垃圾收集后仍然存活,那么這個對象就成長為壽命更高的一代:它被轉移到另外一個子堆中去。年齡更高的每一代的收集都沒有年徑的那一代來得頻繁。每當對象在它所屬的年齡層(代)中變得成熟(逃過了多次垃圾收集)之后,它們就被轉移到更高的年齡層中去。

????? 按代進行的收集技術除了可以應用于拷貝算法,也可以應用于標記并清除算法。不管在哪種情況下,把堆按照對象年齡層分解都可以提高最基本的垃級收集算法的性能。

?

?

總結

????? 引用計數收集器 基本上已經不被使用了。 標記-清除收集器 是目前尋找垃圾對象的主流策略,但是它對回收后產生的內存碎片卻無能為力,因此我們必須采用一些合并空閑內存的算法,這就產生了基于標記-清除的 壓縮收集器 拷貝收集器 。而基于性能原因,拷貝收集器是比較受歡迎的。但是它有一個比較大的弱點:對于壽命較長的對象會不停的拷貝,這就付出了不必要的代價。因此, 按代收集器 的出現 改進了這一性能。而我們的JDK中的JVM就采用了按代收集策略。? ?

?

?

垃圾回收的若干問題


(1) 垃圾回收從哪里開始??

?

?? ?? 上面說到的“引用計數”法,通過統計控制生成對象和刪除對象時的引用數來判斷。垃圾回收程序收集計數為0的對象即可。但是這種方法無法解決循環引用。所 以,后來實現的垃圾判斷算法中,都是從程序運行的根節點出發,遍歷整個對象引用,查找存活的對象。那么在這種方式的實現中, 垃圾回收從哪兒開始的呢 ? 即,從哪兒開始查找哪些對象是正在被當前系統使用的。上面分析的堆和棧的區別,其中棧是真正進行程序執行地方,所以要獲取哪些對象正在被使用,則需要從 Java棧開始。同時,一個棧是與一個線程對應的,因此,如果有多個線程的話,則必須對這些線程對應的所有的棧進行檢查。

?? ??? 同時,除了棧外,還有系統運行時的寄存器等,也是存儲程序運行數據的。這樣,以棧或寄存器中的引用為起點,我們可以找到堆中的對象,又從這些對象找到對 堆中其他對象的引用,這種引用逐步擴展,最終以null引用或者基本類型結束,這樣就形成了一顆以Java棧中引用所對應的對象為根節點的一顆對象樹,如 果棧中有多個引用,則最終會形成多顆對象樹。在這些對象樹上的對象,都是當前系統運行所需要的對象,不能被垃圾回收。而其他剩余對象,則可以視為無法被引 用到的對象,可以被當做垃圾進行回收。

??????? 因此, 垃圾回收的起點是一些根對象(java棧, 靜態變量, 寄存器...) 。而最簡單的Java棧就是Java程序執行的main函數。這種回收方式,也是上面提到的“標記-清除”的回收方式。

(2) 如何處理碎片??

?? 由于不同Java對象存活時間是不一定的,因此,在程序運行一段時間以后,如果不進行內存整理,就會出現零散的內存碎片。碎片最直接的問題就是會導致無法 分配大塊的內存空間,以及程序運行效率降低。所以,在上面提到的基本垃圾回收算法中, 基于標記-清除的壓縮收集器和拷貝收集器 ,都可以解決碎片的問題。

(3) 如何解決同時存在的對象創建和對象回收問題??

?? ?? 垃圾回收線程是回收內存的,而程序運行線程則是消耗(或分配)內存的, 一個回收內存,一個分配內存 ,從這點看,兩者是矛盾的。因此,在現有的垃圾回收方式中,要進行垃圾回收前,一般都需要暫停整個應用(即:暫停內存的分配),然后進行垃圾回收,回收完成后再繼續應用。這種實現方式是最直接,而且最有效的解決二者矛盾的方式。

????? 但是 這種方式有一個很明顯的弊端,就是當堆空間持續增大時,垃圾回收的時間也將會相應的持續增大,對應應用暫停的時間也會相應的增大 。 一些對相應時間要求很高的應用,比如最大暫停時間要求是幾百毫秒,那么當堆空間大于幾個G時,就很有可能超過這個限制,在這種情況下,垃圾回收將會成為系統運行的一個瓶頸。為解決這種矛盾,有了 并發垃圾回收算法 ,使用這種算法,垃圾回收線程與程序運行線程同時運行。在這種方式下,解決了暫停的問題,但是因為需要在新生成對象的同時又要回收對象,算法復雜性會大大增加,系統的處理能力也會相應降低,同時,“碎片”問題將會比較難解決。

?

JVM垃圾回收機制總結(2) :基本算法概述


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦?。。?/p>

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 色噜噜噜噜噜在线观看网站 | 免费看淫片| 色综合久久天天综合绕观看 | 成人亚洲欧美日韩在线 | 毛片入口 | 大看蕉a在线观看 | 妞干网在线观看 | 中文字幕日韩欧美 | 欧美日韩高清不卡免费观看 | 日韩高清中文字幕 | 国产精品欧美一区二区三区不卡 | 婷婷的久久五月综合先锋影音 | 国产一级大片在线观看 | 久久9999| 久久久久久久成人 | 一区二区三区日本在线观看 | 久热草视频 | 精品一区视频 | 亚洲高清视频一区二区 | 欧美精品一区在线发布 | 国产伦精品一区二区三区精品视频 | 天天摸天天揉天天碰天天弄 | 欧美理论视频 | 玖草在线播放 | 黄色网址免费入口 | 日本黄色中文字幕 | 青草青草久热精品视频在线网站 | 亚洲AV国产成人精品区三上 | 精品粉嫩aⅴ一区二区三区四区 | 国产成人精品免费视频大全可播放的 | 麻豆传媒视频入口 | 国产一起色一起爱 | 国产精品网址 | 久久久国产精品 | 波多野结衣中文字幕2022免费 | 狠久久| 久草在线视频资源站 | 久久久久久久久淑女av国产精品 | 欧美色综合 | 国产高清www免费视频 | 色欲天天婬色婬香视频综合网 |