Chrome 带有一些很棒的内置 CPU 和堆分析工具。 Firefox 现在有自己的内置 CPU 分析器,而 Firebug 有一个不同的。 IE(至少 10 个,我认为是 9 个)有一个内置的 CPU 分析器,尽管我已经很久没有深入研究了。
历史上,在浏览器中内存是一件很难追踪的事情,尤其是因为旧的 IE 版本不会死,而且只是因为看起来很有趣而泄漏。如果您面临这些内存泄漏之一,则需要不同的攻击计划。
但是,如果您怀疑自己的应用程序代码存在泄漏问题,Chrome 的开发工具可以提供帮助!在PRETTY(或DETAILED,如果您的屏幕非常宽)中编译,并在打开开发者工具的情况下在 Chrome 中打开您的应用。
在 Profiles 选项卡中,有三种要捕获的配置文件,两种是关于内存的。我通常更喜欢获取堆快照,并在“之前”和“之后”查看我认为会泄漏内存的任何操作,但记录堆分配视图将为您提供另一种考虑应用程序内存使用情况的方法。
首先选择一个所谓的“稳定”内存使用状态 - 打开应用程序,使用一段时间,确保所有各种单例等都已实例化,并可能执行您怀疑会导致问题的任何操作,一次。一旦您处于可以返回的位置(内存方面,至少在泄漏已修复的情况下),拍摄快照,执行泄漏行为,返回“稳定”状态,然后拍摄另一个快照。检查泄漏时只采取一步,稍后会详细介绍。
通过这两个快照,您可以比较分配和释放的对象 - 我们最感兴趣的是创建的对象多于删除的对象的情况,理想情况下删除的对象为零。如果你发现 N 个对象被删除但 N+1 个被创建,那么在挖掘之前确保 N 非常小 - 通常只能通过跟踪单个对象来修复泄漏,将它们追溯到它们的实际泄漏源,修复它,并再次测量。
一旦您有一个在一个步骤中创建的对象,但在该步骤结束时没有删除(但它应该已经删除),请使用“保留者”视图查看为什么它们仍然被保留。这将或多或少地向您显示保存它们的对象中的字段以及该保存对象的类型,一直到 window 或其他一些全局对象。
忽略 () 中的任何内容,例如 (compiled code)、(array)、(system)、(string) 等。我通常会忽略 dom 元素分配(假设您怀疑自己有应用程序代码中的泄漏,而不是 JSNI)。寻找泄漏的少数高级别对象,而不是许多低级别,这将使您更有可能更接近泄漏源。
PRETTY 中编译的构造函数和字段的名称通常与原始 Java 源非常接近。所有构造函数都将_X 附加到它们之后,其中X 是0、1 等——这是为了区别于类型本身。这为识别构造函数列中的 Java 类型提供了一种简单的方法,因为它们的名称末尾都有_s。