【问题标题】:Does changing a variable's type cause memory leaks?更改变量的类型会导致内存泄漏吗?
【发布时间】:2017-05-16 23:00:10
【问题描述】:

我喜欢 JavaScript 的松散类型。

不过说实话,我在使用它时很少考虑内存管理。

创建变量时,即使在 JS 中,也会为该变量分配一定数量的内存。然而,JavaScript 中的变量是可变的。当变量从一种类型更改为另一种类型时会发生什么?

例如:

var a = "hello world"; //~22 bytes
a = 10;                //now 'a' is only 8 bytes

剩余的 14 个字节会被垃圾回收吗?还是这会导致内存泄漏?

【问题讨论】:

  • 奇怪的问题。如果像这样的简单代码导致内存泄漏,那么您如何在计算机不死机的情况下使用大多数网站?
  • 没有。基本上所有此类语言中的变量都是作为对堆中类型化内存缓冲区的引用来实现的。当值改变时,变量只是简单地改变以引用堆中的另一个对象。如果变量是对对象的最后一个引用,那么无论使用什么引用计数/垃圾收集机制,最终都应该启动并释放该堆内存。
  • 上述唯一的例外是,在某些语言运行时中,具有固定大小的简单类型(如布尔值、整数和浮点数)直接存储在变量“中”;即通常包含指向堆的指针的字段包含数据并且以某种方式标记为这样。
  • @Linuxios: ↓↓↓↓↓↓
  • @boundry:你指的是什么?我已经赞成你的回答;我只是想我会添加一些关于机制的内容。

标签: javascript memory-management memory-leaks


【解决方案1】:

没有。基本上所有此类语言中的变量都是作为对堆中类型化内存缓冲区的引用来实现的。当值改变时,变量只是简单地改变以引用堆中的另一个对象。如果变量是对该对象的最后一个引用,那么无论使用什么引用计数/垃圾收集机制,最终都应该启动并释放该堆内存。

上述情况的唯一例外是,在某些语言运行时中,具有固定大小的简单类型(如布尔值、整数和浮点数)直接存储在“变量”中;即通常包含指向堆的指针的字段包含数据并且以某种方式标记为这样。

【讨论】:

    【解决方案2】:

    不,JavaScript 语言中没有内置内存泄漏(根本没有对内存分配提出任何要求)。

    如果一个实现在显示的代码上存在内存泄漏,那么它是(非常)错误的。

    很可能底层引擎中的某些对象被一个新对象完全替换,并且逻辑“引用”重新指向替换对象。

    【讨论】:

    • JavaScript 中实际上存在内存泄漏。也就是说,我认为您的回答可能是关于在其他地方替换和创建的变量是正确的。你碰巧有这方面的参考吗?
    • 不,JavaScript 中没有内存泄漏。同样,该语言甚至没有内存分配的概念。泄漏的引擎(显然)是错误的。我猜您指的是创建循环引用时会发生什么;这是您的程序中的错误,而不是语言中的错误!
    • 不,我没有参考资料;解开编译器和 JavaScript 引擎的工作方式远远超出了 Stack Overflow 答案的范围。因此“最有可能”。可以这么说,在 JavaScript 中赋值给一个变量不会泄漏内存,我不知道你为什么认为它会。
    • 我想也许我们在争论同样的事情。虽然语言本身有垃圾收集器,但用 JavaScript 编写的程序仍然可能存在内存泄漏。 ibm.com/developerworks/web/library/wa-memleak
    • @itcropper:同样,该语言没有垃圾收集器,就像英语没有拼写检查器一样。当然,如果你的英语不是很好,拼写错误仍然是可能的。 :)
    猜你喜欢
    • 2023-03-28
    • 2010-10-25
    • 2021-03-23
    • 2021-09-25
    • 2014-12-08
    • 1970-01-01
    • 1970-01-01
    • 2010-09-09
    相关资源
    最近更新 更多