JVM - 垃圾回收機制

JVM的垃圾回收機制(簡稱GC)

? ? ? ? JVM的垃圾回收機制非常強大,是JVM的一個很重要的功能,而且這也是跟對象實例息息相關的,如果對象實例不用了要怎么清除呢?

如何判斷對象已經沒用了

當JVM認為一個對像已經沒用了,就會把這個對象判定為是垃圾,就會去回收它的空間,有兩個方法判斷一個對像是否已經沒用了

1、引用計數法:記錄指向該對象的引用數,當該數值為零時就將該對象判定為垃圾

這個方法實現簡單,判定效率也高,不過它有個致命的問題,它無法解決相互對象之間相互循環引用的問題,看下面這個例子

?
public class Test {public Object object = null;public static void main(String[] args) {Test a = new Test();//對象1Test b = new Test();//對象2a.object = b;b.object = a;a = null;b = null;}
}?

此時對象1和對象2除了對方指向自己的引用外,沒有其他的引用了,這個時候,無論是對象1還是對象2,我們認為都已經沒用了,因為程序是找不到它倆的,但是引用計數法無法將它們判定為垃圾,因為它們的被引用數不是為零

正是因為這個缺點,主流的java虛擬機都不會使用該判定方法

2、可達性分析:

選定一些滿足特定條件的對象作為根對象(GC Roots),那些與跟對象存在直接或間接引用關系的就是有用的對象,而與根對象沒有任何關聯的對象,就是垃圾對象(如下圖)

可達性分析是當今主流的判定機制

GC的分類

Minor GC是新生代GC,指的是發生在新生代的垃圾收集動作。由于java對象大都是朝生夕死的,所以Minor GC非常頻繁,一般回收速度也比較快。

Major GC是老年代GC,指的是發生在老年代的GC,通常執行Major GC會連著Minor GC一起執行。Major GC的速度要比Minor GC慢的多。

Full GC是清理整個堆空間,包括年輕代和老年代(Minor GC和Major GC一起執行就是Full GC)

GC和分代的關系

那么現在我們就知道了為什么要分代了:

對象實例一般會首先分配到新生代當中,當新生代當中的空間不夠用的時候,就會觸發Minor GC,這個時候就會有一些沒用的對象實例被清除掉,而有些就會留下來,那些能夠挺過一定次數Minor GC的對象,最后就會進入到老年代當中,如果老年代中的空間也不夠用了,那么就會進行Major GC

回收算法

我們上面說到GC會對垃圾進行回收,那具體要這么回收呢?這個就是回收算法,目前有三種回收算法,分別是:標記-清除、標記-復制、標記-整理

標記-清除

看下面的示意圖,這個代表堆中的某塊空間(可以是年輕代或老年代),每個紫色方塊就是一個對象,上面我們說,JVM的對象是否存活的判定方法是可達性分析,所有那些沒被GC Root引用的就要給標記成垃圾對象,標記完后再統一進行回收,這會造成內存空間碎片化的問題

?

標記-復制

將堆區分為兩塊區域,先只在其中一塊區域創建對象,垃圾回收的時候,先標記出那些不要被回收的對象,然后將其復制到另外一塊區域中,然后清空原本那塊區域,新生代使用的就是標記-復制算法,新生代分為一塊較大的Eden空間和兩塊較小的 Survivor空間,每次分配內存只使用Eden和其中一塊Survivor。發生垃圾搜集時,將Eden和Survivor中仍然存活的對象一次性復制到另外一塊Survivor空間上,然后直接清理掉Eden和已用過的那塊Survivor空間。這里存在一個問題,當存活的對象的總大小大于那塊Survivor空間,那就會造成溢出,而那些溢出的對象,會直接進入老年代,這叫分配擔保

?標記-整理

標記-復制算法存在需要額外空間進行分配擔保的問題,新生代有老年代做分配擔保,那老年代沒人做分配擔保就沒辦法使用標記-整理算法,要使用標記-整理算法,同樣是先進行標記,不過不馬上進行回收,而是讓所有的存活對象都向內存空間一端移動,然后直接清理掉邊界以外的堆空間

標記-整理存在一個弊端,在整理的過程中,必須全程暫停用戶應用程序,這個被形象地稱為“Stop The World”,實際上只要對象的存儲地址發生了改變,就會“Stop The World”,所以標記-復制算法也會“Stop The World”

?

垃圾收集器

垃圾回收算法是理論層面,真正的垃圾回收執行者是垃圾收集器,關于垃圾收集器我整理了另外一篇博客,地址:http://t.csdn.cn/2ypGh

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

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

相關文章

初識Sentinel

目錄 1.解決雪崩的方式有4種: 1.1.2超時處理: 1.1.3倉壁模式 1.1.4.斷路器 1.1.5.限流 1.1.6.總結 1.2.服務保護技術對比 1.3.Sentinel介紹和安裝 1.3.1.初識Sentinel 1.3.2.安裝Sentinel 1.4.微服務整合Sentinel 2.流量控制 2.1.簇點鏈路 …

Ubuntu中怎么清空mysql數據

要清空 MySQL 數據,可以使用以下步驟來執行。請注意,這將會永久刪除數據庫中的所有數據,請謹慎操作,并在操作前備份重要數據。 登錄 MySQL: 打開終端,使用以下命令登錄到 MySQL 數據庫。根據情況&#xf…

黑馬項目一階段面試58題 Web14題(一)

一、什么是AJAX 異步的JavaScript和XML。用來做前端和后端的異步請求的技術。 異步請求:只更新部分前端界面的請求,做到局部更新。 比如注冊,提示用戶名已存在而整個頁面沒有動 比如百度圖片搜索美女,進度條越變越短&#xff…

== 和 equals 的對比 [面試題]

和 equals 的對比[面試題] 文章目錄 和 equals 的對比[面試題]1. 和 equals 簡介2. Object 類中 equals() 源碼3. String 類中 equals() 源碼4. Integer 類中 equals() 源碼5. 如何重寫 equals 方法 1. 和 equals 簡介 是一個比較運算符 :既可以判斷基本數據類型…

【數據結構OJ題】鏈表的回文結構

原題鏈接:https://www.nowcoder.com/practice/d281619e4b3e4a60a2cc66ea32855bfa?tpId49&&tqId29370&rp1&ru/activity/oj&qru/ta/2016test/question-ranking 目錄 1. 題目描述 2. 思路分析 3. 代碼實現 1. 題目描述 2. 思路分析 在做這道…

re中的match和search有什么區別?

問題:請說明以下re模塊中的match和search有什么區別? re.match()與re.search()的區別 re.match()只匹配字符串的開始,如果字符串開始不符合正則表達式,則匹配失敗,結果返回None,而re.search()匹配整個字符串,直到找到一個匹配 re.search() re.search()掃描整個字符串并…

老師如何制作二維碼分班查詢系統?技術老師分享的創建框架值得借鑒

作為一名班主任,開學前需要搞定分班問題,可以通過制作一個分班二維碼查詢系統,讓學生和家長可以通過掃描二維碼快速查到自己的分班信息,分享一下我制作的過程,希望對老師們有幫助(結尾有驚喜)&a…

內網穿透——使用Windows自帶的網站程序建立網站

文章目錄 1.前言2.Windows網頁設置2.1 Windows IIS功能設置2.2 IIS網頁訪問測試 3. Cpolar內網穿透3.1 下載安裝Cpolar3.2 Cpolar云端設置3.3 Cpolar本地設置 4.公網訪問測試5.結語 1.前言 在網上各種教程和介紹中,搭建網頁都會借助各種軟件的幫助,比如…

RP2040開發板自制樹莓派邏輯分析儀

目錄 前言 1 準備工作和前提條件 1.1 Raspberry Pi Pico RP2040板子一個 1.2 Firmware-LogicAnalyzer-5.0.0.0-PICO.uf2固件 1.3 LogicAnalyzer-5.0.0.0-win-x64軟件 2 操作指南 2.1 按住Raspberry Pi Pico開發板的BOOTSEL按鍵,再接上USB接口到電腦 2.2 刷入…

End-to-End Object Detection with Transformers

DERT 目標檢測 基于卷積神經網絡的目標檢測回顧DETR對比Swin Transformer摘要檢測網絡流程DERT網絡架構編碼器概述解碼器概述整體結構object queries的初始化Decoder中的Muiti-Head Self-AttentionDecoder中的Muiti-Head Attention 損失函數解決的問題 基于卷積神經網絡的目標檢…

內網穿透實戰應用——【通過cpolar分享本地電腦上有趣的照片:發布piwigo網頁】

通過cpolar分享本地電腦上有趣的照片:發布piwigo網頁 文章目錄 通過cpolar分享本地電腦上有趣的照片:發布piwigo網頁前言1. 設定一條內網穿透數據隧道2. 與piwigo網站綁定3. 在創建隧道界面填寫關鍵信息4. 隧道創建完成 總結 前言 首先在本地電腦上部署…

Unity - 從PackageManager中安裝內置工具

1.MemoryProfiler 內存分析工具 add from git url :com.unity.memoryprofiler 使用地址記錄:unity3d內存分析工具memory profiler_unity3d memory profile_Marco&GalaxyDragon的博客-CSDN博客 理解Unity Memory Profiler - 知乎

Gradle和Maven的詳細講解和兩者之間的區別

Gradle 詳細介紹 Gradle 是一種基于 Groovy 語言的構建自動化工具,用于構建、測試和部署項目。它使用聲明式的腳本來定義構建過程,允許開發者靈活地配置項目構建。Gradle 使用一種被稱為 Groovy DSL(領域特定語言)的語法&#xf…

mysql知識點+面試總結

目錄 1 mysql介紹 2 數據庫常見語法 3 數據庫表的常見語法 4 其他常見語法(日期,查詢表字段) 5 JDBC開發步驟 6 索引 6.1 索引常見語法 7 常見面試總結 8 java代碼搭建監控頁面 1 mysql介紹 數據庫:存儲在硬盤上的文件系統…

VR虛擬展廳如何將客戶引流到線下?

VR虛擬展廳是一項很不錯的創新技術,將傳統的展覽內容以數字化形式呈現,為參觀者帶來全新的展示體驗,也為企業帶來了全新的宣傳機遇。 線上虛擬展廳目前有著兩種形式,一種是通過三維建模技術、虛擬現實技術等搭建的虛擬展廳&#x…

leetcode 474. 一和零

2023.8.15 class Solution { public:int findMaxForm(vector<string>& strs, int m, int n) {vector<vector<int>> dp(m1, vector<int>(n1,0));//遍歷物品for(string str : strs){int num_0 0;int num_1 0;for(char c : str){if(c 0) num_0;el…

Docker 容器內無法使用vim命令 解決方法

目錄 1. 問題所示2. 原理分析3. 解決方法1. 問題所示 進入Docker容器后 無法使用vim編輯器,出現如下問題:bash: vim: command not found 如圖所示: 想著通過apt-get 安裝vim,出現如下問題: root@b9f0fd330d5b:/# apt-get install vim Reading package lists... Done B…

ZooKeeper介紹

ZooKeeper是一個開放源代碼的分布式協調服務。ZooKeeper的設計目標是將那些復雜且容易出錯的分布式一致性服務封裝起來&#xff0c;構成一個高效可靠的原語集&#xff0c;并以一系列簡單易用的接口提供給用戶使用。 ZooKeeper是一個典型的分布式數據一致性的解決方案&#xff0…

如何通過 Keras 中的活動正則化減少泛化誤差

活動正則化提供了一種鼓勵神經網絡學習原始觀察的稀疏特征或內部表示的方法。 在自動編碼器(稱為稀疏自動編碼器)和編碼器-解碼器模型中尋求稀疏學習表示是很常見的,盡管該方法通常也可用于減少過度擬合并提高模型泛化到新觀察值的能力。 在本教程中,您將發現 Keras API …

spring入門基本介紹及注入方式---詳細介紹

一&#xff0c;spring的簡介 Spring是一個開源框架&#xff0c;它由Rod Johnson創建。它是為了解決企業應用開發的復雜性而創建的。 提供了許多功能強大且易于使用的特性&#xff0c;使得開發者能夠更加輕松地構建可維護且可擴展的應用程序&#xff0c;簡單來說: Spring使用基…