垃圾回收算法_垃圾回收算法有哪些

垃圾檢測通常通過建立一個根對象的集合以及建立一個從這些根對象開始能夠觸及的對象集合來實現。如果正在執行的程序可以訪問到根對象和某個對象之間存在引用路徑,這個對象就是可觸及的。對于程序來說,根對象總是可以訪問的。從這些根對象開始,任何可以被觸及的對象都被認為是“活動”的對象。無法被觸及的對象被認為是垃圾。

虛擬機的根對象集合根據實現不同而不同,包含局部變量中的對象引用和棧幀的操作數棧(以及類變量中的對象引用)、被加載的類的常量池中的對象引用(比如字符串)、傳遞到本地方法中的沒有被本地方法釋放的對象引用。任何被根對象引用的對象都是可觸及的,從而是活動的,任何被活動的對象引用的對象都是可觸及的,程序可以訪問任何可觸及的對象,所以這些對象應用留在堆中,而對于那些不可觸及的對象,程序沒有辦法訪問它們,應該被收集和釋放。

區分活動對象和垃圾的兩個基本方法是引用計數和跟蹤。引用計數垃圾收集器通過為堆中的每個對象保存一個計數來區分活動對象和垃圾對象。這個計數記錄下這個對象的引用次數。跟蹤垃圾收集器實際上追蹤從根節點開始的引用圖。在追蹤中遇上的對象以某種方式打上標記,當追蹤結束時,沒有被打上標記的對象就被判定是不可觸及的,可以被當作垃圾收集。

==引用計數算法==

給對象添加一個引用計數器,每當一個地方引用它時,數據器加1;當引用失效時,計數器減1;計數器為0的即可被回收。

  • 優點:實現簡單,判斷效率高
  • 缺點:很難解決對象之間的相互循環引用(objA.instance = objB; objB.instance = objA)的問題,所以java語言并沒有選用引用計數法管理內存

==根搜索算法==

Java和C#都是使用根搜索算法來判斷對象是否存活。通過一系列的名為“GC Root”的對象作為起始點,從這些節點開始向下搜索,搜索所有走過的路徑稱為引用鏈(Reference Chain),當一個對象到GC Root沒有任何引用鏈相連時(用圖論來說就是GC Root到這個對象不可達時),證明該對象是可以被回收的。

在Java中這些對象可以成為GC Root:

  • 虛擬機棧(棧幀中的本地變量表)中的引用對象
  • 方法區中的類靜態屬性引用的對象
  • 方法區中的常量引用對象
  • 本地方法棧中JNI(即Native方法)的引用對象

==標記-清除算法==

標記-清除算法是一種常見的基礎垃圾收集算法,它將垃圾收集分為兩個階段

  • 標記階段:標記出可以回收的對象。
  • 清除階段:回收被標記的對象所占用的空間。

09a936893c735a0196a9468c44d70b54.png

63707281.jpeg

標記-清除算法主要有兩個缺點,一個是標記和清除的效率不高,另一個從圖中就可以看出,就是容易產生大量不連續的內存碎片,碎片太多可能會導致后續沒有足夠的連續內存分配給較大的對象,從而提前觸發新的一次垃圾收集動作。

==復制算法==

為了解決標記-清除算法的效率不高的問題,產生了復制算法。它把內存空間劃分為兩個相等的區域,每次只使用其中一個區域。在垃圾收集時,遍歷當前使用的區域,把存活對象復制到另一個區域中,最后將當前使用的區域的可回收的對象進行回收。

2caaf2599c7b6128c1bc83f356988050.png

90984624.jpeg

這種算法每次都對整個半區進行內存回收,不需要考慮內存碎片的問題,代價就是使用內存為原來的一半。復制算法的效率與存活對象的數目多少有很大的關系,如果存活對象很少,復制算法的效率就會很高。由于絕大多數對象的生命周期很短,并且這些生命周期很短的對象都存于新生代中,所以復制算法被廣泛應用于新生代中。

==標記-壓縮算法==

在新生代中可以使用復制算法,但是在老年代就不能選擇復制算法,因為老年代對象存活率會較高,這樣會有較多的復制操作,導致效率變低。標記-清除算法可以應用在老年代中,但是效率不高,在內存回收后容易產生大量內存碎片。因此就出現了一種標記-壓縮算法,與標記-清除算法不同的是,在標記可回收的對象后將所有存活的對象壓縮到內存的一端,使它們緊湊地排列在一起,然后對邊界以外的內存進行回收,回收后,已用和未用的內存都各自一邊。

a32826beade375495b15f71c6c168fbc.png

94057049.jpeg

標記-壓縮算法解決了標記-清除算法效率低和容易產生大量內存碎片的問題,它被廣泛應用于老年代中。

==分代收集算法==

分代收集算法會結合不同的收集算法來處理不同的空間,因此在學習分代收集算法之前我們首先要了解Java堆區的空間劃分。Java堆區的空間劃分在Java虛擬機中,各種對象的生命周期會有著較大的差別,大部分對象生命周期很短暫,少部分對象生命周期很長,有的甚至與應用程序以及Java虛擬機的運行周期一樣長。因此,應該對不同生命周期的對象采取不同的收集策略,根據生命周期長短將它們放到不同的區域,并在不同的區域采用不同的收集算法,這就是分代的概念。現在主流的Java虛擬機的垃圾收集器都采用分代收集算法。Java堆區基于分代的概念,分為新生代和老年代,其中新生代再細分為Eden空間、From Survivor空間和To Survivor空間。因為Eden空間中的大多數生命周期很短,所以新生代的空間劃分并不是均分的,HotSpot虛擬機默認Eden空間和兩個Survivor空間的所占的比例為8:1。

根據Java堆區的空間劃分,垃圾收集的類型分為兩種,它們分別如下:

  • Minor Collection:新生代垃圾收集。
  • Full Collection:對老年代進行收集,又可以稱作Major Collection,Full Collection通常情況下會伴隨至少一次的Minor Collection,它的收集頻率較低,耗時較長。

當執行一次Minor Collection時,Eden空間的存活對象會被復制到To Survivor空間,并且之前經過一次Minor Collection 并在From Survivor空間存活的仍年輕的對象也會復制到To Survivor空間。有兩種情況Eden空間和From Survivor空間存活的對象不會復制到To Survivor空間, 而是晉升到老年代。一種是存活的對象的分代年齡超過-XX:MaxTenuringThreshold(用于控制對象經歷多少次Minor GC 才晉升到老年代)所指定的閾值。另一種是To Survivor空間容量達到閾值。當所有存活的對象被復制到To Survivor空間,或者晉升到老年代,也就意味著Eden空間和From Survivor空間剩下的都是可回收對象。

這個時候GC執行Minor Collection,Eden空間和From Survivor空間都會被清空,新生代存活的對象都存放在To Survivor空間。接下來將From Survivor空間和To Survivor空間互換位置,也就是此前的From Survivor空間成為了現在的To Survivor空間,每次Survivor空間互換都要保證To Survivor空間是空的,這就是復制算法在新生代中的應用。在老年代則會采用標記-壓縮算法或標記-清除算法。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/455835.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/455835.shtml
英文地址,請注明出處:http://en.pswp.cn/news/455835.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

不錯的電子書下載網站

為什么80%的碼農都做不了架構師?>>> www.jb51.net 電子書質量不錯,雖然是掃描版的,但是都是高清的. vdisk.weibo.com 網盤, 內容很多! 轉載于:https://my.oschina.net/GMT/blog/1188971

GeoHash核心原理解析

原文地址:http://www.cnblogs.com/LBSer/p/3310455.html geohash for php:附件下載geohash.tar.gz 引子 機機是個好動又好學的孩子,平日里就喜歡拿著手機地圖點點按按來查詢一些好玩的東西。某一天機機到北海公園游玩,肚肚餓了&am…

[轉載]流行視頻格式講解

*. MPEG/.MPG/.DAT MPEG也是Motion Picture Experts Group 的縮寫。這類格式包括了 MPEG-1, MPEG-2 和 MPEG-4在內的多種視頻格式。MPEG-1相信是大家接觸得最多的了,因為目前其正在被廣泛地應用在 VCD 的制作和一些視頻片段下載的網絡應用上面,大部分的…

Ajax相關介紹

ajax是什么? AJAX 是與服務器交換數據并更新部分網頁的藝術,在不重新加載整個頁面的情況下。 AJAX 指異步 JavaScript 及 XML(Asynchronous JavaScript And XML)。 AJAX 是一種在 2005 年由 Google 推廣開來的編程模式。 AJAX 不是一種新的…

解決Ubuntu中文件管理器死掉的情況

有時會遇到Ubuntu文件管理器死掉的情況,怎么點擊都沒有反應,這時只需在終端上運行 ps -A | grep nautilus, 查找文件管理器nautilus對應的pid,然后sudokillpid就可以關閉文件管理器進程,隨便點擊一個文件夾就可以重啟文件管理器了…

element table 怎么知道點擊的是第幾行_el-data-table, 讓CRUD更簡單??

基于Vue2.x, element-ui 2.x,以及開源組件el-form-renderer封裝了一個業務組件el-data-table,已在github開源,其目標是:makes restful api crud easily 特點:1. 使用axios自動發送請求2.自帶新增/修改/刪除邏輯(默認新…

Win10無法使用小娜搜索本地應用問題的解決方案

小娜介紹 win10的Cortana小娜是一個功能非常強大的語音和搜索助手,用戶可以通過小娜助手搜索任意的文件和應用軟件,不過有用戶發現win10的小娜搜索不到已安裝的本地軟件,那么win10小娜助手無法搜索本地應用怎么解決呢?下面小編教大…

樣本量

sklearn實戰-乳腺癌細胞數據挖掘(博客主親自錄制視頻教程) https://study.163.com/course/introduction.htm?courseId1005269003&utm_campaigncommission&utm_sourcecp-400000000398149&utm_mediumshare 根據power,effect size,a,決定樣本量 # -*- cod…

【Python】 dict 以key名 去重運算

將日期相同的數據統計在一起 a_count [ {create_time: 2020-03-05, total_len: 1, count_invite: 1}, {create_time: 2020-03-11, total_len: 2, count_invite: 2}, {create_time: 2020-03-18, total_len: 2, count_invite: 2}, {create_time: 2020-03-06, total_len: 1, …

Vue相關知識總結

Vue簡介 Vue是js的一個庫,類似于JQuery Vue當前版本已經發展到2.X版本,并且現在市面上基本使用的都是2.X版本. 現在一些知名的互聯網公司,例如滴滴,美團等,都在大量的使用vue 本段內容主要講解Vue的基本知識和指令,了解vue的基本概念 注意: Vue 不支持 IE8 及以下版本 vue中…

宏塊幀內預測的具體過程

對一個宏塊進行幀內預測的具體過程如下: (1)對于8x8色度塊就選擇一種幀內色度預測模式建立相應的幀內預測塊; (2)按遍歷的方法分別計算4種Intra_16x16幀內預測模式的代價(Rdcost16x16&#xf…

qt獲得 cpu 主頻信息_高主頻有什么用?我們玩了幾款3A大作找到答案

[PConline 雜談]對于熱愛游戲的人來說,能在極致特效下流暢運行喜歡的游戲是一件幸事,因此作為影響游戲運算的CPU重要性不容小視。CPU如何判定?眾所周知,核心數和主頻算是判定一個CPU好壞的主要依據,但大多數CPU產品在高…

解決:關于Git無法提交 index.lock File exists的問題

問題 今天提交代碼時,在一次提交,莫名其妙沒成功后,再次用git commit -a命令時,出現以下錯誤,無論是用git還是TortoiseGit等其他客戶端都會出現以下這個問題。。 錯誤日志 $ git commit -a fatal: Unable to create …

span居中

在父元素中加style"text-align:center"; 比如下面這樣 <head></head><body><div style"width:300px;border:1px red solid;text-align:center;"><span style"width:100px;">測試</span></div></bo…

打造自己的 APP「冰與火百科」(一):分析定位

回想自己最開始學習 Android 的動力&#xff0c;其實很簡單&#xff0c;就是想在手機上看到自己設計的 APP。但是在工作后&#xff0c;一直做的都是「別人」的 APP&#xff0c;偶爾還要做一些自己不太認可的設計和交互&#xff0c;從中獲取到的成就感還不及第一次在手機上看到「…

python爬取有道翻譯

python爬蟲爬取有道翻譯教程 編寫環境 為了寶寶們能夠正確讀懂本教程,在正式開始前,寶寶們需要搭建的環境如下: 連接互聯網的win10電腦,(win7也可以)Google瀏覽器(版本無要求)Python(版本3就可以了),如果沒有安裝的小伙伴可以參考python安裝以及版本檢測requests庫(版本沒啥…

PartitionMotionSearch()

Outline: 1、 CFG文件中有關多參考幀的相關選項 2、 多參考幀涉及到的數據結構和全局變量 3、 保存重建圖像為參考幀 4、 編碼一幀前&#xff0c;設置參考幀列表 5、 多參考幀的使用&#xff08;即參考幀的選擇策略問題&#xff09; 6、 遺留問題 1、CFG文件中有關多參考…

bat 發送post請求_get post 請求

HTTP是一個基于TCP/IP來傳遞數據的通信協議。1.GET和POST請求的區別&#xff1f;a: GET/POST本質上都是TCP鏈接&#xff0c;GET傳body和POST拼參數&#xff0c;理論上都是可行的。b: 實際上HTTP協議對URL長度是沒有限制的&#xff1b;限制URL長度大多數是瀏覽器或者服務器的配置…

Safengine Android so加密

公司讓我找一個可以對android&#xff0c;嵌入式和Linux x86平臺的so庫進行加密的工具&#xff0c;我看搞了兩天這個工具&#xff0c;反正也沒用上&#xff0c;就把教程發出來了 下載地址&#xff1a;http://www.safengine.com/mobile/download.html 使用方法&#xff1a; 我使…

boltdb 學習和實踐

golang boltdb的學習和實踐 1. 安裝 go get github.com/boltdb/bolt 2.創建和啟動數據庫 db, err : bolt.Open("my.db", 0600, nil) 其中open的第一個參數為路徑,如果數據庫不存在則會創建名為my.db的數據庫&#xff0c; 第二個為文件操作&#xff0c;第三個參數是可…