Java之GC機制

1?JVM基本結構

1)類加載器classLoader:在JVM啟動時或者類運行時將需要的.class文件加載到內存中

2)內存區域(運行時數據區): 是在JVM運行的時候操作所分配的內存區

3)執行引擎:負責執行class文件中包含的字節碼指令

4)本地方法接口:主要是調用C/C++實現的本地方法及返回結果

?

?

?

?

?

2?JVM內存結構

1 )? 方法區:用于存儲類結構信息的地方,包括常量池、靜態變量、構造函數等。

2)?Java堆(heap):存儲Java實例或者對象的地方。這塊是gc的主要區域

3) Java棧(stack):Java棧總是和線程關聯的,每當創建一個線程時,JVM就會為這個線程創建一個對應的Java棧。在這個java棧中又會包含多個棧幀,每運行一個方法就創建一個棧幀,用于存儲局部變量表、操作棧、方法返回值等。每一個方法從調用直至執行完成的過程,就對應一個棧幀在java棧中入棧到出棧的過程。所以java棧是線程私有的

4)程序計數器:用于保存當前線程執行的內存地址,由于JVM是多線程執行的,所以為了保證線程切換回來后還能恢復到原先狀態,就需要一個獨立的計數器,記錄之前中斷的地方,可見程序計數器也是線程私有的

5)本地方法棧:和Java棧的作用差不多,只不過是為JVM使用到的native方法服務的

?

?

?

?

?

3?Java對象引用

Java對象的引用可以分為4類:強引用、軟引用、弱引用和虛引用

1)強引用:通常可以認為是通過new出來的對象,即使內存不足,GC進行垃圾收集的時候也不會主動回收。

Object obj = new Object();

2)軟引用:在內存不足的時候,GC進行垃圾收集的時候會被GC回收

Object obj = new Object();
SoftReference<Object> softReference = new SoftReference<>(obj);

3)弱引用:無論內存是否充足,GC進行垃圾收集的時候都會回收

Object obj = new Object();
WeakReference<Object> weakReference = new WeakReference<>(obj);

4)虛引用:和弱引用類似,主要區別在于虛引用必須和引用隊列一起使用

Object obj = new Object();
ReferenceQueue<Object> referenceQueue = new ReferenceQueue<>();
PhantomReference<Object> phantomReference = new PhantomReference<>(obj, referenceQueue);

引用隊列:如果軟引用和弱引用被GC回收,JVM就會把這個引用加到引用隊列里,如果是虛引用,在回收前就會被加到引用隊列里。

?

?

?

?

?

?

?

4?GC機制

垃圾收集器一般完成兩件事->檢測出垃圾->回收垃圾

1) 對象的年齡相關知識

對象的年齡,如果在一次垃圾回收過程中有使用該對象的,則將對象年齡加1,否則減1,當計數為0,則進行回收,如果年齡達到一定數字則進入老生代。總的來說內存分配機制主要體現在對象創建之后是否仍在使用,已經不使用的則回收,繼續使用的則對其年齡進行更新,達到一定程度,轉移到年老代。

下圖所示是堆中內存分配示意圖,創建一個對象,首先會在eden區域分配區域,如果內存不夠,就會將年齡大的轉移到Survivor區,當survivor區域存儲不下,則會轉移年老代的。對于一些靜態變量不需要使用對象,直接調用的,則會被放入永生代。一般來說長期存活的對象最終會被存放到年老代還有一種特殊情況也會被存放到年老代,就是創建大對象時,比如數據這種需要申請連續空間的,如果空間比較大的,則會直接進入年老代

?

2)?垃圾檢測方法

  • 引用計數法給每個對象添加引用計數器,每個地方引用它,計數器就+1,失效時-1。如果兩個對象互相引用時,就導致無法回收
  • ?可達性分析算法以根集對象為起始點進行搜索,如果對象不可達的話就是垃圾對象。根集(Java棧中引用的對象、方法區中常量池中引用的對象、本地方法中引用的對象等。JVM在垃圾回收的時候,會檢查堆中所有對象是否被這些根集對象引用,不能夠被引用的對象就會被垃圾回收器回收。)

?

?

3) 垃圾回收算法

  • 標記-清除:首先標記所有需要回收的對象,在標記完成之后統計回收所有被標記的對象,它的標記過程即為上面的可達性分析算法,清除所有被標記的對象,缺點:效率不足,標記和清除效率都不高,空間問題,標記清除之后會產生大量不連續的內存碎片,導致大對象分配無法找到足夠的空間,提前進行垃圾回收

  • ?復制算法:復制算法將可用的內存分成兩份,每次使用其中一塊,當這塊回收之后把未回收的復制到另一塊內存中然后把使用的清除。這種算法運行簡單,解決了標記-清除算法的碎片問題,但是這種算法代價過高,需要將可用內存縮小一半,對象存活率較高時,需要持續的復制工作,效率比較低 優點:保證了空間的連續性,又避免了大量的內存空間浪費.
  • ?標記-整理算法:標記過程與標記-清除的標記一樣,但后續不是對可回收對象進行清理,而是讓所有的對象都向一端移動,然后直接清理掉端邊界以外的內存。樣既可以避免不連續空間出現,還可以避免對象存活率較高時的持續復制。這種算法適合老生代。
  • ?分代收集算法:??分代收集算法就是目前虛擬機使用的回收算法,它解決了標記整理不適用于老年代的問題,將內存分為各個年代,在不同年代使用不同的算法,從而使用最合適的算法,新生代存活率低,可以使用復制算法。而老年代對象存活率高,沒有額外空間對它進行分配擔保,所以使用標記整理算法

?

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

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

相關文章

ArcGIS實驗教程——實驗十八:疊置分析(Overlay Analysis)

ArcGIS實驗視頻教程合集:《ArcGIS實驗教程從入門到精通》(附配套實驗數據) 目 錄 一、實驗描述 二、實驗內容 三、實驗目的 四、實驗數據

《零基礎看得懂的C語言入門教程 》——(一)脫離學習誤區

本節視頻連接&#xff1a; https://www.bilibili.com/video/BV1Qv411t7ae 新手C語言學習有些誤區你應該知道&#xff0c;這樣學習起來事半功倍~一、前言 距離上一次編寫C語言的教程是5年前了&#xff08;2015年&#xff09;&#xff0c;由于自己是從初一時開始學習編程&#…

一套完整的導視設計案例_色彩導視藝術:烏克蘭基輔語言學校導視設計案例

學校導視設計案例建筑師Emil Dervish為烏克蘭基輔Underhub語言學校設計了色彩繽紛的導視系統&#xff0c;該設計靈感來源于倫敦地鐵&#xff0c;他希望通過彩色線條的大膽應用來營造輕松而歡樂的氛圍。讓我們一起來看看這座由“彩虹”做導視的學校。彩虹導視設計跟著紅色導視線…

C# 創建匿名管道

下面對匿名管道執行類似的操作。通過匿名管道&#xff0c;創建兩個彼此通信的任務。為了給管道的創建發出信號&#xff0c;使用 ManualResetEventSlim 對象&#xff0c;與內存映射文件一樣。在 Program 類的 Run 方法中&#xff0c;創建兩個任務&#xff0c;調用 Reader 和 Wri…

內測投票

create table DiaoYanTiMu &#xff08;  Ids int(10) auto_increment not null primary key(),//把所需要的都寫上中間不需要符號隔開&#xff0c;設自增長列類型必須是int&#xff0c;主鍵的話必須不能為空not null&#xff0c; Title varchar(50) not null &#xff09;;/…

Android之通過Binder機制實現IPC和linux的傳統IPC的對比分析

一、 Android的Binder機制實現IPC 這里bind機制實現實現IPC模型這里不具體分析,簡單理解就是clint-server模型 涉及到4個模塊client、server、serverManager、bind底層驅動。 serverManager的作用是將字符形式的Binder(Server創建了Binder實體)名字轉化成Client中對該Bin…

Mysql 查詢統計練習

2019獨角獸企業重金招聘Python工程師標準>>> 1、建表 customers 顧客表 products 產品表 orders 訂單表 -- 顧客表 CREATE TABLE customers (c_id INT NOT NULL AUTO_INCREMENT,lastname VARCHAR(255),firstname VARCHAR(255),address VARCHAR(255),birthday DATETI…

【經典回放】多種語言系列數據結構算法:堆排序

目錄 一、堆排序算法分析 二、C#語言實現堆排序 三、C語言實現堆排序 一、堆排序算法分析

C++11模版元編程的應用

1.概述 關于C11模板元的基本用法和常用技巧&#xff0c;我在程序員2015年2月B《C11模版元編程》一文&#xff08;后稱前文&#xff09;中已經做了詳細地介紹&#xff0c;那么C11模版元編程用來解決什么實際問題呢&#xff0c;在實際工程中又該如何應用呢&#xff1f;本文將側重…

《零基礎看得懂的C語言入門教程 》——(二)C語言沒那么難簡單開發帶你了解流程

一、學習目標 了解DevC集成開發環境了解集成開發環境了解HelloWorld程序了解HelloWorld程序的編寫方法 目錄 C語言真的很難嗎&#xff1f;那是你沒看這張圖&#xff0c;化整為零輕松學習C語言。 第一篇&#xff1a;&#xff08;一&#xff09;脫離學習誤區 第二篇&#xff1…

11選5下期算法_本周六周日【高二直播】輔導網課預告:通用技術電控二三極管、多用電表測量、數字邏輯電路、解析枚舉遞歸算法,2022浙江選考技術...

01第19-21講 2020年11月28日29日開課目錄鯨學名師考點精講系統提高高二共3階段精品課夯實基礎沖刺技術選考97-100分&#xff01;11月28日【高二|提高|直播】高二精品直播課講授&#xff1a;浙江選考技術科目第19講 高二綜合提高鯨學名師講授高中通用技術&#xff1a;第19講 電控…

十分鐘完成Bash 腳本進階!列舉Bash經典用法及其案例

前言&#xff1a;在linux中&#xff0c;Bash腳本是很基礎的知識&#xff0c;大家可能一聽腳本感覺很高大上&#xff0c;像小編當初剛開始學一樣&#xff0c;感覺會寫腳本的都是大神。雖然復雜的腳本是很燒腦&#xff0c;但是&#xff0c;當我們熟練的掌握了其中的用法與技巧&am…

【經典回放】多種語言系列數據結構算法:基數排序

目錄 一、算法思路 二、C#語言實現 三、C語言實現 一、算法思路 1. 思想基礎 基數排序的思想就是先找出待排序中的最大者&#xff0c;然后按最大者申請一個足夠大的內存空間&#xff0c;并將其初始化為零&#xff0c;然后將所有待排序的數裝入其中&#xff0c;標記裝入的數…

Java之ThreadPoolExcutor和四種常見的線程池

一、ThreadPoolExcutors的作用 java提供了ThreadPoolExcutors來創建一個線程池&#xff0c;我們為什么要用線程池呢? 1.降低資源的消耗&#xff1a;通過重復利用已經創建好的線程降低線程的創建和銷毀帶來的損耗 2.提高響應速度&#xff1a;因為線程池中的線程處于等待分配任…

探索鏈路追蹤在.NET6工業物聯網項目中的應用

如果覺得有用&#xff0c;請留言學到了。已經會了的老哥&#xff0c;請留言就這&#xff1f;可能遇到的問題工業物聯網系統自上而下一般分為ERP、Mes、SCADA、WCS、邊緣網關、設備等一個生產訂單從SAP發送到設備要經過上述多個系統&#xff0c;當某個環節出現問題&#xff0c;可…

《零基礎看得懂的C語言入門教程 》——(三)輕輕松松理解第一個C語言程序

一、學習目標 了解C語言代碼的一般結構了解函數的概念了解printf函數的使用方法了解頭文件的概念了解system函數的使用方法 目錄 C語言真的很難嗎&#xff1f;那是你沒看這張圖&#xff0c;化整為零輕松學習C語言。 第一篇&#xff1a;&#xff08;一&#xff09;脫離學習誤…

hdu_1728_逃離迷宮(bfs)

題目連接&#xff1a;http://acm.hdu.edu.cn/showproblem.php?pid1728 題意&#xff1a;走迷宮&#xff0c;找最小的拐角 題解&#xff1a;對BFS有了新的理解&#xff0c;DFS剪枝應該也能過&#xff0c;用BFS就要以拐角作為增量來搜&#xff0c;即以當前點為坐標&#xff0c;4…

把文件放在SD卡

2019獨角獸企業重金招聘Python工程師標準>>> 在程序中訪問SDCard&#xff0c;你需要申請訪問SDCard的權限。 在AndroidManifest.xml中加入訪問SDCard的權限如下: <!-- 在SDCard中創建與刪除文件權限--> <uses-permissionandroid:name"android.permiss…

python分層聚類集群合并_24、python分層聚類案例(scipy方法)

目錄1、分層聚類算法2、方法3、分析步驟4、案例1、分層聚類算法層次聚類算法又稱為樹聚類算法&#xff0c;它根據數據之間的距離&#xff0c;透過一種層次架構方式&#xff0c;反復將數據進行聚合&#xff0c;創建一個層次以分解給定的數據集。2、方法01 聚類方法linkagescipy.…

【經典回放】多種語言系列數據結構算法:數組

數組如同前面學過的順序表,一次性申請一片地址連續的存儲空間,我們還知道,計算機中數組是以一維的形式存儲的,因為計算機的內存的一維的。在知道了多維數據的計算機存儲方式后,我們還要知道構造一個多維數據的方法,并構造ADT,具體做法如下所示: 內容和步驟: 1、C語言中…