TypeScript 中的内存管理:垃圾回收器如何工作

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

TypeScript 中的内存与垃圾回收器:幕后隐藏着什么?

\n\n

想象一下,你在建造一栋房子。你采购了砖块、水泥、钢筋——但如果不清理建筑垃圾,工地很快就会变成垃圾场。你的 TypeScript 代码也是如此。你创建了对象、数组、闭包——如果不及时释放内存,应用程序就会开始卡顿,最终甚至因 Out of Memory 错误而崩溃。

\n\n

在本文中,我们将深入探讨 TypeScript 中的内存管理 及其主要工具——垃圾回收器 是如何工作的。你将了解内存释放背后的机制、如何避免内存泄漏,以及为什么你的代码在你停止使用后仍可能“吞噬”大量内存。

\n\n

我们开始吧!

\n\n

TypeScript 如何管理内存?基础知识

\n\n

首先,重要的一点是:TypeScript 并不是一门独立的语言,而是 JavaScript 的超集。这意味着 TypeScript 中的内存和垃圾回收器 的工作方式与 JavaScript 完全相同。TypeScript 并没有引入新的内存管理机制,但它为我们提供了工具(类型、接口)来编写更安全的代码。

\n\n

在 JavaScript 中,内存主要分为两个区域:

\n\n
    \n
  • 栈(Stack) — 存储原始类型(数字、字符串、布尔值)以及对对象的引用。当函数执行完毕时,栈内存会自动释放。
  • \n
  • 堆(Heap) — 存储对象、数组、函数。垃圾回收器正是在这里工作。
  • \n
\n\n

当你编写以下代码时:

\n\n
const user = { name: 'Alice', age: 30 };
\n\n

变量 user 存储在栈中,并包含一个指向堆中对象的引用。只要存在引用,对象就存活。一旦引用消失,该对象就变成了“垃圾”。

\n\n

TypeScript 中的垃圾回收器:它是如何工作的?

\n\n

垃圾回收器(Garbage Collector, GC)是一个自动化的过程,它查找不再被引用的对象,并释放它们占用的内存。现代引擎(Chrome 中的 V8,Firefox 中的 SpiderMonkey)使用复杂的算法,但其基础是 标记-清除算法(Mark-and-Sweep)。

\n\n

它的工作原理如下:

\n\n
    \n
  1. GC 从“根”开始——全局对象、正在执行的函数中的局部变量。
  2. \n
  3. 它遍历从根出发的所有引用,并标记每个可达的对象。
  4. \n
  5. 所有未被标记的对象被视为垃圾并被删除。
  6. \n
\n\n

听起来很简单,但在实践中存在一些细微差别。例如,循环引用:

\n\n
function createCycle() {\n    const obj1: any = {};\n    const obj2: any = {};\n    obj1.ref = obj2;\n    obj2.ref = obj1;\n    return 'done';\n}
\n\n

过去,这种结构会导致内存泄漏,但现代垃圾回收器能够很好地处理循环——只要两个对象都从根节点不可达即可。

\n\n

TypeScript 应用程序中典型的内存泄漏

\n\n

即使有了智能的垃圾回收器,你仍然可能“踩坑”。以下是导致 TypeScript 内存泄漏 的最常见场景:

\n\n

1. 被遗忘的定时器和事件处理程序

\n\n

这是最常见的原因之一。你订阅了一个事件,却忘记取消订阅:

\n\n
class TimerComponent {\n    private intervalId: number;\n\n    start() {\n        this.intervalId = window.setInterval(() => {\n            console.log('Tick');\n        }, 1000);\n    }\n\n    // 忘记调用 stop() —— 定时器将永远存在!\n}
\n\n

解决方案:始终在 dispose 或 ngOnDestroy(针对 Angular)方法中清除定时器并取消事件订阅。

\n\n

2. 持有引用的闭包

\n\n

闭包是一个强大的工具,但它们可能会意外地持有大型对象:

\n\n
function createHeavyClosure() {\n    const hugeData = new Array(1000                

博客

书籍推荐