如何回收內存對象,有哪些回收算法?

它的主要不足有兩個:
效率問題,標記和清除兩個過程的效率都不高。
空間問題,標記清除之后會產生大量不連續的內存碎片,空間碎片太多可能會導致以后在程序運行過程中需
要分配較大對象時,無法找到足夠的連續內存而不得不提前觸發另一次垃圾收集動作。
2. 復制算法
為了解決效率問題,一種稱為復制(Copying)的收集算法出現了,它將可用內存按容量劃分為大小相等的兩塊,
每次只使用其中的一塊。當這一塊的內存用完了,就將還存活著的對象復制到另外一塊上面,然后再把已使用過的
內存空間一次清理掉。這樣使得每次都是對整個半區進行內存回收,內存分配時也就不用考慮內存碎片等復雜情
況,只要移動堆頂指針,按順序分配內存即可,實現簡單,運行高效。
復制算法的代價是將內存縮小為了原來的一半,減少了實際可用的內存。現在的商業虛擬機都采用這種收集算法來
回收新生代,IBM公司的專門研究表明,新生代中的對象98%朝生夕死的,所以并不需要按照1:1的比例來劃分
內存空間,而是將內存分為一塊較大的Eden空間和兩塊較小的Survivor空間,每次使用Eden和其中一塊
Survivor。當回收時,將EdenSurvivor中還存活著的對象一次性地復制到另外一塊Survivor空間上,最后清理掉
Eden和剛才用過的Survivor空間。HotSpot虛擬機默認EdenSurvivor的大小比例是8:1,也就是每次新生代中可
用內存空間為整個新生代容量的90%80%+10%),只有10%的內存會被浪費。當然,98%的對象可回收只是一
般場景下的數據,我們沒有辦法保證每次回收都只有不多于10%的對象存活,當Survivor空間不夠用時,需要依賴
其他內存(這里指老年代)進行分配擔保(Handle Promotion)。
3. 標記-整理算法
復制收集算法在對象存活率較高時就要進行較多的復制操作,效率將會變低。更關鍵的是,如果不想浪費50%的空
間,就需要有額外的空間進行分配擔保,以應對被使用的內存中所有對象都100%存活的極端情況,所以在老年代
一般不能直接選用這種算法。根據老年代的特點,有人提出了另外一種標記-整理(Mark-Compact)算法,標記過
程仍然與標記-清除算法一樣,但后續步驟不是直接對可回收對象進行清理,而是讓所有存活的對象都向一端移
動,然后直接清理掉端邊界以外的內存。
4. 分代收集算法
當前商業虛擬機的垃圾收集都采用分代收集(Generational Collection)算法,這種算法并沒有什么新的思想,只
是根據對象存活周期的不同將內存劃分為幾塊。一般是把Java堆分為新生代和老年代,這樣就可以根據各個年代的
特點采用最適當的收集算法。在新生代中,每次垃圾收集時都發現有大批對象死去,只有少量存活,那就選用復制
算法,只需要付出少量存活對象的復制成本就可以完成收集。而老年代中因為對象存活率高、沒有額外空間對它進
行分配擔保,就必須使用標記清理或者標記整理算法來進行回收。

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

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

相關文章

Numpy科學計算與數據分析:Numpy文件操作入門之數組數據的讀取和保存

Numpy文件讀寫實戰 學習目標 通過本課程,學員將深入了解如何使用Numpy庫進行數組數據的讀取和保存,包括文本文件和二進制文件的處理方法。通過本課程的學習,學員將能夠熟練掌握Numpy在文件操作中的應用,為數據處理和分析打下堅實…

AutoMQ-Kafka的替代方案實戰

AutoMQ無縫兼容kafka,并且借助S3實現數據統一存儲。這個確實解決了大問題! 1. Kafka的挑戰 橫向擴展困難:擴容kafka需要手動創建分區遷移策略和復制分區數據。這個過程不僅風險高、資源密集而且耗時。存儲成本高:計算和存儲在kaf…

Numpy科學計算與數據分析:Numpy線性代數基礎與實踐

Numpy線性代數實踐:從矩陣乘法到特征值 學習目標 通過本課程,學員將掌握Numpy中處理線性代數問題的基本方法,包括矩陣乘法、求解線性方程組以及計算特征值和特征向量。本課程將通過理論與實踐相結合的方式,幫助學員深入理解這些…

CrackMapExec--安裝、使用

用途限制聲明,本文僅用于網絡安全技術研究、教育與知識分享。文中涉及的滲透測試方法與工具,嚴禁用于未經授權的網絡攻擊、數據竊取或任何違法活動。任何因不當使用本文內容導致的法律后果,作者及發布平臺不承擔任何責任。滲透測試涉及復雜技…

深入理解模板方法模式:框架設計的“骨架”藝術

目錄 前言 一、模板方法模式的核心思想 二、模板方法模式的結構組成 1. 抽象類(Abstract Class) 2. 具體子類(Concrete Class) 三、C 實現示例:咖啡與茶的制作流程 步驟 1:定義抽象類(飲料…

LinkedList 深度解析:核心原理與實踐

文章目錄 一、底層數據結構與特性 1. 核心數據結構 2. 關鍵特性 二、核心操作機制解析 1. 添加元素機制 2. 刪除元素機制 三、性能關鍵點分析 1. 時間復雜度對比 2. 空間開銷 四、線程安全解決方案 1. 同步包裝器 2. 使用并發集合 五、經典面試題解析 1. ArrayList 和 LinkedLi…

Jmeter性能測試之安裝及啟動Jmeter

1. 安裝JDK Jmeter依賴JDK環境,如果電腦沒有JDK,需要安裝JDK.如下是Jmeter版本與JDK版本對應關系. 2. Jmeter下載安裝 下載鏈接:https://archive.apache.org/dist/jmeter/binaries/ windows下載.zip壓縮包Linux下載.tar壓縮包 下一步下一步就行 3. 配置環境變…

ShadowKV 機制深度解析:高吞吐長上下文 LLM 推理的 KV 緩存“影子”方案

背景與核心思想簡介 在LLM的長上下文推理中,KV Cache成為影響速度和內存的關鍵因素。每生成一個新token,模型需要對所有先前token的鍵(Key)和值(Value)向量執行自注意力計算。傳統方法會將所有過去的K/V向量…

spring-ai整合PGVector實現RAG

背景 最近公司的產品和業務線,要求往ai方向靠攏,在研發各種智能體,整理下最近學習的過程,將一部分內容整理出來,分享給需要的同學。 這篇文章將會提供詳細的例子以及踩坑說明。主要內容是整合spring-ai,同…

Git 亂碼文件處理全流程指南

一、問題背景與核心目標 1.1 問題描述 在 Git 倉庫中發現了一個異常亂碼文件: "\001\342\240\025\250\325\3738\f\036\035\006\004\240\002\240\002\b\003\004\340\002\340\002\340\002\034\034\001\001\004:\016\020\001\005\016\016\016\211\266\257\211\266…

JavaScript垃圾回收機制

1.垃圾回收的概念 1.1 什么是垃圾回收機制: GC 即 Garbage Collection ,程序工作過程中會產生很多"垃圾",這些垃圾是程序不用的內存或者是之前用過了,以后不會再用的內存空間,而 GC 就是負責回收垃圾的&…

工業相機選擇規則

一、相機分辨率選擇相機分辨率指的是相機傳感器捕捉圖像細節的能力,具體來說就是傳感器上有效像素的總數量。可以把它理解為構成數字圖像的“小方塊”(像素)有多少個。工業領域內相機的分辨率的選擇根據更具產品需要的精度要求和產品大小來確…

【Web安全】csrf、ssrf和xxe的區別

CSRF、SSRF 和 XXE 是三種不同類型的網絡安全漏洞,它們的原理、攻擊目標、利用方式和危害場景均有顯著區別。以下從核心定義、原理、場景等維度詳細對比三者的差異。一、核心定義與原理對比漏洞類型全稱核心定義核心原理CSRF跨站請求偽造攻擊者誘導用戶在已登錄的情…

【Lua】XLua一鍵構建工具

將以下代碼放入Editor文件夾&#xff0c;點擊菜單欄的XLua/一鍵生成代碼和熱補丁 即可。using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using UnityEditor; using UnityEngine;/// <summary> /// XLua自動化構建工具 //…

20250808:EasyGBS 對接大華 ICC 平臺問題處理

最近有個現場在對接大華 ICC 平臺時&#xff0c;客戶反饋&#xff1a;EasyGBS 級聯成功&#xff0c;但 ICC 顯示下級離線。EasyGBS 成功對接過很多家國標平臺&#xff0c;但這種情況確實少見。我們遠程過去確認配置無誤后&#xff0c;就進行了抓包&#xff0c;拿到包我就納悶了…

js使用webscoket時使用自定義二進制包協議時并發問題處理

this.server new WebSocket.Server({ port: this.port });this.server.on(connection, (ws, req) > {const uniqueId dataUtil.uuid();ws.id uniqueId;global.serverSession.set(uniqueId, ws);logger.debug({ message: 客戶端已連接, traceId: ws.id, address: req.sock…

元數據管理與數據治理平臺:Apache Atlas 分類傳播 Classification Propagation

文中內容僅限技術學習與代碼實踐參考&#xff0c;市場存在不確定性&#xff0c;技術分析需謹慎驗證&#xff0c;不構成任何投資建議。Apache Atlas 框架是一套可擴展的核心基礎治理服務&#xff0c;使企業能夠有效、高效地滿足 Hadoop 中的合規性要求&#xff0c;并支持與整個企…

TSF應用開發與運維部署

架構演進歷程&#xff1a;單體架構-->SOA架構-->微服務架構-->Service Mesh騰訊微服務平臺TSF (Tencent Service Framework) 是一個圍繞應用和微服務的 PaaS 平臺。提供服務全生命周期管理能力和數據化運營支持。提供多維度應用、服務、機器的監控數據&#xff0c;助力…

linux開發之mmap內存映射

mmap概念 mmp是 將文件或設備直接映射到進程的虛擬內存空間 的一種機制&#xff0c;可實現程序像訪問內存一樣訪問文件&#xff0c;而不需要傳統的 read()/write()系統調用 文件內容被映射到進程的地址空間&#xff0c;讀寫文件就像操作內存一樣&#xff0c;操作系統負責自動同…

CPP繼承

繼承 一、繼承概述 1、為什么需要繼承 如下示例&#xff0c;Person 類、Student 類、Teacher 類有大量重復的代碼&#xff0c;造成代碼冗余&#xff0c;降低開發效率。我們可以通過繼承來解決這一問題。在面向對象的編程語言中&#xff0c;繼承是一個核心概念。主要作用將重復的…