电子嵌入React应用程序在Iframe关闭时不释放内存



我长期运行电子/反应应用程序与另一个反应应用程序内的iframe。当我多次打开和关闭iframe并将其从DOM中删除时,问题就出现了。嵌入的应用程序不会一直被卸载,总有一些残留物留在内存中,随着时间的推移,kips不断增长,直到电子珍惜的那一点。

电子V.18.2.0React-scripts v.18.2.0

到目前为止我所做的/尝试的:

  1. replaceWith (a.cloneNode(真正的)),

  2. unmountComponentAtNode (a),

  3. 设置iframe的src为"about:blank",

  4. 用新的iframe替换整个iframe,

  5. 禁用现金电子,在客户端应用程序中禁用现金,

  6. 将整个文档替换为空白文档,

  7. 删除在客户端卸载前加载的脚本,

  8. 在组件上设置state为null将会卸载

  9. ,cleararchache ", clearHostResolverCache", clearStorageData", clearAuthCache", clearcodecache "当iframe卸载时(在电子主进程内),

  10. global.gc ()

  11. AbortController()在所有取回请求上,iframe.contentWindow.close ()

  12. 设置命令行开关为'——max-old-space-size=4096' &"——disable-http-cache,为pragma设置meta头:


<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" />
<meta http-equiv="Pragma" content="no-cache" />
<meta http-equiv="Expires" content="0" />

我在期待什么呢:

要从内存中移除的已兑现代码

我看到的:

关闭并删除iframe元素后,内存中仍有一些已兑现的残留物,尽管没有启用兑现Snap:内存泄漏的Snap

代码:mainApp:

componentWillUnmount() {
let a = document.getElementById('clientApp')
a.contentWindow.close();
a.replaceWith(a.cloneNode(true));
a.src = "about:blank"
unmountComponentAtNode(a)
logger.info("Unmounting/Closing client app.")
this.setState(null)
document.removeEventListener('vnd.interaction.finished', this.onInteractionFinished)
window.unregisterActionButton()
if (this.state.config.ClearSelectedCashes.length > 0) {
ipcRenderer.send('ClearSelectedCashes', this.state.url, this.state.config.ClearSelectedCashes)
}
}
urlAppendParams() {
if (this.state.interactionId !== undefined && this.state.interactionId !== "") {
const urlAppendParams = new URL(this.state.url)
urlAppendParams.searchParams.append('interactionId', this.state.interactionId)
urlAppendParams.searchParams.append('selectedLanguage', this.state.selectedLanguage)
urlAppendParams.searchParams.append('scriptsPath', this.state.scriptsPath)
urlAppendParams.searchParams.append('screenSize', this.state.screenSize)
urlAppendParams.searchParams.append('fontSize', this.state.fontSize)
logger.debug(`Open url in iframe: ${urlAppendParams}.`)
return urlAppendParams
}
}
render() {
if (this.state.interactionId !== null && this.state.interactionId !== undefined && this.state.interactionId !== "") {
return (
<React.StrictMode>
<div className='iframe'>
<iframe
sandbox="allow-scripts"
id="clientApp"
title='clientApp'
src={this.urlAppendParams()}
className='iframeContent'
onLoad={this.clientAppLoaded}
>
</iframe>
</div>
</React.StrictMode>
)
} else return <></>
}

ClientApp:

componentWillUnmount() {
document.removeEventListener("mainApp_customerPreferencesChanged", this.onCustomerPreferencesChanged)
document.removeEventListener('mainApp_userInteraction', this.onUserInteraction)
document.removeEventListener('vnd.mainAppScreen.Active', this.mainAppActive)
document.removeEventListener('vnd.mainAppScreen.Inactive', this.mainAppInactive)
this.setState(this.initialState)
document.head.remove()
document.body.remove()
}

任何信息将感激提前感谢。:)

如果有人正在阅读这篇文章,请记住在嵌入式应用程序中也要删除控制台日志,因为控制台日志保留了对记录对象的引用。因此,GC永远不会释放与它们相关的内存,所以即使嵌入式应用程序关闭,它也会在内存中加载。

解决

相关内容

  • 没有找到相关文章

最新更新