如何回收内存对象,有哪些回收算法?

它的主要不足有两个:
效率问题,标记和清除两个过程的效率都不高。
空间问题,标记清除之后会产生大量不连续的内存碎片,空间碎片太多可能会导致以后在程序运行过程中需
要分配较大对象时,无法找到足够的连续内存而不得不提前触发另一次垃圾收集动作。
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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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;继承是一个核心概念。主要作用将重复的…