Comments (3)
特意了解了一下 Chrome 官方的开发工具文档,按以下步骤记录快照
- 根据 “问题重现” 中的步骤:
- 打开官方 Demo 页面
- 刷新 10 次 “页面1”
- 打开 “页面2” 至 “页面10” 的 9 个页签
- 右键 “页面1” 点击 “关闭其他”,关掉其他页签
- 打开 Chrome 开发者工具的 Memory 页签,点击 Take Heap Snapshot 生成 HEAP SNAPSHOTS 快照,此时为 Snapshot 1
- 打开 “页面2” ,重新生成快照 Snapshot 2
- 分别在 Snapshot 1 和 Snapshot 2 的 Class filter 文本框中键入 Detached,搜索已分离的 DOM 树。
首次进入页面
Performance monitor 记录值:
属性 | 值 |
---|---|
JS heap size | 9.7 MB |
DOM Nodes | 235 |
完成“问题重现” 中的步骤
Performance monitor 记录值:
属性 | 值 |
---|---|
JS heap size | 13.9 MB |
DOM Nodes | 1234 |
发现有大量 DOM Nodes 改动,JS heap size 也增加了不少
Snapshot 1 Detached 过滤结果 (单个页签)
Performance monitor 记录值:
属性 | 值 |
---|---|
JS heap size | 10.2 MB |
DOM Nodes | 216 |
如下图所示,过滤结果中未找到已分离的 Dom,DOM Nodes数量相对首次进入也没太大改变
Snapshot 2 Detached 过滤结果 (两个页签)
Performance monitor 记录值:
属性 | 值 |
---|---|
JS heap size | 10.2 MB |
DOM Nodes | 331 |
如下图所示,过滤结果中可找到已分离的 Dom,DOM Nodes数量相对单个页签增加了 115。
分析原因,“页面1” 的 DOM 节点因为页签隐藏,并未出现在 document 内,所以情况是也是符合预期的
分析:
在点击 Take Heap Snapshot 生成快照之前,Performance monitor 中的 DOM Nodes 值确实会出现随着操作越来越多的情况,生成快照后,DOM Nodes 就恢复正常了。
按个人理解,开发工具生成快照前会执行强制回收内存,如果回收后还发现有不在页面内的 Dom Nodes,说明这些节点是被其他变量引用的。如果真的出现内存泄漏,在这里应该也是可以看到的。
Chrome 强制回收按钮
因为浏览器的内存回收也是会占用系统资源的,所以浏览器会按一定的规则,在需要的时候才开启。js 好像也没办法直接控制强制回收。
我们这里看到 Performance monitor 数据越来越大,可能只是还没触发浏览器自动回收内存的阈值。如果从快照里面发现大量异常的已分离 DOM 节点,才能说明是有 DOM 内存泄漏。
多页签页面,相对于普通的单页面,由于需要同时保存多个页面状态,肯定是会占用更多的资源。后续 Router Tab 可能会添加配置来限制页签数量,以减少类似的性能问题。
建议你也参考 Chrome 开发工具官方的文档来分析一下,定位问题的根因。
参考 Tools for Web Developers - 解决内存问题 - 使用堆快照发现已分离_dom_树的内存泄漏
以上观点,或有谬误,也欢迎讨论指正
from vue-router-tab.
特意了解了一下 Chrome 官方的开发工具文档,按以下步骤记录快照
根据 “问题重现” 中的步骤:
- 打开官方 Demo 页面
- 刷新 10 次 “页面1”
- 打开 “页面2” 至 “页面10” 的 9 个页签
- 右键 “页面1” 点击 “关闭其他”,关掉其他页签
打开 Chrome 开发者工具的 Memory 页签,点击 Take Heap Snapshot 生成 HEAP SNAPSHOTS 快照,此时为 Snapshot 1
打开 “页面2” ,重新生成快照 Snapshot 2
分别在 Snapshot 1 和 Snapshot 2 的 Class filter 文本框中键入 Detached,搜索已分离的 DOM 树。
首次进入页面
Performance monitor 记录值:
属性 值
JS heap size 9.7 MB
DOM Nodes 235
完成“问题重现” 中的步骤
Performance monitor 记录值:
属性 值
JS heap size 13.9 MB
DOM Nodes 1234
发现有大量 DOM Nodes 改动,JS heap size 也增加了不少Snapshot 1 Detached 过滤结果 (单个页签)
Performance monitor 记录值:
属性 值
JS heap size 10.2 MB
DOM Nodes 216
如下图所示,过滤结果中未找到已分离的 Dom,DOM Nodes数量相对首次进入也没太大改变Snapshot 2 Detached 过滤结果 (两个页签)
Performance monitor 记录值:
属性 值
JS heap size 10.2 MB
DOM Nodes 331
如下图所示,过滤结果中可找到已分离的 Dom,DOM Nodes数量相对单个页签增加了 115。分析原因,“页面1” 的 DOM 节点因为页签隐藏,并未出现在 document 内,所以情况是也是符合预期的
分析:
在点击 Take Heap Snapshot 生成快照之前,Performance monitor 中的 DOM Nodes 值确实会出现随着操作越来越多的情况,生成快照后,DOM Nodes 就恢复正常了。
按个人理解,开发工具生成快照前会执行强制回收内存,如果回收后还发现有不在页面内的 Dom Nodes,说明这些节点是被其他变量引用的。如果真的出现内存泄漏,在这里应该也是可以看到的。
Chrome 强制回收按钮
因为浏览器的内存回收也是会占用系统资源的,所以浏览器会按一定的规则,在需要的时候才开启。js 好像也没办法直接控制强制回收。
我们这里看到 Performance monitor 数据越来越大,可能只是还没触发浏览器自动回收内存的阈值。如果从快照里面发现大量异常的已分离 DOM 节点,才能说明是有 DOM 内存泄漏。
多页签页面,相对于普通的单页面,由于需要同时保存多个页面状态,肯定是会占用更多的资源。后续 Router Tab 可能会添加配置来限制页签数量,以减少类似的性能问题。
建议你也参考 Chrome 开发工具官方的文档来分析一下,定位问题的根因。
参考 Tools for Web Developers - 解决内存问题 - 使用堆快照发现已分离_dom_树的内存泄漏
以上观点,或有谬误,也欢迎讨论指正
感谢耐心的分析和回复,我会进行后续测试
from vue-router-tab.
RoutertTab v0.2.1 版本,在组件销毁后添加了缓存清理动作,可以更新看看是否有所改善
from vue-router-tab.
Related Issues (20)
- 更新到最新版本后关闭按钮无效,提示Cannot read property 'key' of undefined HOT 19
- Change default rule HOT 1
- vue-router-tab 1.2.7版本beforePageLeave Bug HOT 1
- iframe页签切换,每次会有1个被取消的静态资源请求 HOT 3
- 如果页面组件中含有iframe元素则在tab切换时dom结构会改变 HOT 4
- [Question] Order of closing tabs HOT 1
- TabScroll.vue报空错误 HOT 2
- nuxt下自定义key时候,缓存有问题 HOT 12
- 当预设tab和iframe同时存在时,使用浏览器刷新会出现ID不正确的情况 HOT 1
- 控制台一直报router-link的tag prop警告 HOT 1
- Changing 'routeTab' of inactive tab causes activeTab to change HOT 3
- 当 this.$vnode.data.key 不存在时,动态页签无法更新 HOT 5
- vue 3 version? HOT 4
- 请求支持 tab 数量的限制 HOT 1
- 1.2.9之后渲染不出tab页签 HOT 4
- 当前页签在iframe页签时,再切换到非iframe页签的时候会出现问题 HOT 1
- 页签缓存下,关闭打开的多页签,关闭后显示的其他页签展示的数据为关闭的页签数据
- 点击关闭能否回到最近访问那个页签
- 页面复杂时打开过多的页签,点关闭其他时会卡几秒 HOT 1
- 页签内路由跳转问题 HOT 2
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from vue-router-tab.