JavaScript Core -- 垃圾回收机制

HDMI与DisplayPort混搭方案:如何用Xilinx Video PHY Controller实现多协议视频接口转换 本文详细解析了如何利用Xilinx Video PHY Controller IP核实现HDMI与DisplayPort协议转换,涵盖混合视频接口架构设计、GT收发器动态重配置策略及跨协议时钟域处理方案。通过实战案例和配置技巧,帮助开发者构建高性能多协议视频转换系统,适用于医疗影像、工业控制等场景。 阅读详情

JavaScript 垃圾回收

和C#、Java一样JavaScript有自动垃圾回收机制,也就是说执行环境会负责管理代码执行过程中使用的内存,在开发过程中就无需考虑内存分配及无用内存的回收问题了。JavaScript垃圾回收的机制很简单:找出不再使用的变量,然后释放掉其占用的内存,但是这个过程不是时时的,因为其开销比较大,所以垃圾回收器会按照固定的时间间隔周期性的执行。

变量生命周期

有同学看了上面就会问了,什么叫不再使用的变量?不再使用的变量也就是生命周期结束的变量,当然只可能是局部变量,全局变量的生命周期直至浏览器卸载页面才会结束。局部变量只在函数的执行过程中存在,而在这个过程中会为局部变量在栈或堆上分配相应的空间,以存储它们的值,然后再函数中使用这些变量,直至函数结束

一旦函数结束,局部变量就没有存在必要了,可以释放它们占用的内存。貌似很简单的工作,为什么会有很大开销呢?这仅仅是垃圾回收的冰山一角,例如闭包,貌似函数结束了,其实还没有,垃圾回收器必须知道哪个变量有用,哪个变量没用,对于不再有用的变量打上标记,以备将来回收。用于标记无用的策略有很多,常见的有两种方式

标记清除(mark and sweep)

这是JavaScript最常见的垃圾回收方式,当变量进入执行环境的时候,比如函数中声明一个变量,垃圾回收器将其标记为“进入环境”,当变量离开环境的时候(函数执行结束)将其标记为“离开环境”。至于怎么标记有很多种方式,比如特殊位的反转、维护一个列表等,这些并不重要,重要的是使用什么策略,原则上讲不能够释放进入环境的变量所占的内存,它们随时可能会被调用的到。

垃圾回收器会在运行的时候给存储在内存中的所有变量加上标记,然后去掉环境中的变量以及被环境中变量所引用的变量(闭包),在这些完成之后仍存在标记的就是要删除的变量了,因为环境中的变量已经无法访问到这些变量了,然后垃圾回收器相会这些带有标记的变量机器所占空间。

引用计数(reference counting)

在低版本IE中经常会出现内存泄露,很多时候就是因为其采用引用计数方式进行垃圾回收。引用计数的策略是跟踪记录每个值被使用的次数,当声明了一个变量并将一个引用类型赋值给该变量的时候这个值的引用次数就加1,如果该变量的值变成了另外一个,则这个值得引用次数减1,当这个值的引用次数变为0的时候,说明没有变量在使用,这个值没法被访问了,因此可以将其占用的空间回收,这样垃圾回收器会在运行的时候清理掉引用次数为0的值占用的空间。

看起来也不错的方式,为什么很少有浏览器采用,还会带来内存泄露问题呢?主要是因为这种方式没办法解决循环引用问题。比如对象A有一个属性指向对象B,而对象B也有有一个属性指向对象A,这样相互引用

function test(){
            var a={};
            var b={};
            a.prop=b;
            b.prop=a;
}

这样a和b的引用次数都是2,即使在test()执行完成后,两个对象都已经离开环境,在标记清除的策略下是没有问题的,离开环境的就被清除,但是在引用计数策略下不行,因为这两个对象的引用次数仍然是2,不会变成0,所以其占用空间不会被清理,如果这个函数被多次调用,这样就会不断地有空间不会被回收,造成内存泄露。

在IE中虽然JavaScript对象通过标记清除的方式进行垃圾回收,但BOM与DOM对象却是通过引用计数回收垃圾的,也就是说只要涉及BOM及DOM就会出现循环引用问题。看上面的例子,有同学回觉得太弱了,谁会做这样无聊的事情,其实我们是不是就在做

window.onload=function outerFunction(){
        var obj = document.getElementById("element");
        obj.onclick=function innerFunction(){};
};

这段代码看起来没什么问题,但是obj引用了document.getElementById("element"),而document.getElementById("element")的onclick方法会引用外部环境中的变量,自然也包括obj,是不是很隐蔽啊。

解决办法

最简单的方式就是自己手工解除循环引用,比如刚才的函数可以这样

window.onload=function outerFunction(){
        var obj = document.getElementById("element");
        obj.onclick=function innerFunction(){};
       obj=null;
};

什么时候触发垃圾回收

垃圾回收器周期性运行,如果分配的内存非常多,那么回收工作也会很艰巨,确定垃圾回收时间间隔就变成了一个值得思考的问题。IE6的垃圾回收是根据内存分配量运行的,当环境中存在256个变量、4096个对象、64k的字符串任意一种情况的时候就会触发垃圾回收器工作,看起来很科学,不用按一段时间就调用一次,有时候会没必要,这样按需调用不是很好吗?但是如果环境中就是有这么多变量等一直存在,现在脚本如此复杂,很正常,那么结果就是垃圾回收器一直在工作,这样浏览器就没法儿玩儿了。

微软在IE7中做了调整,触发条件不再是固定的,而是动态修改的,初始值和IE6相同,如果垃圾回收器回收的内存分配量低于程序占用内存的15%,说明大部分内存不可被回收,设的垃圾回收触发条件过于敏感,这时候把临界条件翻倍,如果回收的内存高于85%,说明大部分内存早就该清理了,这时候把触发条件置回。这样就使垃圾回收工作智能了很多。

疑难问题(二)——PyTorch 2.3.0 ‘import torch‘ 错误排查:深入解析‘shm.dll‘加载失败与系统路径修复 本文深入解析了在Windows系统上安装PyTorch 2.3.0后,执行'import torch'时遇到的'shm.dll'加载失败错误(OSError)。该问题通常源于系统DLL搜索路径缺失,导致无法找到关键的共享内存通信组件或其依赖项。文章提供了核心解决方案:通过手动修改PyTorch的`__init__.py`文件,将用户基目录下的Library\bin路径添加到DLL搜索列表中,从而从根本上修复此导入错误,并给出了详细的修改步骤和验证方法。 阅读详情

相关推荐

QT绘制饼图+柱状图+折线图

使用qt绘制,折线图,饼图,柱状图,多柱状图

梅山 3878

JavaScript垃圾回收机制

在JavaScript中,垃圾回收(Garbage Collection)是一种自动内存管理机制,它可以自动地识别不再使用的变量和对象并将它们从内存中清除,以释放内存空间。

杨树林er的博客 8822

Dynamics 365 On-Premise Server v9.0部署体验

期盼已久的Dynamics 365 On-Premise的版本升级终于在11月初姗姗来迟。 11月2日起已经可以在官方渠道下载正式版的Dynamics 365 Server v9.0安装文件,版本号9.0.2,随手附上中文版安装文件下载地址。 想必已经有不少小伙伴开始尝试各种升级、安装了吧。 Dynamics 365 On-Premise的安装过程,度娘一下已经有很多了,这里就不赘述了,只是...

Roger的专栏 2138

JS垃圾回收机制

说到栈内的内存,操作系统会自动进行内存分配和内存释放,而堆中的内存,由JS引擎(如Chrome的V8)手动进行释放,当我们的代码没有按照正确的写法时,会使得JS引擎的垃圾回收机制无法正确的对内存进行释放(内存泄露),从而使得浏览器占用的内存不断增加,进而导致JavaScript和应用、操作系统性能下降。在JavaScript中,其实绝大多数的对象存活周期都很短,大部分在经过一次的垃圾回收之后,内存就会被释放掉,而少部分的对象存活周期将会很长,一直是活跃的对象,不需要被回收。最后,懒性清理也是有缺陷的。

weixin_50975172的博客 654

视觉SLAM十四讲--第13讲 实践:设计SLAM系统(最详细的代码调试运行步骤)

最详细的代码调试运行避坑说明,也包含了我自己对代码的理解,如有理解错误的地方,欢迎指正交流。

记录和分享 1万+

用AI生成React/Vue页面?实测Locofy等5款工具,教你选最适合的

本文深度评测了2024年五大AI生成前端页面工具,包括Locofy、Builder.io等,从代码质量、可视化编辑器成本到企业级落地方案进行全面分析。通过实测数据和实战案例,揭示如何利用AI生成技术高效创建React/Vue页面,提升开发效率并优化性能。

m5n6o7的博客 606

垃圾回收

文章目录标记清理引用计数性能内存管理通过const和let声明提升性能隐藏类和删除操作内存泄漏静态分配与对象池 JavaScript是使用垃圾回收的语言,也就是说执行环境负责在代码执行时管理内存。JavaScript通过自动内存管理实现内存分配和闲置资源回收。基本思路:确定哪个变量不会在使用,然后释放它占用的内存。这个过程是周期性的,即垃圾回收程序每个一定时间(或者在代码执行过程中某个预定的收集时间)就会自动运行。垃圾回收过程是一个近似且不完美的方案,因为某块内存是否还有用,属于“不可判定”的问题,意味着靠

weixin_49917840的博客 465

Playwright爬虫实战:破解动态网页懒加载与无限滚动

本文介绍了使用Playwright处理懒加载和无限滚动页面的完整解决方案。摘要如下: 问题分析:传统爬虫无法获取JS动态渲染内容,Playwright能模拟真实浏览器行为解决此类问题。 核心原理: 懒加载:资源延迟加载,滚动触发 无限滚动:滚动到底部异步加载新内容 技术方案: 分段滚动页面并等待加载 动态监测页面高度变化 合理设置等待和终止条件 代码实现: 提供图片懒加载和无限滚动列表的完整可运行代码 包含异常处理和性能优化建议 关键优势: 比传统爬虫更可靠 支持复杂交互场景 完善的错误处理机制 该方法已在

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 523

【JavaScript】垃圾回收机制详解

在编程语言中,内存管理是一个非常重要的方面。JavaScript 作为一种高级语言,开发者不需要手动管理内存的分配和释放。垃圾回收机制是 JavaScript 引擎中的一部分,负责自动回收那些不再被使用的内存,确保内存资源得到有效利用,避免内存泄漏。简单来说,当程序中某些对象不再被引用时,这些对象所占用的内存就会被视为“垃圾”,垃圾回收器会负责释放这些内存,使其可以被重新利用。JavaScript 的垃圾回收机制是自动内存管理的重要组成部分,它通过回收不再使用的对象来保证程序的内存使用效率。

lph159的博客 4035

2、MOSFET基本物理效应及其BSIM4模型解析

本文深入探讨了MOSFET的基本物理效应及其在BSIM4模型中的数学表述,涵盖门和沟道的几何结构、温度依赖性、材料模型选项、阈值电压计算、以及其他关键物理效应如LDD电阻、有限电荷厚度、有效迁移率等。同时解析了机械应力、邻近效应及布局依赖效应对MOSFET性能的影响,并通过参数表和建模流程提供了精确建模的指导,旨在帮助读者优化MOSFET器件性能与可靠性。

purple的博客 564

Linux内核驱动模型--PCIe(PCI Express)驱动​​

本文系统介绍了Linux内核中PCIe驱动的设计与实现。首先从架构定位入手,指出PCIe驱动基于PCI子系统扩展支持高速、低功耗特性。核心数据结构struct pci_driver包含设备匹配表id_table、生命周期函数probe/remove等关键组件。文章详细解析了驱动与设备的绑定流程、资源管理机制,并重点阐述了MSI-X中断、电源管理、热插拔和多队列等高级特性实现方案。最后提供了lspci、dmesg等调试工具的使用方法,总结了PCIe驱动在支持高性能设备中的关键作用。全文通过架构设计、核心结构、

amy_mhd的博客 425

JavaScript-垃圾回收机制(GC)

垃圾回收的几种方式:标记清除法、引用计数法、分代式垃圾回收

十二的博客 8497

HFSS实战项目——微带带通滤波器设计

本文详细介绍并设计了一款微带带通滤波器,通过HFSS三位电磁仿真软件对其进行仿真设计及优化,仿真结果表明,本文设计的滤波器表现出优良的滤波性能,符合设计要求。

2401_87464239的博客 5391

dojo学习

Dojo是一个用javascript语言实现的开源DHTML工具包。Dojo的目标是解决开发DHTML应用程序遇到的那些,长期存在、历史问题(historical problems with DHTML)。跨浏览器问题。 Dojo是一个强大的面向对象JavaScript框架。主要由三大模块组成:Core、Dijit、DojoX。Core提供Ajax,events,packaging,CSS-ba...

GIS学习 763

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

.NET周刊【1月第3期 2025-01-19】

国内文章互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(一):从.NET IoT入门开始https://www.cnblogs.com/GreenShade/p/18667671文章介绍了一款基于树莓派Zero 2W和.NET技术的智能桌面机器人。作者因对该项目的兴趣与网友需求而进行开发。产品结合了两个显示屏、舵机、语音模块等,实现了多种功能。文章详细描述了树莓派的操作系...

dotNET跨平台 375

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

javaScript core 之匿名函数和垃圾回收

匿名函数:  WHAT: 定义函数时,不指定函数名的函数  WHEN: 一个函数只使用一次时  WHY: 节约内存  HOW: 2种:       1. 回调函数: 定义函数后,自己不执行,交给别的函数,由别的函数控制调用和执行过程。        2. 匿名函数自调: 函数定义后,自己调用自己!        为什么: 全局变量,用完,无法自动释放!污染全局!        解决...

Bohn的博客 614

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

WebContainer Core架构深度剖析:浏览器原生Node.js运行时引擎的技术实现

WebContainer Core作为StackBlitz推出的革命性技术栈,正在重新定义云端开发环境的构建范式。这项核心技术通过将完整的Node.js运行时环境嵌入浏览器,实现了无需服务器基础设施即可在Web端运行完整开发工作流的技术突破。对于技术决策者和架构师而言,WebContainer Core代表了云原生开发环境的未来方向,为构建交互式编程教育平台、在线代码编辑器、实时协作开发环境等应用

gitblog_00398的博客 1236

Dart SDK VM垃圾回收机制揭秘:Scavenger、标记清除与Compactor三阶段设计完全解析

Dart SDK 是 Dart 语言官方开发工具包,其中的 **Dart VM 垃圾回收(GC)** 采用分代收集架构:新生代由并行的半空间 **Scavenger** 回收,老生代则由**并发标记-清除(Mark-Sweep)** 或 **标记-压缩(Mark-Compact,Compactor)** 处理。本文将带你快速看懂这三套核心回收算法的设计思路、安全点(Safepoint)与写屏障(W

gitblog_02850的博客 808

rquickjs性能优化实战:10个提升JavaScript执行效率的技巧

rquickjs作为High level bindings to the quickjs javascript engine,为开发者提供了高效的JavaScript执行环境。本文将分享10个实用技巧,帮助你充分发挥rquickjs的性能潜力,显著提升JavaScript代码的执行效率。 ## 1. 合理配置内存分配策略 内存管理是提升rquickjs性能的基础。rquickjs提供了灵活的内

gitblog_00996的博客 356

js面试问题笔记(一)

js面试问题笔记(一)

qq_42750608的博客 1510

GC垃圾回收机制深度解析:从原理到实战调优

垃圾回收(GC)是现代编程语言中自动内存管理的核心机制,它通过追踪对象引用关系,自动识别并回收不再使用的内存空间。其工作原理主要基于引用追踪算法,如标记-清除、复制算法和分代收集,旨在解决手动内存管理中的内存泄漏和悬垂指针问题。GC的技术价值不仅在于提升开发效率,更通过优化内存分配策略和空间局部性,显著影响程序性能与系统稳定性。在应用场景上,无论是JVM中的G1、ZGC收集器,还是Go、Python等语言的运行时环境,GC都是构建高并发、高可用分布式系统的基石。本文结合线上故障案例,深入探讨GC Overh

weixin_30905133的博客 360

JavaScript Core -- 理解闭包

关于javascript的一些总结,持续更新中

hellobeifeng的专栏 925

ES 新特性与 TypeScript、JS 性能优化> 内容概要-直播

20201109 直播 零、答疑 使用原型和不使用原型 “对原型添加方法更好”,有疑惑,我在方法里面做一些访问属性的操作后,发现原型添加方法更消耗性能 https://jsbench.me/ function Person (id) { this.id = id } Person.prototype.say = function () { console.log(this.id, 'say~') } var p = new Person(Date.now()) p.say()//p等于 Per.

weixin_45345105的博客 264

MAS激活脚本:Windows 10/11与Office一键永久激活,4种方式免费全解

MAS激活脚本(Microsoft Activation Scripts)是一款免费开源工具,提供4种激活方式,双击运行就能完成Windows 10/11与Office的永久激活,无需注册、无需付费。 ## 刚装完系统,右下角那个水印怎么破? 新电脑装完Windows,或者公司换了一批新Office,最头疼的事莫过于激活。找卡号?贵。网上下各种破解工具?不安全还一堆广告。手动配KMS服务器?普

gitblog_00747的博客 259

Onyx运行时架构深度剖析:WebAssembly执行原理与多平台适配

Onyx作为一款现代编程语言,其核心优势在于通过自定义后端编译为WebAssembly,实现了跨平台的高效执行。本文将深入解析Onyx运行时架构的内部机制,包括WebAssembly模块的编译流程、执行原理以及多平台适配策略,帮助开发者全面理解Onyx程序的运行机制。 ## WebAssembly执行原理:从编译到运行的完整流程 Onyx的编译过程始于源代码到WebAssembly模块的转换。

gitblog_00581的博客 795

如何快速上手rquickjs:5分钟搭建你的第一个Rust-JS混合应用 [特殊字符]

想要在Rust应用中嵌入JavaScript引擎?rquickjs正是你需要的解决方案!这个强大的Rust库提供了对QuickJS JavaScript引擎的高层绑定,让你轻松构建Rust与JavaScript混合应用。无论你是想要扩展Rust应用的功能,还是希望在JavaScript环境中调用高性能的Rust代码,rquickjs都能帮你快速实现。 ## ✨ rquickjs的核心优势 rq

gitblog_00748的博客 429
上一篇: JavaScript Core -- 数组
下一篇: JavaScript Core -- 继承机制
阿懒先生
博客等级 码龄15年 12粉丝 34原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值