我正在通过其任务管理器检查 Chrome 中特定选项卡的内存消耗。它向我展示了相当大量的 RAM 使用:
然而,当我在开发人员工具中拍摄堆快照时,它显示的大小要小几倍:
这个怎么可能?
并非浏览器分配的每一位内存都被堆上分配的 ECMAScript 对象使用。还有分配在堆栈上的 ECMAScript 对象、ECMAScript 运行时本身、下载的资源(HTML、CSS、ECMAScript、SVG、PNG、GIF、JPEG ……)、DOM 对象、显示树、显示缓冲区、缓存、浏览器本身等
此外,转储堆只会转储活动对象,而不转储垃圾,并压缩堆,因此即使“活动”堆本身也会比堆转储大,因为活动堆还包含尚未成为垃圾的死对象 -尚未收集,以及空闲内存的“漏洞”。
tl;dr:堆转储仅包含紧密打包在一起的活动对象。真正的堆还包含死对象和空洞,此外,除了 ECMAScript 堆之外,还有很多东西。