<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>内存管理 on Zampo Blog</title><link>https://blog.cpdd.fyi/tags/%E5%86%85%E5%AD%98%E7%AE%A1%E7%90%86/</link><description>Recent content in 内存管理 on Zampo Blog</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Fri, 17 Apr 2026 18:00:00 +0800</lastBuildDate><atom:link href="https://blog.cpdd.fyi/tags/%E5%86%85%E5%AD%98%E7%AE%A1%E7%90%86/index.xml" rel="self" type="application/rss+xml"/><item><title>99% 的开发者不懂堆内存，你真的懂吗？</title><link>https://blog.cpdd.fyi/posts/heap-memory-deep-dive/</link><pubDate>Fri, 17 Apr 2026 18:00:00 +0800</pubDate><guid>https://blog.cpdd.fyi/posts/heap-memory-deep-dive/</guid><description>&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;func&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;example&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;问你一个问题：这个 &lt;code&gt;x&lt;/code&gt; 是在堆上还是在栈上？&lt;/p&gt;
&lt;p&gt;如果你答&amp;quot;栈上&amp;quot;，你错了——至少在这段代码里，Go 编译器会把 &lt;code&gt;x&lt;/code&gt; 分配到堆上。&lt;/p&gt;
&lt;p&gt;为什么？因为它的地址逃逸了函数。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;99% 的开发者不懂堆内存&lt;/strong&gt;——不是不懂 &lt;code&gt;malloc&lt;/code&gt; 和 &lt;code&gt;free&lt;/code&gt;，是不懂分配器、碎片化、逃逸分析、GC 代价这些让堆变得迷人的底层细节。&lt;/p&gt;
&lt;p&gt;你可能觉得内存管理就是&amp;quot;分配&amp;quot;和&amp;quot;释放&amp;quot;这么简单，也可能不在意这些底层细节。但如果你不懂我刚才说的那些术语，或者想深入了解堆内存，这篇就是为你写的。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="一堆-vs-栈核心差异在哪"&gt;一、堆 vs 栈：核心差异在哪&lt;/h2&gt;
&lt;p&gt;先说结论。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;栈内存&lt;/strong&gt;是程序内存中用于存储局部变量的区域，&lt;strong&gt;堆内存&lt;/strong&gt;是用于动态分配的区域。&lt;/p&gt;
&lt;p&gt;听起来简单，但 99% 的开发者忽略了两者的本质差异。&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;差异点&lt;/th&gt;
 &lt;th&gt;栈（Stack）&lt;/th&gt;
 &lt;th&gt;堆（Heap）&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;管理方式&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;后进先出（LIFO），编译器自动管理&lt;/td&gt;
 &lt;td&gt;运行时管理，分配器或 GC 管理&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;分配速度&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;极快，编译器确切知道值存储在哪里、存活多久&lt;/td&gt;
 &lt;td&gt;慢，涉及元数据、可能的线程同步、GC&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;生命周期&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;函数结束时自动释放&lt;/td&gt;
 &lt;td&gt;可以比创建它的函数活得更久&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;大小限制&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;相对较小，通常几 MB&lt;/td&gt;
 &lt;td&gt;更大、更灵活，可向 OS 请求更多&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;碎片化&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;无&lt;/td&gt;
 &lt;td&gt;有，频繁分配释放会产生碎片&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;栈的工作方式：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;每次函数调用都会压入一个帧（frame），包含局部变量，返回时弹出。这个过程是严格的后继先出，所以极快。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;堆的工作方式：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;堆是一个更灵活但代价更高的空间。当程序运行时需要按需分配内存——比如那些可能比当前函数存活更久的对象，或者大小可以增长的集合——堆就是这些内存的来源。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.cpdd.fyi/images/heap-memory-deep-dive/stack-vs-heap.svg" alt="堆栈结构对比图"&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;关键区别在于生命周期：&lt;/strong&gt; 栈变量在函数结束时消失，但堆对象可以比创建它的函数活得更久。&lt;/p&gt;</description></item></channel></rss>