无需登录 数据私有 本地保存

简易 JS 内存性能分析器 - 对象分配追踪

89
0
0
0

堆内存(Heap Memory)是 JavaScript 引擎用于存储对象和闭包等引用类型数据的内存区域。与栈内存不同,堆内存的分配和释放由垃圾回收器自动管理。堆内存的大小直接影响应用的性能和稳定性。在 Chrome 中,可以通过 performance.memory API 获取堆内存使用情况(仅限 Chromium 内核浏览器)。

垃圾回收(Garbage Collection)是 JavaScript 引擎自动回收不再使用的内存的过程。现代 JavaScript 引擎使用分代回收策略:新生代(Young Generation)使用 Scavenge 算法快速回收短命对象;老生代(Old Generation)使用 Mark-Sweep-Compact 算法回收存活时间长的对象。Major GC 会暂停主线程(Stop-the-World),因此应避免过于频繁的触发。

内存泄漏(Memory Leak)是指程序未能释放不再使用的内存,导致可用内存逐渐减少。JavaScript 中常见的内存泄漏模式包括:意外的全局变量、被遗忘的定时器或回调、闭包引用未释放、DOM 引用未清除等。内存泄漏会导致应用性能下降,严重时可能导致浏览器崩溃。

FinalizationRegistry是 ES2021 引入的 API,允许注册对象被垃圾回收时的清理回调。它可以帮助开发者追踪对象的回收时机,验证垃圾回收是否按预期工作。需要注意的是,GC 的时机是不确定的,回调可能在对象变为不可达后的任意时刻触发。

WeakRef 和 WeakMap是 JavaScript 中的弱引用类型。WeakRef 允许创建对象的弱引用,不会阻止垃圾回收。WeakMap 的键必须是对象,且对键的引用是弱引用。这些类型在缓存和观察者模式等场景中非常有用,可以避免内存泄漏。

performance.memory是 Chrome 特有的 API,提供堆内存使用信息。usedJSHeapSize 表示当前使用的堆内存,jsHeapSizeLimit 表示堆内存上限。该 API 仅在 Chromium 内核浏览器中可用,是前端性能监控的重要数据源。

新生代和老生代(Young/Old Generation)是 V8 引擎的分代垃圾回收策略。新生代存放新创建的短命对象,使用 Scavenge 算法(半空间复制)快速回收,暂停时间极短。存活一定时间后,对象会被晋升到老生代。老生代存放长期存活的对象,使用 Mark-Sweep-Compact 算法回收。Major GC(老生代回收)会暂停主线程,但现代引擎通过增量标记和并发清扫等技术将暂停时间控制在毫秒级。了解分代策略有助于预测不同类型对象的回收时机。