- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
编辑看来这是由于 React 中的一个问题造成的,并将在未来的版本中修复。 https://github.com/facebook/react/issues/18066
<小时/>给定 React 中的一个表,该表显示来自 API 的数据,可以用全新的信息刷新,我观察到分离的 DOM 节点泄漏(观察绿色数字):
Here is the code executed in the gif (下面包含代码以供后代使用)。要查看泄漏情况,请转到 full page ,打开 Chrome 开发工具,查看“性能监视器”选项卡,然后快速单击“Regen”按钮,如 gif 所示。
In this codesandbox ,如果节点不是在循环中生成的,则不会发生泄漏。
唯一的区别是 jsx 中的 {rows}
数组。令人困惑的部分是 {rows}
不是全局变量,所以我不知道它如何防止旧节点被 GC'd。
为什么使用局部变量rows
会导致分离的DOM节点泄漏?
注意:DOM 节点似乎稳定在 21,000 个,但无论如何都不应该有那么多节点,因为您可以看到在第一个表生成后它从 7,000 个开始。在我的真实应用程序中,这些分离的节点甚至通过导航(使用 react 路由器)仍然存在,这让我相信这是一个真正的泄漏,而不仅仅是等待 GC 的节点。
<小时/>模拟泄漏的完整代码:
import React, { useState } from "react";
export default function App() {
const [count, setCount] = useState(0);
return (
<div className="App">
<button onClick={() => setCount(prev => prev + 1)}>Regen</button>
<FTable count={count} />
</div>
);
}
function Cell() {
const num = Math.floor(Math.random() * 100);
return <td>{num}</td>;
}
function FTable(props) {
const { count } = props;
const rows = [];
if (count > 0) {
for (let i = 0; i < 1000; i++) {
rows.push(
// Use a different key for each time the
// table is regenerated to simulate a new API
// call bringing in new data
<tr key={`${i} ${count}`}>
<Cell row={i} />
<Cell row={i} />
<Cell row={i} />
</tr>
);
}
}
return (
<div>
<table>
<tbody>{rows}</tbody>
</table>
</div>
);
}
最佳答案
起初,我认为这是 Hooks API 的一个错误。因为如果你替换 <FTable count={count} />
与 <FTable count={1} />
然后 bug 就会消失。但这不是解决方案。
有一个关于 unexpected behavior 的问题与 Hook 。但在这种情况下,JS 堆大小而不是 DOM 节点在增长。
然后我想“好吧,我会用类组件尝试这个案例”,然后我做了 this demo 。同样的问题仍然存在。好吧,如果这个问题是在 16.3 版本中和 Hooks 一起引入的呢?但不是。同样的问题exist in 16.0 .
然后我意识到。关键问题是所有这些案例之间有什么共同点?关键!
The best way to pick a key is to use a string that uniquely identifies a list item among its siblings.
事实证明,如果每个渲染上的键都是唯一的,React 不会“垃圾收集”旧节点(好吧,在本例中)。这就是为什么如果您使用 <tr key={i}>
那么一切都很好,因为 React “重写” 这些节点,并且当您使用 ${i * count}
时或${i} ${count}
或“无论每次渲染都是唯一的”,那么节点将位于内存中。过了某个时间点,旧节点将被新节点替换,但我猜这是与浏览器相关的行为,而不是 React。但我不是 react 专家,我不知道这种情况在哪里以及如何发生。
此时,您可以在 GitHub 上创建问题并了解此问题。
关于javascript - React 中分离的 DOM 节点内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60197254/
IntentReceiver 正在泄漏 由于 onDetachedFromWindow 在某些情况下未被调用。 @Override protected void onDetachedFromWind
好吧,我很难追踪这个内存泄漏。运行此脚本时,我没有看到任何内存泄漏,但我的 objectalloc 正在攀升。 Instruments 指向 CGBitmapContextCreateImage >
我编写了一个测试代码来检查如何使用 Instrument(Leaks)。我创建了一个单一 View 应用程序,单击按钮后我加载了一个像这样的新 View ... - (IBAction)btn_clk
我正在使用这个简单的代码并观察单调增加的内存使用量。我正在使用这个小模块将内容转储到磁盘。我观察到它发生在 unicode 字符串上而不是整数上,我做错了什么吗? 当我这样做时: >>> from u
我有以下泄漏的代码。 Instruments 表示,泄漏的是 rssParser 对象。我“刷新”了 XML 提要,它运行了该 block 并且发生了泄漏...... 文件.h @interface
我在我编写的以下代码片段中发现了内存泄漏 NSFileManager *fileManager=[[NSFileManager alloc] init]; fileList=[[fileManager
因此,我正在开发HTML5 / javascript rts游戏。观察一直有几种声音在播放。因此,对我来说,是一段时间后声音听起来像是“崩溃”,并且此浏览器选项卡上的所有声音都停止了工作。我只能通过重
下面是我正在使用的一段代码及其输出。 my $handle; my $enterCount = Devel::Leak::NoteSV($handle); print "$date entry $en
在这篇关于 go-routines 泄漏的帖子之后,https://www.ardanlabs.com/blog/2018/11/goroutine-leaks-the-forgotten-sende
我想知道为什么在执行 ./a.out 后随机得到以下结果。有什么想法我做错了吗?谢谢 http://img710.imageshack.us/img710/8708/trasht.png 最佳答案 正
我正在 Swift 中开发一个应用程序,在呈现捕获我放在一起的二维码的自定义 ViewController 后,我注意到出现了巨大的内存跳跃。 该代码本质上基于以下示例:http://www.appc
下面是我的 javascript 代码片段。它没有按预期运行,请帮我解决这个问题。 function getCurrentLocation() { console.log("insi
我们在生产环境中部署了 3 个代理 Kafka 0.10.1.0。有些应用程序嵌入了 Kafka Producer,它们将应用程序日志发送到某个主题。该主题有 10 个分区,复制因子为 3。 我们观察
我正在使用仪器来检测一些泄漏,但有一些泄漏我无法解决; NSMutableString *textedetails = [[NSMutableString alloc] init];
如果我使用性能工具测试我的代码 - 泄漏,它没有检测到任何泄漏。这是否意味着代码没有泄漏任何内存? 我有一个越狱的 iPhone,我可以监控可用内存。如果有人知道,那就是 SBSettings。我测试
我在从 AddressBook 中获取图像时遇到了很大的问题,下面我粘贴了我的代码。此 imageData 从未被释放,在我的 Allocations Instruments 上它看起来总是在内存中它
- (NSMutableArray *)getArrayValue:(NSArray *)array{ NSMutableArray *valueArray = [NSMutableArra
Instruments 工具说这是一个泄漏,有什么想法吗? 我在 for 循环结束时释放变量对象 在上述方法的开头,这就是我设置变量对象的方式,即自动释放; NSMutableArray *varia
我正在跟踪我的 iOS 应用程序的内存泄漏,我有一个奇怪的泄漏导致我的应用程序崩溃......负责的框架是:CGImageMergeXMPPropsWhithLegacyProps。在某些时候,我的应
我正在尝试使用 NSOperationQueue 在后台线程中执行一个方法,如下所示: NSOperationQueue *queue = [NSOperationQueue new]; NS
我是一名优秀的程序员,十分优秀!