JVM垃圾回收機制總結

對于垃圾回收機制我先拋出三個問題:

①哪些內存需要回收?

②什么時候回收?

③如何回收?

下面我們主要針對這三個問題來研究JVM GC

一、哪些內存需要回收?

1.JAVA使用可達性分析法來判斷對象是否需要回收。

這個算法的基本思路是通過一系列稱為“GC ROOTS”的對象作為起始點,從這些節點開始向下搜索,搜索所走過的路徑稱為引用鏈,當一個對象到GC ROOTS沒有任何引用鏈的話,則此對象不可用。可回收。

GC ROOTS對象包括以下幾種:

①虛擬機棧(棧幀中的本地變量表)中引用的對象

②方法區中類靜態屬性引用的對象

③方法區中常量引用的對象

④本地方法棧JNI引用的對象

2.對象在作可達性分析后如果沒有與任何GC ROOTS關聯那么將會被標記篩選,如果它覆蓋了finalize()方法則它將會被放置在一個F-Queue隊列中,并由一個Finalizer線程去執行,如果在finalize方法中成功拯救了自己(將this引用賦值給每個類變量或者成員變量),則可避免被回收。但是強烈不建議使用對象的finalize()方法。在這里我只是把我知道的記錄一下。

二、什么時候回收?

1.安全點

程序在執行時并不是在所有地方都能停下來進行GC,只有到達安全點才能暫停。對于Safepoint,需要考慮的問題是如何在GC發生時讓所有線程都跑到最近的安全點再停頓下來。這里有兩種方案可選:

①搶占式中斷

搶占式中斷不需要線程的執行代碼主動去配合,在GC發生時,首先把所有線程全部中斷,如果發現線程中斷的地方不在安全點上,就恢復線程,讓它跑到安全點上。

②主動式中斷

主動式中斷不直接對線程操作,僅僅設置一個標志,各個線程執行時主動去輪詢這個標志,發現中斷標志為真時就自己中斷掛起,輪詢標志和安全點是重合的,另外加上創建對象需要分配內存的地方。

2.安全區域

安全區域是指在一段代碼中,引用關系不會發生變化,在這個區域的任何地方開始GC都是安全的。

線程執行到safe region中的代碼時,首先標識自己進入safe region,那在這段時間里JVM要發起GC時就不用管那些已經標識自己為safe region狀態的線程了。當線程要離開safe region時,檢查系統是否已經完成了根節點枚舉,如果完成了,那線程就繼續執行否則就等待直到可以離開safe region的信號為止。

三、如何回收?

1.回收算法:

1)標記-清除算法

缺點:①效率問題,標記和清除兩個過程的效率都不高;②空間問題,清除后會產生大量不連續的內存碎片,導致大對象無法分配而提前出發GC

2)復制算法

復制算法是將內存分為大小相等的兩塊,每次只是使用其中的一塊。當一塊內存使用完之后,將還存活的對象復制到另一塊內存中,然后清空內存。

缺點:內存容量只使用了一半。

現在的商業虛擬機都采用這種方式來回收新生代。使用一塊eden和兩塊survivor區,eden:survivor=8:1,每次只使用eden和一塊survivor,然后將存活對象復制到另一塊survivor上。

注意,這里我們不能保證每次回收都只有不多于10%的對象存活,當survivor空間不夠時需要依賴其他內存(老年代)進行分配擔保。

3)標記-整理算法

標記過程與標記-清除算法相同,后續不是直接對可回收對象進行清理,而是讓所有存活對象都向一端移動,然后直接清理掉端邊界以外的內存

4)分代收集算法

針對不同的內存區域采用不同的回收算法,比如年輕代采用復制算法,老年代采用標記-清除或者標記-整理算法。

四、垃圾回收器

1.serial收集器

單線程收集器,年輕代采用復制收集算法,老年代采用標記-整理算法

2.ParNew收集器

是Serial收集器的多線程版本

3.Parallel Scavenge收集器

采用復制算法的多線程新生代收集器,與ParNew不同的是,其目的是達到一個可控制的吞吐量。(吞吐量=運行用戶代碼時間/(運行用戶代碼時間+垃圾收集時間))

4.Parallel Old收集器

Parallel Scavenge的老年代版本。

5.CMS收集器

以獲取最短回收時間為目標的收集器,基于標記-清除算法

6.G1收集器

特點:

①并行與并發

②分代收集

G1不需要與其他收集器配合,管理整個GC堆

③空間整合

從整體上來看屬于標記-整理算法,從局部看屬于復制算法,不會產生內存碎片

④可預測停頓

?

轉載于:https://www.cnblogs.com/CLAYJJ/p/8253848.html

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

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

相關文章

虛擬機增加內存方法

樓主由于要在虛擬機里面裝一個oracle,在安裝過程中,提示物理內存不符合最低標準,如圖1. 圖1 因為懶得新建一個虛擬機了,所以考慮給虛擬機新增磁盤空間。 首先說明,新增磁盤空間,必須保證當前虛擬機里每個新…

myBatis xml if、where、if-else?、foreach 心得

MyBatis 的強大特性之一便是它的動態 SQL。如果你有使用 JDBC 或其它類似框架的經驗,你就能體會到根據不同條件拼接 SQL 語句的痛苦。例如拼接時要確保不能忘記添加必要的空格,還要注意去掉列表最后一個列名的逗號。利用動態 SQL 這一特性可以徹底擺脫這…

bzoj千題計劃213:bzoj2660: [Beijing wc2012]最多的方案

http://www.lydsy.com/JudgeOnline/problem.php?id2660 很容易想到是先把n表示成最大的兩個斐波那契數相加,然后再拆分這兩個斐波那契數 把數表示成斐波那契進制的形式,第i位表示有沒有第i個斐波那契數 比如16133 001001 那么拆分一個數就是把一個1…

面對對象-封裝

private 私有的 package/friendly/default 不寫 protected 受保護的 public 公共的 那么什么情況該用什么修飾符呢?從作用域來看,public能夠適用所有的情況。 但是大家在工作的時候,又不會真正全部都適用public,那么到底什么情況改用什么修飾…

本文詳解5G是個什么鬼,程序員都準備好了嗎?

無線移動通訊發展歷史 最近5G的概念炒的如火如荼,為此,華為和高通還干了一仗。這篇文章從技術層面給大家分析,什么是5G,它和4G比,高級在哪里? 我們來看看移動互聯網的技術發展: 然后我們在來看看…

安裝kerberos報錯 error: command 'gcc' failed with exit status 1

pip install kerberos 報錯:error: command gcc failed with exit status 1 安裝環境工具 yum install gcc libffi-devel python-devel openssl-devel 再次安裝kerberos安裝成功 轉載于:https://www.cnblogs.com/panbc/p/8268574.html

jquery正則表達式驗證:驗證全是數字

需求說明: 前端頁面使用正則表達式驗證輸入框中輸入的內容全是數字。 代碼說明: 這里只介紹正則表達式,其他部分的代碼不做介紹。如果有其他需要自行修改即可。 步驟一:建立一個頁面可以是html、jsp等,引入jquery-3.2.…

0613課堂匯總

一: 數據類型: 基本數據類型{byte(8)/short(16)/char(16)/int(32)/float(32)/long(64)/double(64)/boolean(1)}引用數據類型{*除了基本數據類型都是引用數據類型 *包括API中的類(String,File)*自定義的類(Personal A…

Istio流量管理實踐之(5): 使用cert-manager部署Istio自定義入口網關及進行證書管理...

Istio Gateway提供多個自定義入口網關的支持能力,通過開放一系列端口用于承載網格邊緣的進入連接,同時可以使用不同loadbalancer來隔離不同的入口流量。cert-manager可用于使用存儲在Kubernetes Secret資源中的任意簽名密鑰對來獲取證書。本文提供了手動…

log4配置

log4j 和 log4j2 方式一&#xff1a;log4j2.xml 添加 jar 包 1 <!-- log4j-core --> 2 <!-- 3 <dependency> 4 <groupId>org.apache.logging.log4j</groupId> 5 <artifactId>log4j-core</artifactId> 6 …

[bzoj3625][Codeforces 250 E]The Child and Binary Tree(生成函數+多項式運算+FFT)

3625: [Codeforces Round #250]小朋友和二叉樹 Time Limit: 40 Sec Memory Limit: 256 MBSubmit: 650 Solved: 283[Submit][Status][Discuss]Description 我們的小朋友很喜歡計算機科學&#xff0c;而且尤其喜歡二叉樹。考慮一個含有n個互異正整數的序列c[1],c[2],...,c[n]。…

常用內建模塊

一.datetime 1.模塊導入: from datetime import datetime 2.獲取當前日期和時間: >>> now datetime.now() >>> print(now) 2019-01-13 14:19:38.1810003.獲取指定日期和時間: >>> dt datetime(2019,1,10,15,0) >>> print(dt) 2019-01-10…

子序列進階問題

題目&#xff1a; 有一個數組&#xff0c;讓找到兩個不重復的連續子序列A,B &#xff0c;求Max(Sum(A)-Sum(B) 分析&#xff1a; AB必定連續&#xff0c;設兩端連接處index為{X&#xff0c;x1}&#xff0c;X可取0~n-1 設F(x)為連接處index為{X&#xff0c;x1}時 Max(Sum(A)…

day5-shelve模塊

一、概述前面章節我們講述了json和pickle模塊的序列化和反序列化處理&#xff0c;他們有一個不足是在python 3中不能多次dump和load&#xff0c;shelve模塊則可以規避這個問題。shelve模塊是一個簡單的k,v將內存數據通過文件持久化的模塊&#xff0c;可以持久化任何pickle可支持…

程序員:請你不要對業務「置之不理」

成長是條孤獨的路&#xff0c;一個人會走得更快&#xff1b;有志同道合者同行&#xff0c;會走得更遠。本篇內容整理自 21 天鯤鵬新青年計劃線上分享內容。鯤鵬新青年計劃是由 TGO 鯤鵬會組織的線上分享活動&#xff0c;希望能幫助更多同學一起學習、成長。12 月 28 日&#xf…

在Ubuntu系統下如何將chrome瀏覽器的bookmarks導出到本地

1. 打開chrome瀏覽器在頁面的右上角點擊那個三個小點的位置&#xff0c;找到bookmarks&#xff0c;然后點擊bookmarks manager,然后在organize右側大倒三角下選擇&#xff0c;export bookmarks to HTML&#xff0c;選擇要保存的位置&#xff0c;利用同樣的方法下次就可以直接導…

php基于數組的分頁實現

關于數組的分頁函數,用數組進行分頁的好處是可以方便的進行聯合多表查詢,只需要將查詢的結果放在數組中就可以了以下是數組分頁的函數,函數page_array用于數組的分頁&#xff0c;函數show_array用于分頁函數的操作及顯示&#xff0c;需要配合使用.兩個函數通過全局變量$countpa…

028 -bash-4.1$ 出現故障的原理及解決辦法?

最近在搭建分布式的時候&#xff0c;出現了這個問題&#xff0c;很不爽。下面是我的解決方式。 1.在用戶下刪除bash rm -rf /home/beifeng/.bash* 2.拷貝 cp /etc/skel/.bash* /home/beifeng 3.退出&#xff0c;再進入用戶 4.解釋 set |grep -i ps1 轉載于:https://www.cnblogs…

彈出ifream

top.$.jBox("iframe:"${ctx}/synopsis/hmlwxSynopsis/addItem, {title: "添加作品",width: 1000, height: 500, buttons:{關閉: true,確定:ok},submit:function(v, h, f){},loaded: function (jboxContent) {$(jboxContent).css(overflow-x,);$(jboxConten…

ORB-SLAM2中的Loop Closinng中DetectLoopCandidates函數解析

/函數的三要素是&#xff1a;函數返回值類型&#xff0c;函數名稱&#xff0c;函數參數 函數的返回值是裝有關鍵幀指針的vector 該函數是類KeyFrameDatabase的成員函數,函數名是DetectLoopCandidate 該函數的參數分別是KeyFrame類型的指針變量 pKF和最小得分vector<KeyFrame…