-
Notifications
You must be signed in to change notification settings - Fork 0
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
如何使用chrome查内存泄漏 #8
Comments
mark~ |
mark |
看到 An interesting kind of JavaScript memory leak 这篇post
通过Memory的比较视图查看内存泄露原因
概念(compiled code): 编译后的js代码 Context Variable
Context每个function在创建时,都会创建一个lexical environment,它存在一个parent context的引用。闭包创建的时候,v8会生成一个Context对象,这个对象里有所有这个闭包需要的绑定。
Reference |
缘由
vue一个issue,看到作者改动,只添加了一行代码(大神就是大神,仅仅一行代码,但是这行代码背后值得我去研究下),那么大神是怎么找到这个原因的呢?
我自己跟踪了这个issue里面的提供的reproduce link,从这个页面下手的。
想看内存是否泄漏了,可以从3个地方看:
如何使用memory快照定位内存泄漏
Overview
直观感受:
任务管理器
Memory 原生内存,DOM节点存储在这里
JS Memory 列表示 JS 堆。此列包含两个值。 您感兴趣的值是实时数字(括号中的数字)。 实时数字表示您的页面上的可到达对象正在使用的内存量。 如果此数字在增大,要么是正在创建新对象,要么是现有对象正在增长。
Timeline
节点数是和代码对应的,如果内存慢慢增加,说明有泄漏。
Step:
打开record开关
按照issue里的复现步骤,点导航,点个几次
看计数器(主要看js heap和Nodes),可以看到曲线是在慢慢上升的(其实曲线是上升再下降的,成脉冲那种阶梯样,但是总的内存是在增加的,下降的原因是因为一些GC了)
其实这个看也只是看个大概趋势,真正找到代码级别的内存泄漏的部分,还是得靠Memory Profile。
首先保存一个干净的内存快照
我点了3次不同的导航,在图里生成了3个detached dom(我用了Comparsion视图)
我随便点了其中一个,展开可以看到下面的retaining path
![2017-06-16 15-21-47](https://user-images.githubusercontent.com/1091500/27216259-8919b42a-52a7-11e7-85ac-b865e7fa8843.png)
4,可以看到下面的retainers窗口里有个pendingInsert这个对象
术语
Shallow size 对象自身的大小
Retained size 对象持有的引用,当被GC时,这一块大小会全部释放
Distance 到root的距离
Constructor 构造器 表示由这个构造器生成的同一类型的对象
Object count 对象的个数
黄色背景的对象
是js代码的直接引用,
红色背景的对象
未被js直接引用的,但是作为黄色节点的一部分而存活(本应该被GC的)
黄色的节点,是存在内存泄漏的,需要看下为什么这个东西没有被GC
在下面的对象面板里查看具体哪个对象在引用上面的黄色节点
Object面板 查看Constructor面板中你选中的节点,在哪些地方被引用到了
四种视图
![2017-06-16 21-07-01](https://user-images.githubusercontent.com/1091500/27227960-4447e714-52d8-11e7-904e-1d6fc25cb729.png)
Summary --- 特别适合跟踪DOM泄漏
Comparision
Containment - 查看堆的内容,这里也可以看到detached dom tree,同样可以看到pendingInsert这个对象
Statistics
比较有用的就是Comparision了,比较2次快照,找到哪些对象本应该被GC的。
The text was updated successfully, but these errors were encountered: