js内存管理系列篇一:内存分析

简介: 我是web光明顶一期的学生,本文是对深究JS原理这个阶段的分析。

我是web光明顶一期的学生,本文是对深究JS原理这个阶段的分析。


在js里面,内存的概念大都被忽略了,大家都知道js是门高级语言,有自动的垃圾回收机制,所以很多人理所当然的觉得这个事情是不需要我们管的,那么你就大错特错了。


像C语言这样的底层语言一般都有底层的内存管理接口,比如 malloc()和free()。相反,java,JavaScript是在创建变量(对象,字符串等)时自动进行了分配内存,并且在不使用它们时“自动”释放。 释放的过程称为垃圾回收。这个“自动”是混乱的根源,并让JavaScript(和其他高级语言)开发者错误的感觉他们可以不关心内存管理。那么,就存在了很大一个误区:我们以为我们压根就不用管内存这一块,所以一直都没注意,所以会导致一系列问题,比如内存泄漏。

1.png


日常碰到的问题


1. 问题一

写了一个for循环,不小心写成了个死循环,发现浏览器卡死了,为什么?这个就是因为不停的循环,变量一直在递增。把内存耗没了。可能大家还不知道什么问题,你都找不到问题在哪。你还以为是下小电影的时候把电脑搞中毒了。


2.问题二

写游戏程序的时候,这个内存问题尤为突出,如果发生了卡顿或者延迟,这个很大几率就是内存不足的问题,我们可能定义了很多全局变量,或者闭包,使用完之后却没有回收,那么它将一直存在于内存中,甚至发生内存泄漏。


3.问题三

喜欢看斗鱼直播或其它直播的朋友,大家是不是有碰到过这个问题?页面看久了忽然崩掉了,需要重新刷新,产生这种问题的原因可能有两个,1是内存持续增加没有去清理,崩掉了。2是flash里的bug 产生的内存泄露。


由此可见,内存是和性能直接相关的,是非常重要的一环。

那我们就来讲一讲内存


内存模型(堆与栈)


js中并没有严格意义上区分栈内存与堆内存。因此我们可以粗浅的理解为js的所有数据都保存在堆内存中。但是在某些场景,我们仍然需要基于堆栈数据结构的思路进行处理。


那么先来讲一讲它的内存空间存储原理

2.png

为什么要把它类比成乒乓球盒子?


这种乒乓球的存放方式与栈中存取数据的方式是一样的。处于盒子中最顶层的乒乓球c,它一定是最后被放进去,但可以最先被使用。而我们想要使用底层的乒乓球I,就必须将上面的4个乒乓球取出来,让乒乓球1处于盒子顶层。这就是栈空间先进后出,后进先出的特点。图中已经详细的表明了栈空间的存储原理。


队列与堆栈


队列: 是一种支持先进先出(FIFO)的集合,即先被插入的数据,先被取出

堆栈: 是一种支持后进先出(LIFO)的集合,即后被插入的数据,先被取出


js数组实现队列和堆栈的功能

 //队列 先进先出
 let arr = new Array();
  arr.unshift(1);
  arr.unshift(2);
  arr.unshift(3);
  arr.pop();
  console.log(arr);
  //堆栈 先进后出
  let arr2 = new Array();
  arr2.push(1);
  arr2.push(2);
  arr2.push(3);
  arr2.pop();
  console.log(arr2);

队列应用场景

比如说我们常用的QQ 它有一个回收机制大家知道吧,当长时间未登录的时候 就收回去 删掉这个用户 重新拿出来卖钱(一般是靓号) 美滋滋,那肯定是先排序,看谁未登录的时间最长,就先把它干掉 是不是 不可能是我上一秒刚登陆和个靓妹聊天 下一秒就把我干掉了 那我还不报警

这个时候就用队列方法 从前往后面删 我们的数据库存了用户 当库存不下了 也是这么操作的


堆栈应用场景

比如说我们做了一个楼盘预售活动 名额100,报名200个,这个时候也就是从后往前删,先报名的保留。后面报名的逐个删除。


内存分配


这是两道道关于内存面试题,当我进行如下操作时,这时候,b是多少?

 let a = 10;
 let b = a;
 b = 20;

在变量对象中的数据发生复制行为时,系统会自动为新的变量分配一个新值。给它新建一块内存空间

let b = a执行之后,a与b虽然值都等于10,但是他们其实已经是相互独立互不影响的值了。具体如图。所以我们修改了b的值以后,a的值并不会发生变化。

这是基本数据类型的相关操作。3.png

那么如果是这样的情况呢?引用类型,这时候的obj.aa为多少?

  let obj = {aa:20,bb:30};
  let obk = obj;
   obk.aa = 10;

通过let obk = obj;执行一次复制引用类型的操作。引用类型的复制同样也会为新的变量自动分配一个新的值保存在变量对象中,

但不同的是,这个新的值,仅仅只是引用类型的一个地址指针。

当地址指针相同时,尽管他们相互独立,但是在变量对象中访问到的具体对象实际上是同一个。因此当我改变obk时,obj也发生了变化。这就是引用类型的特性。如图所示。4.png


4.png

目录
相关文章
|
5月前
|
存储 弹性计算 缓存
阿里云服务器ECS经济型、通用算力、计算型、通用和内存型选购指南及使用场景分析
本文详细解析阿里云ECS服务器的经济型、通用算力型、计算型、通用型和内存型实例的区别及适用场景,涵盖性能特点、配置比例与实际应用,助你根据业务需求精准选型,提升资源利用率并降低成本。
426 3
|
1月前
|
设计模式 缓存 Java
【JUC】(4)从JMM内存模型的角度来分析CAS并发性问题
本篇文章将从JMM内存模型的角度来分析CAS并发性问题; 内容包含:介绍JMM、CAS、balking犹豫模式、二次检查锁、指令重排问题
92 1
|
2月前
|
运维 监控 JavaScript
基于 Node.js 图结构的局域网设备拓扑分析算法在局域网内监控软件中的应用研究
本文探讨图结构在局域网监控系统中的应用,通过Node.js实现设备拓扑建模、路径分析与故障定位,提升网络可视化、可追溯性与运维效率,结合模拟实验验证其高效性与准确性。
209 3
|
4月前
|
存储 人工智能 自然语言处理
AI代理内存消耗过大?9种优化策略对比分析
在AI代理系统中,多代理协作虽能提升整体准确性,但真正决定性能的关键因素之一是**内存管理**。随着对话深度和长度的增加,内存消耗呈指数级增长,主要源于历史上下文、工具调用记录、数据库查询结果等组件的持续积累。本文深入探讨了从基础到高级的九种内存优化技术,涵盖顺序存储、滑动窗口、摘要型内存、基于检索的系统、内存增强变换器、分层优化、图形化记忆网络、压缩整合策略以及类操作系统内存管理。通过统一框架下的代码实现与性能评估,分析了每种技术的适用场景与局限性,为构建高效、可扩展的AI代理系统提供了系统性的优化路径和技术参考。
233 4
AI代理内存消耗过大?9种优化策略对比分析
|
8月前
|
数据采集 前端开发 JavaScript
金融数据分析:解析JavaScript渲染的隐藏表格
本文详解了如何使用Python与Selenium结合代理IP技术,从金融网站(如东方财富网)抓取由JavaScript渲染的隐藏表格数据。内容涵盖环境搭建、代理配置、模拟用户行为、数据解析与分析等关键步骤。通过设置Cookie和User-Agent,突破反爬机制;借助Selenium等待页面渲染,精准定位动态数据。同时,提供了常见错误解决方案及延伸练习,帮助读者掌握金融数据采集的核心技能,为投资决策提供支持。注意规避动态加载、代理验证及元素定位等潜在陷阱,确保数据抓取高效稳定。
255 17
|
8月前
|
存储 Java
课时4:对象内存分析
接下来对对象实例化操作展开初步分析。在整个课程学习中,对象使用环节往往是最棘手的问题所在。
|
8月前
|
Java 编译器 Go
go的内存逃逸分析
内存逃逸分析是Go编译器在编译期间根据变量的类型和作用域,确定变量分配在堆上还是栈上的过程。如果变量需要分配在堆上,则称作内存逃逸。Go语言有自动内存管理(GC),开发者无需手动释放内存,但编译器需准确分配内存以优化性能。常见的内存逃逸场景包括返回局部变量的指针、使用`interface{}`动态类型、栈空间不足和闭包等。内存逃逸会影响性能,因为操作堆比栈慢,且增加GC压力。合理使用内存逃逸分析工具(如`-gcflags=-m`)有助于编写高效代码。
165 2
|
11月前
|
存储 监控 算法
Java内存管理深度剖析:从垃圾收集到内存泄漏的全面指南####
本文深入探讨了Java虚拟机(JVM)中的内存管理机制,特别是垃圾收集(GC)的工作原理及其调优策略。不同于传统的摘要概述,本文将通过实际案例分析,揭示内存泄漏的根源与预防措施,为开发者提供实战中的优化建议,旨在帮助读者构建高效、稳定的Java应用。 ####
192 35
|
12月前
|
存储 缓存 监控
如何使用内存监控工具来优化 Node.js 应用的性能
需要注意的是,不同的内存监控工具可能具有不同的功能和特点,在使用时需要根据具体工具的要求和操作指南进行正确使用和分析。
314 31
|
12月前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
394 1

热门文章

最新文章