堆快照大小远小于使用的 RAM 容量

Heap snapshot size is lot less than volume of RAM used

我正在通过其任务管理器检查 Chrome 中特定选项卡的内存消耗。它显示了相当大的内存使用量:

然而,当我在 Developer Tools 中拍摄堆快照时,其显示的大小要小几倍:

怎么可能?

并非浏览器分配的每一位内存都被堆上分配的 ECMAScript 对象使用。还有在堆栈上分配的 ECMAScript 对象,ECMAScript 运行时本身,下载的资源(HTML,CSS,ECMAScript,SVG,PNG,GIF,JPEG,...),DOM对象、显示树、显示缓冲区、缓存、浏览器本身等

此外,转储堆只会转储活动对象,而不是垃圾,并且会压缩堆,因此即使 "live" 单独的堆也会比堆转储更大,因为活动堆还包含死对象尚未被垃圾收集,以及 "holes" 的可用内存。

tl;dr:堆转储仅包含紧密打包在一起的活动对象。 real 堆也包含死对象和漏洞,此外,还有很多不同于 ECMAScript 堆的东西。