php中文网/汕头seo托管

php中文网,汕头seo托管,wordpress官方程序下载,沈阳工程信息交易网前言 垃圾回收是一种自动内存管理机制,用于检测和清除不再使用的对象,以释放内存空间。当一个对象不再被引用时,垃圾回收器会将其标记为垃圾,然后在适当的时候清除这些垃圾对象,并将内存回收给系统以供其他对象使用。…

前言

垃圾回收是一种自动内存管理机制,用于检测和清除不再使用的对象,以释放内存空间。当一个对象不再被引用时,垃圾回收器会将其标记为垃圾,然后在适当的时候清除这些垃圾对象,并将内存回收给系统以供其他对象使用。

什么是"对象不再被引用"?

当一个对象不再被任何变量或属性引用时,它就成为垃圾。例如,当一个函数执行完毕后,其中创建的局部变量将成为垃圾,因为它们无法再被访问到。

"适当的时候"是指什么时候?

首先 JavaScript 引擎会定期找出垃圾,也会在内存使用量到达某一阈值或内存分配失败时去找垃圾,还有一些其他的机制这里不做拓展。

JavaScript 引擎是如何找到并清理垃圾的?

有两种方式:标记清除法和引用计数法。现在大都用的是标记清除法,因为引用计数法在处理循环引用时存在问题。

对于栈中的垃圾和堆中的垃圾,清理时有什么区别?

当我们在 JavaScript 中讨论垃圾回收机制时,主要关注的是堆内存中的回收机制。栈内存的管理是由编译器和解释器自动进行的,当执行上下文被销毁时,其所占用的栈内存会自动被回收。

栈中的垃圾清理堆中的垃圾清理
存储内容基本类型数据、函数调用上下文复杂数据结构(对象和数组)
管理方式自动管理,由编译器和解释器负责依赖垃圾回收机制,自动回收不再被引用的对象
垃圾清理方式无需显式清理,执行上下文销毁时自动释放内存通过垃圾回收机制周期性检查并回收不再被引用的对象内存

标记清除

它分为两个阶段:标记阶段和清除阶段。

  1. 标记阶段: 在标记阶段,垃圾回收器会对内存中的所有对象进行遍历,从根对象开始(通常是全局对象)递归地遍历对象的引用关系。对于每个被访问到的对象,垃圾回收器会给它打上标记,表示该对象是可达的,即不是垃圾。这个过程确保了所有可达对象都会被标记。

  2. 清除阶段: 在清除阶段,垃圾回收器会遍历整个内存,对于没有标记的对象,即被判定为垃圾的对象,会被立即回收,释放内存空间。这样,只有被标记的对象会被保留在内存中,而垃圾对象会被清除。
    在这里插入图片描述
    上图中蓝色的元素代表被访问到的对象,即可达对象,灰色代表没有被访问到的对象,即不可达对象

如何理解"递归地遍历对象的引用关系"?

在 JavaScript 中,内存中的对象通过引用关系相互连接,形成了复杂的引用图。

当 JavaScript 代码执行时,会创建各种对象,包括全局对象、函数对象、数组对象、普通对象等等。这些对象在内存中占据一定的空间。

随着程序的执行,对象之间会建立引用关系。这种引用关系通常是通过将一个对象的引用赋值给另一个对象的属性、局部变量或函数的参数来实现的。

例如你在全局作用域中写了这行代码 var obj = {},这就代表着你给全局对象设置了一个 obj 属性;再例如一个函数将一个对象作为参数,实际上传递的是对象的引用…这些都会成为引用关系的一部分。通过这些引用关系,JavaScript 引擎会动态地构建一个复杂的引用图。这个引用图以根对象为起点,通过对象之间的引用关系不断扩展和延伸。

标记阶段完成之后,如果其中一个变量不再被引用了,此时该变量还是被标记状态的,那么清除阶段怎么识别它呢?

在本次清除阶段识别不了,但是在下一轮的标记阶段,该变量不会被打上标记,那它就可以被清除啦。

如果一个变量在标记阶段没有被引用,它没有被打上标记,但是在清除阶段之前,它又被引用了,那它会被视作垃圾回收吗?

无需担心,现代垃圾回收器通常会使用各种策略(如写屏障、增量标记、并发标记等)来跟踪引用变化,不会错误地回收仍然被引用的对象。

如何理解根对象?

根对象通常包括以下几类:

  1. 全局对象:在浏览器中全局对象是 window(Node.js 中是 global),它包含了全局作用域中定义的所有属性和方法。全局对象总是可达的,因为它是程序的入口点之一,这也意味着全局对象永远不会被垃圾回收机制视为垃圾对象来回收。

  2. 活跃的执行上下文(Execution Contexts) :可以理解为当前正在执行或即将执行的代码块所对应的执行上下文。"活跃的执行上下文"可以是全局执行上下文,也可以是某个函数执行上下文,具体取决于当前执行的代码块。全局对象其实就是全局执行上下文中的一个组成部分。

  3. 内置的持久性引用:有些 JavaScript 引擎可能会维护一些内置的、持久的引用,这些引用指向的对象也会被视为根对象。例如,一些引擎可能会将当前执行的栈帧或特定类型的内部数据结构保留在内存中,以便进行调试或性能分析。

引用计数

它的策略是每个对象维护一个计数器来记录其被引用的次数,当对象被新引用时计数加 1,当引用被移除时计数减 1,当计数减至 0 时对象被自动回收。

两者优缺点比较

标记清除:

  • 优点:

    • 简单有效

    • 可以处理循环引用

  • 缺点:

    • 标记清除算法会暂停程序的执行,也就是说垃圾回收过程中会停顿

    • 标记清除算法会在回收过程中产生大量的不连续的、碎片化的内存空间,从而使得内存的利用率降低。

引用计数:

  • 优点:

    • 简单高效

    • 实时回收:用计数可以在对象不再被引用时立即回收,不需要等待垃圾收集器的运行。

  • 缺点:

    • 循环引用:当两个或多个对象相互引用时,它们的引用计数都不为零,即它们无法被回收,这会导致内存泄漏

哪些操作会导致内存泄漏?

全局变量导致内存泄漏

如果意外地将变量声明为全局变量(例如,在函数外部或在函数内部但未使用 varletconst 声明的变量),那么这些变量在程序的整个生命周期内都将保持活动状态,可能导致内存泄漏。

function myFunction() {  a = "I am a global variable now!"; // 忘记使用 var, let 或 const
}  myFunction();  
// 此时 a 成为了全局变量,即使函数执行完毕,a 也不会被回收

闭包

function createLeakyClosure() {var localVar = "我是局部变量,但由于闭包,我可能导致内存泄漏";// 返回一个匿名函数,该函数引用了localVarreturn function() {return localVar;};
}// 外部引用闭包
var closure = createLeakyClosure();// 如果 closure 不再需要,但由于它是闭包,它仍然持有对 localVar 的引用,
// 这可能导致 localVar 占用的内存无法被回收,直到 closure 被明确置为 null 或 undefined。

DOM 引用未释放

如果一个 DOM 元素被从 DOM 树中移除,但仍有 JavaScript 变量或对象保持对该 DOM 元素的引用,那么这块 DOM 元素占用的内存(包括其属性、事件监听器等)将不会被垃圾回收机制回收,从而造成了内存泄漏。

例如有一个长时间存活的对象(如全局对象),它有一个属性的值是该 DOM 元素,即使你通过操作 DOM 树删除了该 DOM 元素,该 DOM 元素所占据的内存空间不会被视作垃圾回收,直到这个长时间存活的对象被销毁。

定时器/计时器

没有清除定时器,导致计时器持续运行,占用内存空间,导致内存泄漏。尤其是在 vue 中,最好是在 beforeDestory() 中清除定时器。

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

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

相关文章

(七)趣学设计模式 之 适配器模式!

目录 一、 啥是适配器模式?二、 为什么要用适配器模式?三、 适配器模式的实现方式1. 类适配器模式(继承插座 👨‍👩‍👧‍👦)2. 对象适配器模式(插座转换器 &#x1f50c…

内网穿透:打破网络限制的利器

目录 深入理解内网穿透 内网与外网的奥秘 内网穿透的原理剖析 总结与展望 在如今这个数字化时代,网络已经成为我们生活和工作中不可或缺的一部分。但你是否遇到过这样的困扰:在家办公时,想要访问公司内部的文件服务器,却因为网…

html css js网页制作成品——HTML+CSS甜品店网页设计(5页)附源码

目录 一、👨‍🎓网站题目 二、✍️网站描述 三、📚网站介绍 四、🌐网站效果 五、🪓 代码实现 🧱HTML 六、🥇 如何让学习不再盲目 七、🎁更多干货 一、👨‍&#x1f…

初阶数据结构(C语言实现)——3顺序表和链表(2)

2.3 数组相关面试题 原地移除数组中所有的元素val,要求时间复杂度为O(N),空间复杂度为O(1)。OJ链接 力扣OJ链接-移除元素删除排序数组中的重复项。力扣OJ链接-删除有序数组中的重复项合并两个有序数组。力扣OJ链接-合并两个有序数组 2.3.1 移除元素 1…

ubuntu终端指令集 shell编程基础(一)

磁盘指令 连接与查看:磁盘与 Ubuntu 有两种连接方式;使用ls /dev/sd*查看是否连接成功,通过df系列指令查看磁盘使用信息。若 U 盘已挂载,相关操作可能失败,需用umount取消挂载。磁盘操作:使用sudo fdisk 磁…

基于Spark的电商供应链系统的设计与实现

目录 1.研究背景与意义 2、国内外研究现状 3、相关理论与技术 (一)分布式计算系统Spark (二)数据仓库Hive (三)读取服务器本地磁盘的日志数据Flume (四)分布式消息队列Kafka …

使用TortoiseGit配合BeyondCompare实现在Git仓库中比对二进制文件

使用TortoiseGit的比对工具可以直接右键,点击选择比对和上一版本的变化差异: 但是TortoiseGit只能支持比对纯文本文件的变化差异,如果尝试比对二进制文件,会提示这不是一个有效的文本文件: BeyondCompare可以比对二进制…

BladeX框架接口请求跨域

前端使用代理请求接口,接口可以正常访问。如果换全路径请求就跨域。 除了后端要配置跨域 还需要修改配置文件对OPTIONS请求的限制

在VSCode中使用MarsCode AI最新版本详解

如何在VSCode中使用MarsCode AI:最新版本详解与使用场景 在当今快速发展的软件开发领域,人工智能(AI)技术的应用已经变得越来越普遍。ByteDance推出的MarsCode AI是一款强大的AI编程助手,旨在帮助开发者更高效地编写代…

mac修改docker的daemon.json 镜像文件

1、找到daemon.json文件的位置 docker info 可以看出位置在: /Users/spuer/.docker 2. 进入daemon.json 所在的目录: cd /Users/spuer/.docker3. 查看daemon.json的内容: more daemon.json可以看出,没有配置registry-mirrors&…

【大语言模型】【整合版】DeepSeek 模型提示词学习笔记(散装的可以看我之前的学习笔记,这里只是归纳与总结了一下思路,内容和之前发的差不多)

以下是个人笔记的正文内容: 原文在FlowUs知识库上,如下截图。里面内容和这里一样,知识排版好看一点 一、什么是 DeepSeek 1. DeepSeek 简介 DeepSeek 是一家专注于通用人工智能(AGI)的中国科技公司,主攻大模型研发与…

additional-spring-configuration-metadata.json实现springboot自定义提示

在配置additional-spring-configuration-metadata.json文件后,在开发人员的IDE工具使用个人编写的配置读取很有效的在application.properties或application.yml文件下完成提示。 配置元数据文件位于jar下面。 META-INF/spring-configuration-metadata.json它们使用简…

Dify在Ubuntu20.04系统的部署

文章目录 一、dify 介绍1.核心功能优势2.应用场景 二、dify 安装(docker方式)1.代码库下载2.配置文件修改3.启动docker 容器 三、遇到问题与解决1.使用sudo docker compose up -d报错2.使用service docker start报错 一、dify 介绍 Dify 是一款开源的大语言模型(LL…

kafka-关于ISR-概述

一. 什么是ISR ? Kafka 中通常每个分区都有多个副本,其中一个副本被选举为 Leader,其他副本为 Follower。ISR 是指与 Leader 副本保持同步的 Follower 副本集合。ISR 机制的核心是确保数据在多个副本之间的一致性和可靠性,同时在 …

.Net 9下使用Tensorflow.net---DNN_Keras

.Net 9下使用Tensorflow.net---DNN_Keras 1、创建应用,导入依赖2、编写代码1)添加引用2)创建基础对象3)初始化数据集4)重点步骤:创建 Keras下的DNN模型5)训练模型得到评估值6)结果输…

重大更新!锂电池剩余寿命预测新增 CALCE 数据集

往期精彩内容: 单步预测-风速预测模型代码全家桶-CSDN博客 半天入门!锂电池剩余寿命预测(Python)-CSDN博客 超强预测模型:二次分解-组合预测-CSDN博客 VMD CEEMDAN 二次分解,BiLSTM-Attention预测模型…

开发一个交易所需要哪些技术?

在当今数字化时代,交易所作为金融市场的重要组成部分,其技术架构和功能的复杂性日益增加。无论是传统的股票、期货交易所,还是新兴的数字货币交易所,开发一个高效、安全、可靠的交易所系统都是一个复杂而系统的工程。本文将深入探…

【Maui】系统找不到指定的文件Xamarin.Android.Aapt2.targets

文章目录 前言一、问题描述二、解决方案三、软件开发(源码)四、项目展示 前言 .NET 多平台应用 UI (.NET MAUI) 是一个跨平台框架,用于使用 C# 和 XAML 创建本机移动和桌面应用。 使用 .NET MAUI,可从单个共享代码库开发可在 And…

GDidees CMS v3.9.1本地文件泄露漏洞(CVE-2023-27179)

漏洞简介: GDidees CMS v3.9.1及更低版本被发现存在本地文件泄露漏洞,漏洞通过位于 /_admin/imgdownload.php 的 filename 参数进行利用。 漏洞环境: 春秋云镜中的漏洞靶标,CVE编号为CVE-2023-27179 漏洞复现: 进入靶场发现没…

【问题记录】Go项目Docker中的consul访问主机8080端口被拒绝

【问题记录】Go项目Docker中的consul访问主机8080端口被拒绝 问题展示解决办法 问题展示 在使用docker中的consul服务的时候,通过命令行注册相应的服务(比如cloudwego项目的demo_proto以及user服务)失败。 解决办法 经过分析,是…