堆的自动管理


由于程序员必须编写出到分配和释放存储器的明确的调用,所以用m a l l o c和f r e e完成指针的动态分配和重新分配是管理堆的手工( m a n u a l )方法。相反地,运行时栈则是由调用序列自动地( a u t o m a t i c a l l y )管理。在一种需要完全动态的运行时环境的语言中,堆也必须类似地自动管理。然而尽管在每个过程调用中可以很方便地调度对m a l l o c的调用,但是由于活动记录必须要持续到其所有的引用都消失为止,所以退出时却很难调度对f r e e的调用。因此,自动存储器管理涉及到了前面分配的但不再使用的存储器的回收,可能是在它被分配的很久以后,而没有明确的对f r e e的调用。这个过程称作垃圾回收(garbage collection)。
在存储块不再引用时,无论是直接还是通过指针间接的引用,识别是一项比维护堆存储块的列表复杂得多的任务。标准的技术是执行标识和打扫(mark and sweep)垃圾回收。在这种方法中,直到一个对m a l l o c的调用失败之前都不会释放存储器,在这时将垃圾回收程序激活,寻找可被引用的所有存储器并释放所有未引用的存储器。这是通过两遍来完成的。第1遍递归地顺着所有的指针前进,从所有当前的可访问指针值开始,并标出到达的每个存储器块。这个过程要求额外的位存储标识。另一个遍则线性地打扫存储器,并将未标出的块返回到自由存储器中。虽然这个过程通常要寻找足够的相邻自由存储器以满足一系列的新要求,但存储器仍有可能是非常破碎,故尽管是在垃圾回收之后,大的存储请求仍旧会失败。因此,垃圾回收经常也会通过将所有的分配的空间移到堆的末尾,以及在另一端留下相邻的自由空间的唯一一个大型块而执行存储器压缩(memory compaction)。这个过程还必须在存储器中更新对那些在执行程序时被移掉的区域的所有引用。
标识和打扫垃圾回收有若干个缺点:它要求额外的存储(用于标识),在存储器中的两个遍导致了过程中很大的延迟,有时需要几秒钟,而每一次调用垃圾回收程序又都需要几分钟时间。这对于那些许多涉及到了交互和即时响应的应用程序显然是不合适的。可以通过将可用的存储器分为两个部分并每次只从一个部分中分配存储来对这个过程进行改进。在标识遍时,将所有到达了的块都复制到未被使用的另一半存储器中。这就意味着在存储时不再要求额外的标识位而且一个遍就够了。它还自动地进行压缩。一但位于使用的区域中的所有可到达的块都复制好时,就将使用的和未使用的存储器部分相互交换,而过程依然继续进行。这种方法称作停机和复制( s t o p - a n d - c o p y )或二部空间(two space)垃圾回收。然而它对存储回收中的过程延迟改进不大。
最近又提出了一个大大减少延迟的方法,称为生育的垃圾回收(generational garbage collection),它将一个永久的存储区域添加到前一段描述的回收方案中。将存在时间足够长的被分配的对象只复制到永久空间中,并在随后的存储回收时不再重新分配。这就意味着垃圾回收程序在更新的存储分配时只需要搜索存储器中的很小的一个部分。当然永久存储器也有可能由于不可达到的存储而用尽,但这相对于前面的问题就不那么严重了,这是因为临时存储会很快消失,而可被分配的存储则总会有的。人们已证明了这个处理很好,在虚拟存储系统中尤为如此。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/85037.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/85037.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

智能出入库管理系统:自动化管控平台

部队装备库室智能管控系统是集智能化、集成化、网络化于一体的综合管理系统,由智慧营区库室综合管控平台、出入口控制子系统、智能QD柜子系统、装备物资管理子系统、视频监控系统、入侵报警子系统、环境监测子系统等七大核心子系统构成。各子系统通过数据自动交互&a…

归并排序:高效分治的艺术

归并排序(Merge Sort)原理详解 归并排序是一种基于分治法(Divide and Conquer)的高效排序算法,由冯诺依曼于1945年提出。它的核心思想是将大问题分解为小问题,解决小问题后再合并结果。 核心原理 1. 分治策略(Divide and Conquer) 分(Divide):将无序数组递归地拆…

知识库建设方案有哪些?全面解析

知识库建设方案主要包括本地部署方案、云端在线方案、混合部署方案。其中,云端在线方案以其灵活性、实时更新能力和低维护成本,逐渐成为大多数企业的首选方案。云端在线方案可随时随地提供实时更新的知识内容,确保企业员工和客户始终获得最新…

政务大厅智能引导系统:基于数字孪生的技术架构与实践

本文面向政务信息化开发者、系统集成工程师、智能导视领域技术人员。解析政务大厅智能引导系统的技术实现路径,提供从定位导航到数据驱动的技术方案,助力解决传统导视系统效率低下、体验不佳的技术痛点。 一、技术架构全景:从物理空间到数字映…

java设计模式[2]之创建型模式

文章目录 一 创建型模式1.1 单例模式的设计与实现1.1.1 饿汉式模式1.1.2 懒汉式单例模式1.1.3 懒汉式单例模式完善1.1.4 双重检测锁式1.1.4.1 volatile关键字1.1.4.2 在双重检查锁定中的作用 1.1.5 静态内部类式单例模式1.1.6 枚举式单例模式1.1.7 反射暴力破解解决方案1.1.8 序…

PHP设计模式实战:构建高性能API服务

在前一篇电子商务系统设计的基础上,我们将深入探讨如何运用设计模式构建高性能、可扩展的API服务。现代Web应用越来越依赖API作为前后端分离架构的核心,良好的API设计对系统性能和维护性至关重要。 仓库模式实现数据访问层 仓库模式(Repository Pattern)可以抽象数据访问逻…

ComfyUI Flux.1 ACE++ 图像编辑原理详解

关注不迷路,点赞走好运!!! ComfyUI Flux.1 ACE 图像编辑原理详解 ——从“拼图游戏”到“魔法画笔”的技术革命 目录 ACE 的核心思想:用“指令”指挥图像生成 1.1 什么是上下文感知内容填充?1.2 条件单元&…

Datawhale-爬虫

task1-初始爬虫 爬虫用python好,python库多,功能全 反爬机制和反反爬机制 顾名思义,一个是防范爬虫的,一个是应对限制爬虫的方法 好的,我们来更深入地探讨反爬机制和反反爬策略的细节,包括具体的技术手段…

双token三验证(Refresh Token 机制​)

单token存在的问题 我们都知道,token是我们在前后端数据传输的时候为了保证安全从而必须需要进行设置的东西,他的主要作用实际上就是为了保证我们的数据安全,进行身份验证和授权,并且相对于session而言更加适合如今的分布式系统&a…

青少年编程与数学 01-011 系统软件简介 22 VMware 虚拟化软件

青少年编程与数学 01-011 系统软件简介 22 VMware 虚拟化软件 一、历史沿革(一)创立阶段(1998-2003)(二)快速扩张(2004-2010)(三)云时代转型(2011…

FPGA基础 -- Verilog门级建模之奇偶校验电路

✅ 一、什么是奇偶校验(Parity Check) 📌 定义: 奇偶校验是一种错误检测编码方式,用于判断一个二进制数据在传输或存储过程中是否发生了单比特错误。 奇校验(Odd Parity):总共有奇…

UWB协议精读:IEEE 802.15.4z-2020,15. HRP UWB PHY, STS, HRP-ERDEV, BPRF, HPRF,

跟UWB相关的IEEE标准主要有2个: 1,IEEE 802.15.4-2020 2,IEEE 802.15.4z-2020 IEEE Std 802.15.4z™ ‐ 2020 Amendment 1: Enhanced Ultra Wideband (UWB) Physical Layers (PHYs) and Associated Ranging Techniques scrambled timestamp sequence (STS): A sequence of…

6.IK分词器拓展词库

比如一些行业专业词汇、简单无意义词(例如:的、得、地、是等)、网络流行词、后来形成的词、再或者一些禁忌词(比如:领导人的名字、黄赌毒犯罪等词要排除的) 在es的插件目录下查找配置文件: 找到IKAnalyzer…

Web3-Web3.js核心操作:Metamask、合约调用、事件订阅全指南

Web3-Web3.js核心操作:Metamask、合约调用、事件订阅全指南 我们做了Solidity的合约代码,但是合约仅仅是一个后端逻辑;我们想要让用户来操作你的逻辑还需要做一个基本的网页。如果要做一个基本的网页,我们就要使用到以太坊基金发布…

四色(定理/猜想)染色算法小软件Version1.11

四色(定理/猜想)染色算法小软件Version1.11 2025.6.16 开发者:路人甲/打酱油 增加了【自思肯普法】 为什么加上【自思】两字?因为我也看不明英文的PDF的四色定理证明文档,分什么成千上百种类来证明。我就是百度下,看相关介绍&am…

【Linux驱动开发 ---- 2_深入理解内核模块】

Linux驱动开发 ---- 2_深入理解内核模块 目录 Linux驱动开发 ---- 2_深入理解内核模块学习目标时间安排建议 理论学习1. 什么是内核模块?2. 模块加载与卸载3. 内核模块开发基础 实践任务任务1:准备开发环境任务2:编写简单内核模块任务3&#…

Linux SUID提权 案例以及知识点提高分析

目录 📚 Linux SUID 提权原理与红队实践 🚀 概述 🛠️ SUID 提权原理 核心机制 技术栈 🔍 案例背景:sudo -l 与 .monit 脚本 案例信息 脚本内容 🧪 提权步骤分解 📋 1. 检查 sudo 权限…

S参数与串扰-信号完整性分析

S参数与串扰: 四端口网络S参数中,仍表示反射,表示信号的传输。根据S参数的定义,和两个参数的含义为 当只有端口1有正弦信号激励源时,从端口3和端口4出来的正弦信号只能是互连结构内部耦合过来的,因此表示的是近端串扰…

Android OkHttp 框架超时设置详解

OkHttp 提供了四种不同的超时设置,每种针对网络请求的不同阶段: 1. callTimeout (调用超时) 作用:控制整个调用从开始到结束的总时间,包括所有重定向和重试 默认值:0 (不超时) 场景:当你希望限制整个请求…

如何让LLM通过反思来提升生成sql的正确率 - 以Gemini生成sql为例

什么是Agent Reflection 通常指 “智能体反思”,即让 AI 系统通过自我反思机制优化决策或任务处理过程,类似人类通过复盘改进策略。 创建一个 SQL Agent 导入相关的库 import openai import pandas as pd import sqlite3 from util.get_schema impor…