为什么IE11的“总内存”比堆快照大小大得多?

31

我正在调查IE下似乎存在的内存泄漏问题。 IE消耗的内存不断增长,最多可达1 GB或更多...

为了解决这个问题,我开始查看IE 11开发人员工具中的“内存”面板。 在那里,我看到浏览器的“总内存”从约300 MB增长到约1.3 GB(超过约20分钟)。

然而,我拍摄的堆快照每个只有15 MB到17 MB: IE 11 Total memory vs heaps snapshot size.

所以我甚至不想查看它们(因为与1 GB相比,15 MB太小了)。 因此,我不知道如何找到问题的根源。

坦白说,我的结论是要么它是浏览器的内存泄漏而不是页面本身导致的,要么我完全误解了开发人员工具告诉我的信息。实际上,在官方的开发人员工具文档中,描述的DT用例也显示出“总内存”和堆快照大小之间的巨大差异。 如果IE似乎没有显示它用于什么,如何调查非堆区域的错误?

顺便说一下:禁用插件后,行为完全相同。

1个回答

0

注意:微软已公开放弃IE,但在测试网页在未捆绑Edge的旧版Windows上使用Microsoft Web浏览器查看时仍然相关。

在Win32中(IE是Win32的一部分,但可能具有自己的差异),总内存使用包括使用各种Win32调用分配的内存,而堆内存仅包括使用堆Win32调用分配的内存。因此,在任何进程中,一些内存被分配到堆之外是完全合理的。最重要的内存分配函数不计入堆分配的大多数适用于每个64千字节或更大的大型分配,但有时也需要进行较小的分配(因为某些用途需要这些“大型分配”Win32调用的特定功能)。

在大多数程序中,最大的对象是“内存映射文件”,即允许程序像访问内存分配一样访问一个或多个文件(但在必要时不使用实际内存)。实际上,最常见的“内存映射文件”都是进程中所有DLL、EXE和OCX,每个文件都间接地映射到内存中以便使用。
另一种看似巨大(但实际上廉价)的分配是现代安全机制之一使用的特殊分配,以防止远程攻击使用“返回式编程”来运行不应直接运行的随机字节。
第三种大型分配的方式是Win32位图操作API的特殊方式。例如,如果页面上有大型JPG,则解压缩位图的内存通常将分配在堆外,并且仅计入“总内存”。某些IE版本还使用实际页面的大型位图图像,以允许更快速地向上或向下滚动页面。
要找出IE进程中实际分配了什么内容以及这些分配中包含了什么,需要使用专为调试IE本身设计的工具深入了解。最强大的(但不太用户友好)工具是Microsoft WinDbg,它包含在Microsoft平台SDK中(一个多GB的安装包)。可能还有其他工具(至少曾经有),可以比使用WinDbg并逐个检查每个分配更轻松地检查分配。

现在回到简单的步骤。判断是否存在内存泄漏的方法是查看在单个IE(或任何其他程序)运行期间相同情况之间数字是否不断增长。对于像IE这样的Web浏览器,一个测试是在同一页面之间来回导航。另一个测试是在同一域中导航到完全空白的页面,该页面仅具有最少的HTML标记,没有脚本、CSS、图像、格式或文本(这与导航到about:blank不同)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接