Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 反应组件状态内存泄漏_Javascript_Reactjs_Memory Leaks - Fatal编程技术网

Javascript 反应组件状态内存泄漏

Javascript 反应组件状态内存泄漏,javascript,reactjs,memory-leaks,Javascript,Reactjs,Memory Leaks,卸除组件时,我的React组件中的状态未得到垃圾收集,导致内存泄漏。我正在使用react@15.5.4在macOS Sierra上的Chrome 10.12.5上 我正在componentDidMountlike中设置状态 为了确认内存泄漏,我将以下内容添加到我的组件didmount: let arr = new Uint8Array(1024 * 1024 * 30); this.setState({ test: arr }); 并拍摄了一个堆快照,以确认在堆上分配了30MB的Uint8

卸除组件时,我的React组件中的状态未得到垃圾收集,导致内存泄漏。我正在使用react@15.5.4在macOS Sierra上的Chrome 10.12.5上

我正在
componentDidMount
like中设置状态

为了确认内存泄漏,我将以下内容添加到我的
组件didmount

let arr = new Uint8Array(1024 * 1024 * 30);
this.setState({
  test: arr
});
并拍摄了一个堆快照,以确认在堆上分配了30MB的Uint8Array

然后,我确认该组件已被
控制台卸载。在
组件将卸载
中记录

之后,当我拍摄堆快照时,即使在允许有足够的时间进行垃圾收集之后,Uint8Array仍保留在堆中


关于从何处开始调试此问题,您有什么想法吗?或者从源代码中观察到了什么?

据我所知,您希望
组件将卸载
作为类析构函数工作,但我认为React组件生命周期以不同的方式工作

对象的属性(如状态)通常在类构造函数中初始化,然后
componentWillMount
/
componentDidMount
componentWillUnmount
仅对同一对象起作用

如果该组件不再位于DOM中,并不意味着它已被垃圾收集。当(如果)重新装载时,将使用相同的对象


如果对您有任何意义,您可能可以在
组件willunmount
中清空clean
state
自己。在这种情况下,我认为GC将恢复内存。

可能是表示组件及其状态的实际JS对象没有被删除,即使组件已从DOM中删除。也许React会将其缓存以供以后重用?可能值得用React引发一个bug。我看到您正在调用
window.addEventListener
。您是否也正在删除该事件侦听器?我只是瞥了一眼你的问题,所以如果我完全偏离了方向,我向你道歉。@RicoKahler,我是。我认为这是一个单独的问题,因为眼前的问题是state对象没有被垃圾收集。