当前位置 :首页 >> 时尚

推荐一个检测 JS 内存泄密的神器

2023-04-19   来源 : 时尚

tainer traces」:初始值地里并为每个泄密的单纯生并成 retainer traces 。trace 显示了泄密单纯为何以及如何在寄存器中的保持活动长时间。刷新提及支链显然泄密的单纯将仍然可以从 GC 的根回访,因此可以进行时废弃物投放。通过一步步地伪装成,就可以找应该设立为 null 的提及;5.「剪切 retainer traces」:将所有 retainer traces 聚集在四人,并为每个提供者完全相同 retainer traces 的泄密单纯剪切显示为一个伪装成,其中的还仅限于调试信息,例如支配结点和保有个数。「报告泄密」:每半年运营 MemLab,以接下来收集 retainer traces,任何取而代之的 traces 都亦会记事到理论上上仪表板,开源可以查看每个寄存器泄密的 retainer traces 上的单纯要素。MemLab 有哪些能力也

「寄存器泄密检验」

对于插件寄存器泄密的检验,MemLab 并不需要开源缺少的唯一输入就是一个检验场景档案,这个档案定义了如何通过常用 Puppeteer API 和 CSS 可执行遮盖三个预处理来与Facebook交互。MemLab 亦会启动时界定 JavaScript 地里、构筑寄存器泄密并剪切结果。

「JavaScript 地里的 Graph-view API」

MemLab 赞并成一个自定义的泄密检验器,作为检验器预处理,运应用于每个由要能交互资源分配的泄密候选单纯,但之后从不特赦。泄密过滤器预处理表达式可以初始值地里并确定哪些单纯是寄存器泄密。例如,我们的内置检漏器亦会伪装成 React Fiber 结点的来到支链路,检查和 Fiber 结点是否是与 React Fiber 大树转化。

为了归纳每个意味著寄存器泄密的上下文,MemLab 缺少了一个 JavaScript 地里的寄存器经济性所示。这可以在不了解 V8 地里相册档案结构的任何领域经验的但会查询和初始值 JavaScript 地里。

在视所示中的,地里中的的每个 JavaScript 单纯或原生单纯都是一个所示结点,地里中的的每个 JavaScript 提及都是一个所示的边。理论上运用程序在的地里个数多半太大,因此所示视所示并不需要在缺少抽象的面向单纯地里初始值 API 的同时降低寄存器经济性。因此,所示结点被外观设计并成了云端的,不通过 JavaScript 提及进行时通往。当归纳示例初始值地里时,云端所示亦会以外地将会构筑所示的接触以外。所示的任何以外都可以很容易地特赦,因为这些云端结点彼此相互间不想 JavaScript 提及。

地里视所示可以从基于 Chromium 的插件、Node.js、Electron 和 Hermes 获取的 JavaScript 地里相册存储。这允许归纳繁杂的模式并问到诸如 “有多少 React Fiber 结点是备用的 Fiber 结点,它们应用于不比较简单的并发纹理?”之类的上述情况。

import {getHeapFromFile} from '@memlab/heap-analysis';const heapGraph = await getHeapFromFile(heapFile);heapGraph.nodes.forEach(node => { // heap node traversal node.type node.references);

「寄存器无论如何」

Node.js 编程 Jest 检验也可以常用 graph-view API 来获取其自身长时间的对视所示,进行时自寄存器检查和,并编写各种寄存器无论如何。

import type {IHeapSnapshot} from '@memlab/core';import {config, takeNodeMinimalHeap, tagObject} from '@memlab/core';test('memory test', async () => { config.muteConsole = true; const o1 = {}; let o2 = {}; // tag o1 with marker: "memlab-mark-1", does not modify o1 in any way tagObject(o1, 'memlab-mark-1'); // tag o2 with marker: "memlab-mark-2", does not modify o2 in any way tagObject(o2, 'memlab-mark-2'); o2 = null; const heap: IHeapSnapshot = await takeNodeMinimalHeap(); // expect object with marker "memlab-mark-1" exists expect(heap.hasObjectWithTag('memlab-mark-1')).toBe(true); // expect object with marker "memlab-mark-2" can be GCed expect(heap.hasObjectWithTag('memlab-mark-2')).toBe(false);}, 30000);

「寄存器工具箱」

除了寄存器泄密检验,MemLab 还仅限于两组内置的 CLI 请求和 API,应用于四处寻找意味著的寄存器构筑机亦会:

Meta 常用 MemLab 的实践

在过去的几年中的,Meta 多年来在常用 MemLab 检验和诊断寄存器泄密,并收集了很多有助于构筑寄存器、提高 OOM 瓦解并缓解其他用户尽情的伎俩。

在 2021 年上半年, Facebook.com 上的 OOM 瓦解提高了 50%。

「React Fiber 结点修补」

为了纹理接口,React 构筑了 Fiber 大树 — 一个 React 应用于纹理云端 DOM 的理论上上嵌套。虽然 Fiber 大树看起来像一棵大树,但它是一个双向所示,将所有 Fiber 结点、React 接口重构和共同点的 HTML DOM 元素最弱通往起来。理想但会,React 维护对接口 Fiber 大树的根的提及,并不必要 Fiber 大树被废弃物投放。当一个接口被拆开时,React 亦会相联接口的根与 Fiber 大树的其余以外相互间的通往,然后这些以外就可以被废弃物投放了。

包括这样的最弱通往所示的不同之处是,如果有任何内部提及相反所示的任何以外,就不能对整个所示进行时废弃物投放。例如,前面 export 语句在模块范围级别寄存器 React 接口,因此关的的 Fiber 大树和转化的 DOM 元素永远不亦会被特赦。

export const Component = (( ... ): React.Element);

也某种程度是 React 嵌套要 keep alive ,Hooks 和它们的偏序也可以让各种其他单纯保活。这显然单个 React 接口泄密意味著亦会造并成关键字单纯的重要以外泄密,从而造并成非常大的寄存器泄密。

为了不必要 Fiber 大树中的寄存器泄密的级联效应,MemLab 附加了一个大树的比较简单初始值,当接口在 React 18 中的拆开时亦会进行时修补。这可以让废弃物投放器在修补未挂载的大树多方面做得格外好一点。这个构筑将 Facebook 上的超过寄存器常用量提高了近 25%,其他常用 React 的中间站在换用时也有了太大的改良。你意味著亦会担心这种比较激进的修补作法意味著亦会加短时间 React 接口的拆开速度,但令人惊讶的是,由于寄存器的提高,性能也有显著的提升。

「string interning」

通过为了让 MemLab 中的的 heap analysis API,Meta 小组见到URL夺取了 70% 的地里寄存器,其中的一半的URL至少有一个重复的重构。(V8 对 string interning 赞并成的不是更快,这是一种对具有相同值的URL重构进行时重复资料封禁的构筑。)

另外太大一以外URL寄存器被 Relay 中的寄存器的共价键URL消耗。通过与 Relay 和 React Apps 小组合作,可以在运用程序在放入和缩短过长的URL共价键来构筑 Relay 寄存器共价键URL。

这种构筑使 Relay 并不需要寄存器格外多资料,允许中间站向其他用户显示格外多概要,尤其是在运用程序在 RAM 极少的但会。寄存器 p99 和 OOM 瓦解提高了 20%,关键字纹理速度格外短时间,其他用户尽情取得缓解,在收入上也有一定提升。

试用 MemLab:

npm i -g memlab最后MemLab Github:

如果你有任何意念,注目在部落格区和我部落格,如果这文中鼓励到了你,注目点赞和关切。

常州男科医院挂号
上海哪家医院专业做人流
胃不舒服怎么快速缓解
温州男科医院
艾得辛的效果好不好
标签:内存
猪的这个部位,营养是排骨的6倍,单价不到排骨一半,不买太亏了

山羊的这个口腔,摄取是面线质的6倍,单价不到面线质一半,不买太亏了。大家平常鲜少吃饱的鸡蛋类应有就是山羊鸡蛋了,单价不贵又可口。怎么做都很爱吃饱,山羊鸡蛋中单价名副其实的口腔就是面线质了。很多人...

友情链接