当前位置: 首页 > 知识库问答 >
问题:

javascript - 关于前端内存相关的问题?

郜卓君
2024-01-05
class B { }class A {  constructor() {    this.b = new B()  }}class BList {  constructor() {    this.values = []  }  push(b) {    this.values.push(b)  }}const aArray = Array(1000).fill('').map(() => new A())var bList = new BList()//aArray.forEach(a => { bList.push(a.b) })

图片
在放开最后一行注释后执行 : A的引用内存反而降低了,A对B的引用好像并没有解除,为什么会降低内存了?
图片

为什么A对象的内存降低了呢

共有1个答案

关玄裳
2024-01-05

在JavaScript中,对象的内存占用不仅仅取决于该对象本身,还与其引用的其他对象有关。当一个对象被引用时,JavaScript的垃圾回收器不会回收这个对象,因为其他对象可能需要它。在你的例子中,当aArray存在时,每一个A对象都有一个对B对象的引用,这使得B对象不能被垃圾回收。

当你取消最后一行注释后,你实际上是在创建一个新的BList对象,这个对象存储了所有A对象的b属性。这意味着B对象现在被BList对象引用,而不仅仅是A对象。由于BList对象仍然存在,垃圾回收器不能回收这些B对象。

但是,当aArray不再需要时(例如,当你离开当前作用域或者你明确地将其设为null),这些A对象就不再引用任何东西。因为它们不再直接或间接地引用任何东西,垃圾回收器可以安全地回收这些对象和它们引用的B对象。这就是为什么你看到内存使用量下降了。

所以,尽管A对象的内存降低了,但这是因为A对象的引用已经不存在了,而不是因为A对象释放了对B对象的引用。实际上,A对象仍然持有对B对象的引用,直到A对象本身被垃圾回收。

 类似资料:
  • <script setup lang="ts"> import UserCommodityInfo from "@/store/home/commodity/Info.ts"; import { storeToRefs } from "pinia"; import CardChild from './CardChild/index.vue' import { ref, onMounted } fr

  • 问题描述 我想将前端获取到的文件通过POST请求作为请求体参数传给后端,但是传过去之后发现文件是个空对象{} 问题出现的环境背景及自己尝试过哪些方法 问过chatgpt和查阅的一些资料后我尝试将File对象转化为Blob对象然后再传给后端,结果发现还是空对象{};之后我又尝试通过FormData来作为POST请求体参数可还是无济于事 相关代码 以下是nodejs后端对路由的统一处理:

  • 网站搭建萌新,有些疑惑希望大佬们可以解答: nginx、tomcat与云服务器(如阿里云、腾讯云等)、机房实体服务器有啥区别? 搭建网站的时候什么时候用nginx和tomcat,以及详细原因(比如为啥tomcat大多用于前端到后端的中间件,而nginx为啥大多用于用户到浏览器的中间件?) 搭建网站,前后端分别部署在不同服务器上,以前端访问后端为例,在已实现跨域的前提下,能否通过 前端向后端服务器的

  • 前言 时间戳是很多应用系统,特别是加密货币开发设计中非常重要的元素。各种语言都提供了相应的时间处理函数,以前直接拿来就用了,也没有发现什么问题。但是在时间处理上,开发语言核心模块提供的个别Api并没有完全延续人类习惯。在Javascript语言里,有一个Date类的函数就非常奇葩,网络上很多文档的举例都是错误的,因此需要简单总结一下。 这似乎不是什么大问题,但是从stackoverflow.com

  • 项目是 Umi 创建的,用的路由插件是 react-router-dom。 有两个页面,第一个页面通过 Link 组件跳转到第二个页面,第二页页面是 router 文件夹里的 router-page,第一个页面的代码如下: .umirc 里也的路由也添加好了: 可以成功的从第一页跳转到第二页。 然后第二页 router-page.tsx 里的代码如下: 页面显示如下: 现在的问题是,我点击“关于”

  • 我无法理解纱线配置。 我在纱线/MapReduce配置中有这样的行: 这里写着: 默认情况下(“yarn.nodemanager.vmem-pmem-ratio”)设置为2.1。这意味着map或reduce容器最多可以分配2.1倍(“MapReduce.reduce.memory.MB”)或(“MapReduce.map.memory.MB”)的虚拟内存,然后NM才会杀死该容器。 我能得到更好的解