<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>浏览器的垃圾回收机制 on Last Stand</title><link>https://amatsuzero.github.io/LastStand/tags/%E6%B5%8F%E8%A7%88%E5%99%A8%E7%9A%84%E5%9E%83%E5%9C%BE%E5%9B%9E%E6%94%B6%E6%9C%BA%E5%88%B6/</link><description>Recent content in 浏览器的垃圾回收机制 on Last Stand</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Thu, 17 Jul 2025 00:00:00 +0800</lastBuildDate><atom:link href="https://amatsuzero.github.io/LastStand/tags/%E6%B5%8F%E8%A7%88%E5%99%A8%E7%9A%84%E5%9E%83%E5%9C%BE%E5%9B%9E%E6%94%B6%E6%9C%BA%E5%88%B6/index.xml" rel="self" type="application/rss+xml"/><item><title>浏览器的垃圾回收机制</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/performance/performance-003/</link><pubDate>Tue, 17 Dec 2024 00:00:00 +0800</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/performance/performance-003/</guid><description>&lt;p&gt;浏览器的垃圾回收（Garbage Collection, GC）机制是前端性能优化和内存管理的重要基础。&lt;/p&gt;
&lt;h2 id="一垃圾回收的基本概念"&gt;一、垃圾回收的基本概念&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;目的&lt;/strong&gt;：自动回收不再使用的内存，避免内存泄漏，保证浏览器性能稳定。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GC 触发&lt;/strong&gt;：当浏览器检测到内存不足或特定条件时，启动垃圾回收过程。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="二主要垃圾回收算法"&gt;二、主要垃圾回收算法&lt;/h2&gt;
&lt;h3 id="1-标记清除mark-and-sweep"&gt;1. 标记清除（Mark-and-Sweep）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;浏览器从**根对象（Global、执行上下文中的变量）**开始，标记所有可达对象。&lt;/li&gt;
&lt;li&gt;没被标记的对象被认为不可达，即不再被使用，进行回收。&lt;/li&gt;
&lt;li&gt;是现代 JS 引擎普遍采用的算法。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="2-引用计数reference-counting"&gt;2. 引用计数（Reference Counting）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;每个对象维护引用计数，引用增加时计数+1，引用消失时计数-1。&lt;/li&gt;
&lt;li&gt;计数为 0 的对象立即回收。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;缺陷：无法处理循环引用&lt;/strong&gt;，现代引擎一般不单独使用。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="三垃圾回收的触发时机"&gt;三、垃圾回收的触发时机&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;内存分配达到一定阈值时自动触发。&lt;/li&gt;
&lt;li&gt;主动调用相关接口（如 Chrome DevTools 手动触发）。&lt;/li&gt;
&lt;li&gt;页面卸载时进行清理。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="四内存泄漏常见原因"&gt;四、内存泄漏常见原因&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;全局变量未释放&lt;/strong&gt; 全局变量一直被引用，无法回收。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;闭包导致的变量无法释放&lt;/strong&gt; 闭包作用域内变量被外部引用。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;定时器未清除&lt;/strong&gt; &lt;code&gt;setInterval&lt;/code&gt;、&lt;code&gt;setTimeout&lt;/code&gt; 未正确清除，导致引用保留。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DOM 节点引用未释放&lt;/strong&gt; JS 中持有对已删除 DOM 的引用。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;事件监听未移除&lt;/strong&gt; 绑定事件后，未及时解绑，导致内存无法回收。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="五性能优化建议"&gt;五、性能优化建议&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;避免不必要的全局变量。&lt;/li&gt;
&lt;li&gt;使用完定时器及时清除。&lt;/li&gt;
&lt;li&gt;解绑不再使用的事件监听。&lt;/li&gt;
&lt;li&gt;谨慎使用闭包，避免无用变量持久存在。&lt;/li&gt;
&lt;li&gt;小心操作 DOM，及时释放引用。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="常见考点"&gt;常见考点&lt;/h2&gt;
&lt;p&gt;面试中考察点主要包括 GC 的原理、算法、触发时机、内存泄漏原因及避免方法：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;浏览器垃圾回收的原理和常见算法？&lt;/li&gt;
&lt;li&gt;标记清除与引用计数的区别与优缺点？&lt;/li&gt;
&lt;li&gt;什么是内存泄漏？常见的内存泄漏类型？&lt;/li&gt;
&lt;li&gt;如何避免内存泄漏？&lt;/li&gt;
&lt;li&gt;JS 引擎如何判断对象是否可回收？&lt;/li&gt;
&lt;li&gt;浏览器中 GC 触发的时机？&lt;/li&gt;
&lt;li&gt;如何用 Chrome DevTools 监测内存泄漏？&lt;/li&gt;
&lt;li&gt;事件监听和闭包如何导致内存泄漏？&lt;/li&gt;
&lt;/ol&gt;</description></item></channel></rss>