1. 程式人生 > >GC演算法介紹及工作原理和優缺點

GC演算法介紹及工作原理和優缺點

一.GC定義與作用

GC就是垃圾回收機制的簡寫 GC可以找到記憶體中的垃圾,並釋放和回收空間,GC裡的垃圾是什麼 如下圖所示:

GC演算法是什麼:GC是一種機制,垃圾回收器完成具體的工作 工作的內容就是查詢垃圾釋放空間,回收空間演算法就是工作時查詢和回收

所遵循的規則。常見GC演算法有引用計數,標記清除,標記整理,分代回收。

二.GC演算法的工作原理及優缺點

1.引用計數演算法實現原理

核心思想:設定引用數,判斷當前引用數是否為0 引用關係改變時修改引用數字,比如有一個物件指向它 他的引用計數+1 多個物件

引用,引用計數累加引用計數累加,當沒有物件引用時引用計數為0 GC立即進行回收,下面通過程式碼來分析下工作原理:

上述程式碼中,從全域性角度出發,user1,user2及meauList 計數都不為0 ,num1和num2,當函式fn()執行完成後全域性作用訪問不到num1

和num2,所以說num1和num2計數為0,會被GC回收。當所有的程式碼執行完成後,user1和user2也不為0,因為被meauList陣列中引

用,所以計數+1

2.引用計數演算法的優缺點

優點:

最大限度的減少程式暫停,記憶體有一定的上限,當記憶體即將爆滿時,引用計數會立馬找到數值為0的計數空間對其進行釋放,這樣就保

證了記憶體不會有暫滿的時候。

缺點:

1.時刻監聽著引用數值是否需要修改,時間開銷比較大

2.無法回收迴圈引用的物件 具體用程式碼實現如下圖所示:

如上圖所示:當fn執行完成後,obj1和obj2都是區域性變數,按說是要被回收的,但是後面obj1.name=obj2,obj2.name=obj1有著互相被

引用的關係,所以說數值並不為0,就沒有辦法對這兩個空間進行回收了,從而造成了記憶體空間的浪費,這也就是物件之間的迴圈引

用。

3.標記清除演算法實現原理

核心思想:分標記和清除 二個階段完成,

第一個階段 遍歷所有物件找標記活動物件(可達物件)。

第二個階段 把那些沒有被標記的物件進行清除 同時也會抹掉第一個階段的標記 便於我們GC下次正常的工作把回收的空間放到一個

空閒列表的上面,方便我們的程式後續直接在這裡申請空間。

用圖示方式進行舉例說明:

如上圖所示A B C為全域性變數,D E被A和C引用 所以ABCDE都是可達物件 第一步會被標記上,第二階段 查詢沒有被標記的物件 如上

圖中的a1和b1為未標記的,全域性作用域內查詢不到,則會被GC清除掉。

4.標記清除演算法的優缺點

優點:

可以回收迴圈引用的物件,如上圖所示,比如a1和b1為函式內部的區域性變數,就失去了與全域性global的連線,不可達的物件在標記階段就

不可標記,在第二個階段會被清除,而在引用計數演算法中有引用的關係 所以計數不為0 所以不能被清除

缺點:

如下圖所示,我們從根去查詢 紅色區域為一個可達物件,左右兩側分別為兩個不可達的物件,在第二輪的清除操作中會被清除掉,再

把剩餘空間新增到空閒列表之上,這就有一個問題了,比如最左側的是B物件,中間的可達物件為A物件,最右側的為C物件,BC物件

儲存語言資訊,比如大小和地址,我們稱之為頭。還有一個我們存放資料的稱之為域,看上去是釋放了3個域的大小,但是中間間隔著

A物件,其實他們還是分散的,也就是地址不連續,如果說操那個申請列表申請1.5個域大小的空間,左側超出了浪費,右側直接就不夠

,稱之為空間的碎片化。

5.標記整理演算法的實現原理

標記整理可以看做標記清除的一個增強操作,標記階段的操作與標記清除一致,第二個階段在標記清除階段會先執行整理,移動對

象位置,這樣可以避免分散的地址的不連續的小空間,如下圖所示:

相關推薦

GC演算法介紹工作原理優缺點

一.GC定義與作用 GC就是垃圾回收機制的簡寫 GC可以找到記憶體中的垃圾,並釋放和回收空間,GC裡的垃圾是什麼 如下圖所示: GC演算法是什麼:GC是一種機制,垃圾回收器完成具體的工作 工作的內容就是查詢垃圾釋放空間,回收空間演算法就是工作時查詢和回收 所遵循的規則。常見GC演算法有引用計數,標記清除,

Vlan與VTP的介紹工作原理

vlan vtp VLAN一個VLAN =一個廣播域 = 邏輯網段 (子網) 每個邏輯的VLAN就象一個獨立的物理橋交換機上的每一個端口都可以分配給不同的VLAN默認的情況下,所有的端口都屬於VLAN1(Cisco)每個邏輯的VLAN就象一個獨立的物理橋同一個VLAN可以跨越多個交換機主幹功能支持多個

SpringMvc 極速快-三平臺開發工作原理作用

上下 struts ont 通用 tex 環境 返回 子郵件 iba 極速快-三平臺開發Q1446595067工作原理: 1.springmvc請所有的請求都提交給DispatcherServlet,它會委托應用系統的其他模塊負責負責對請求進行真正的處理工作。

SpringMvc Spring 工作原理作用

復雜 script 人員 部分 開發 cit 組件 上下 校驗和 1.springmvc請所有的請求都提交給DispatcherServlet,它會委托應用系統的其他模塊負責負責對請求進行真正的處理工作。   2.DispatcherServlet查詢一個或多個Ha

AD9854原理圖、PCB設計原始檔,AD9854的簡要介紹使用心得一些建議——【電路模組使用心得1】

原理圖: 鄙人習慣在原理圖上將各種細節標註清楚~ PCB : 3D封裝看著舒服~ 晶片主要特點: 1. 高達300MHz的系統時鐘; 2. 能輸出一般調製訊號,FSK,BPSK,PSK,CHIRP,AM等; 3. 100MHz時具有80dB的信噪比; 4.

什麼是閉包?關於閉包的工作原理優缺點、使用場景對頁面的影響解析

閉包(closure)是javascript的一大難點,也是它的特色。很多高階應用都要依靠閉包來實現。 1、變數作用域 要理解閉包,首先要理解javascript的特殊的變數作用域。 變數的作用域無非就兩種:全域性變數和區域性變數。 javascript語言的

什麼是閉包?閉包的工作原理優缺點、使用場景對頁面的影響

參考部落格:http://www.cnblogs.com/cxying93/p/6103375.html 閉包(closure)是javascript的一大難點,也是它的特色。很多高階應用都要依靠閉包

struts2中struts.xmlweb.xml檔案解析工作原理

web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app id="WebApp_9" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmln

Lombok外掛介紹、使用方法、工作原理總結 侵立刪

轉自:https://www.cnblogs.com/heyonggang/p/8638374.html 1 Lombok背景介紹 官方介紹如下: Project Lombok makes java a spicier language by adding 'handlers' that

[掃盲]介紹一下GFW的工作原理封鎖技術

GFW是Great Fire Wall的縮寫,即“長城防火牆”。這個工程由若干個部分組成,實現不同功能。長城防火牆主要指TG監控和過濾網際網路內容的軟硬體系統,由伺服器和路由器等裝置,加上相關的應用程式所構成。 首先,需要強調的是,由於中國網路審查廣泛,中國國內含有“不合適”內容的的網站,會受到政府直接的行

Struts2框架實現原理工作流程

Struts2為提供了一個為使用者快速構建應用程式的平臺。 Struts2是基於OpenSymphony的網路工程框架。 Struts2實現模型檢視控制器(MVC)設計模式。 在Struts2的模型、檢視和控制器中分別實現了Action,result和FilterDispa

Redux原理工作流程使用方法(四)

使用Redux目的: 在react中元件與元件之間的通訊很麻煩,於是借用redux進行第三方的通訊 通過把資料儲存在公共區域store裡,實現各個元件間快速通訊 一、Redux結構圖 Redux的三個非常重要的組成部分: action reducer s

Docker的概念剖析原理特點

應用程序 服務器 臺電腦 數據庫 虛擬機 一、docker的簡介: 應用容器是個啥樣子呢,一個做好的應用容器長的就像一個裝好了一組特定應用的虛擬機一樣,比如我現在想用mysql數據庫,我直接找個裝好了的MySQL的容器就可以了,想用的時候一運行容器,MySQL服務就起來了,就可以使

springMVC 的工作原理機制、配置

spring mvc+my batis kafka dubbo+zookeerper restful redis分布式緩存 工作原理下面的是springMVC的工作原理圖:1、客戶端發出一個http請求給web服務器,web服務器對http請求進行解析,如果匹配DispatcherServle

Struts2工作原理執行流程圖

過濾器 map filters play servle 同時 cati 通過 spa 在struts2的應用中,從用戶請求到服務器返回相應響應給用戶端的過程中,包含了許多組件如:Controller、ActionProxy、ActionMapping、Configurati

Servlet的生命周期工作原理

response 繼承 ice ons 接口 五個 service() 代碼 初始   Servlet的生命周期分為三個階段:   1,初始化階段,調用init()方法;   2,響應客戶端請求階段,調用service()方法   2,終止階段,調用destory()方法

(轉)Java 詳解 JVM 工作原理流程

移植 獲得 代碼 適配 調用 tac 階段 main方法 等待 作為一名Java使用者,掌握JVM的體系結構也是必須的。說起Java,人們首先想到的是Java編程語言,然而事實上,Java是一種技術,它由四方面組成:Java編程語言、Java類文件格式、Java虛擬機和Ja

mysql分區表的原理優缺點

得到 class 平分 訪問 所在 range分區 作用 全文索引 不同的 1.分區表的原理 分區表是由多個相關的底層表實現,這些底層表也是由句柄對象表示,所以我們也可以直接訪問各個分區,存儲引擎管理分區的各個底層表和管理普通表一樣(所有的底層表都必須使用相同的存儲引擎

CSS布局模型 之 浮動模型(浮動的工作原理清除浮動技巧?)

浮動 浮動模型 工作原理 浮動的工作原理浮動是讓某元素脫離文檔流,在浮動框之前和之後的非定位元素會當它不存在一樣,可能沿著它的另一側垂直流動,但都為其騰出空間,塊級元素也不例外(被浮動元素占據了部分行空間的塊級元素,仍然被看作是占據了一整行,只不過是被浮動元素占據的那部分空間無法利用罷了)。浮動的

Java 詳解 JVM 工作原理流程

str literal 狀態 應用 流程 href ctu 局部變量 自定義 作為一名Java使用者,掌握JVM的體系結構也是必須的。說起Java,人們首先想到的是Java編程語言,然而事實上,Java是一種技術,它由四方面組成:Java編程語言、Java類文件格式、Jav