内存分析简介
在这个系列的原文博客文章中,你将学习如何收集有关程序与内存交互的高层次信息。这个过程通常被称为内存分析。内存分析帮助你理解应用程序随时间变化的内存使用情况,并帮助你构建程序行为的正确心理模型。以下是它可以回答的一些问题:
- 程序的总内存消耗是多少,以及它随时间如何变化?
- 程序何时何地进行堆分配?
- 哪些代码位置分配了最大量的内存?
- 程序每秒访问多少内存?
当开发者谈论内存消耗时,他们通常指的是堆使用情况。实际上,堆是大多数应用程序中最大的内存消费者,因为它容纳了所有动态分配的对象。但堆并不是唯一的内存消费者。为了完整性,让我们提及其他内存消费者:
- 栈:应用程序中帧栈使用的内存。应用程序中的每个线程都有自己的栈内存空间。通常,栈的大小只有几MB,如果超出限制,应用程序将崩溃。总的栈内存消耗与系统中运行的线程数量成正比。
- 代码:用于存储应用程序及其库的代码(指令)的内存。在大多数情况下,它对内存消耗的贡献不大,但也有例外。例如,Clang C++编译器和Chrome浏览器拥有庞大的代码库,它们的二进制文件中有数十MB的代码段。
接下来,我们将介绍内存使用(memory usage)和内存足迹(memory footprint)或者翻译成内存占用这两个术语,并看看如何对它们进行分析。
注: 主要是通过工具分析内存使用情况,尽量利用局部性原理:时间局部性和空间局部性,提高性能。