Javascript 反应组件状态内存泄漏
卸除组件时,我的React组件中的状态未得到垃圾收集,导致内存泄漏。我正在使用react@15.5.4在macOS Sierra上的Chrome 10.12.5上 我正在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
componentDidMount
like中设置状态
为了确认内存泄漏,我将以下内容添加到我的组件didmount
:
let arr = new Uint8Array(1024 * 1024 * 30);
this.setState({
test: arr
});
并拍摄了一个堆快照,以确认在堆上分配了30MB的Uint8Array
然后,我确认该组件已被控制台卸载。在组件将卸载中记录
之后,当我拍摄堆快照时,即使在允许有足够的时间进行垃圾收集之后,Uint8Array仍保留在堆中
关于从何处开始调试此问题,您有什么想法吗?或者从源代码中观察到了什么?据我所知,您希望组件将卸载
作为类析构函数工作,但我认为React组件生命周期以不同的方式工作
对象的属性(如状态)通常在类构造函数中初始化,然后componentWillMount
/componentDidMount
和componentWillUnmount
仅对同一对象起作用
如果该组件不再位于DOM中,并不意味着它已被垃圾收集。当(如果)重新装载时,将使用相同的对象
如果对您有任何意义,您可能可以在组件willunmount
中清空cleanstate
自己。在这种情况下,我认为GC将恢复内存。可能是表示组件及其状态的实际JS对象没有被删除,即使组件已从DOM中删除。也许React会将其缓存以供以后重用?可能值得用React引发一个bug。我看到您正在调用window.addEventListener
。您是否也正在删除该事件侦听器?我只是瞥了一眼你的问题,所以如果我完全偏离了方向,我向你道歉。@RicoKahler,我是。我认为这是一个单独的问题,因为眼前的问题是state对象没有被垃圾收集。