V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  williamcc  ›  全部回复第 1 页 / 共 5 页
回复总数  90
1  2  3  4  5  
10 天前
回复了 lp4298707 创建的主题 React 为啥这段代码会造成内存泄露啊?
这段代码存在潜在的内存泄漏风险,主要原因是 setInterval 和数据处理方式的结合导致的。以下是详细分析:
潜在的内存泄漏原因:
setInterval 和闭包:
setInterval 函数会创建一个新的计时器,每 300 毫秒重复调用 handleData() 函数。
每次调用 handleData() 都会创建一个闭包,闭包会捕获周围作用域中的变量引用,包括 data.value 、list 和 visibleData.value 。
数据累积:
当新的数据通过 websocket 订阅到达时,data.value 会更新,并调用 handleData() 函数。
在 handleData() 内部,会创建一个新的数组 list ,并将 data.value 的值赋给它。
然后对 list 进行排序,并将其赋值给 visibleData.value 。
然而,原始的 list 数组,它仍然持有对旧 data.value 的引用,并没有被显式清除或垃圾回收。
闭包引用:
每个由 setInterval 创建的闭包都保留了对旧 list 数组的引用,即使它不再需要了。
这就阻止了旧的 data.value 被垃圾回收,随着时间的推移导致内存累积。
解决方案:
在卸载时清除计时器:
确保在 onBeforeUnmount 中正确调用 clearInterval(timer) 来停止计时器,并防止进一步创建闭包。
避免不必要的数组创建:
不要在每次 handleData() 调用中创建新的 list 数组,可以考虑直接对 data.value 数组进行排序,或使用更高效的排序算法。
使用弱引用 (高级):
如果需要在闭包中维护引用而不导致内存泄漏,可以考虑使用 WeakMap 或 WeakSet 数据结构。这些结构持有弱引用,不会阻止垃圾回收。
注意: 使用弱引用需要仔细考虑对象生命周期和垃圾回收行为。
其他注意事项:
内存分析: 使用浏览器开发者工具或内存分析工具来跟踪内存使用情况并识别泄漏。
数据大小: 如果 data.value 数组包含大量数据,内存影响会更显著。考虑高效处理大型数据集的策略。
改进示例 (避免创建数组):
function handleData() {
const now = new Date().getTime();
data.value.forEach(item => {
const isTop = item.remindEndTime > now;
item.shine = isTop;
item.sort = isTop ? 0 : 1;
});
// 直接对 data.value 进行排序
data.value = orderBy(data.value, ['sort', 'updateTime'], ['asc', 'desc']);
visibleData.value = data.value;
}
13 天前
回复了 wanghuinet 创建的主题 程序员 有没有擅长申请专利的大牛(有重奖)
TWFyMjlfQ3hpbg==
13 天前
回复了 wanghuinet 创建的主题 程序员 有没有擅长申请专利的大牛(有重奖)
v 加不上大佬
你用 360 强力卸载 360 ,你揪着自己的头发能飞起来啊
下个腾讯电脑管家强力卸载 360
37 天前
回复了 williamcc 创建的主题 生活 愚人节玩笑
@zangzang 哈哈哈哈哈哈哈 666
41 天前
回复了 williamcc 创建的主题 问与答 照片 AI 生成漫画头像
@EmbraceQWQ 这个可以,目前最佳
41 天前
回复了 williamcc 创建的主题 问与答 照片 AI 生成漫画头像
@kfpenn sd 是什么玩意
41 天前
回复了 williamcc 创建的主题 问与答 照片 AI 生成漫画头像
@vicalloy 用了一下 效果也非常拉垮 甚至人脸都撕拉开了 😢
41 天前
回复了 williamcc 创建的主题 问与答 照片 AI 生成漫画头像
@BazingaOrg 就是出来的效果 感觉有点打扰了 哈哈
41 天前
回复了 williamcc 创建的主题 问与答 照片 AI 生成漫画头像
@BazingaOrg 不错哦 还不赖喔
41 天前
回复了 tool2d 创建的主题 程序员 怎么证明自己写的代码,是有价值的?
如果你的代码没有任何价值,你的公司还给你发公司,这证明了你很有价值
45 天前
回复了 williamcc 创建的主题 生活 静电很多怎么解决
@dyv9 有用吗
45 天前
回复了 williamcc 创建的主题 生活 静电很多怎么解决
@typedefine 可以说是雷神在世了
47 天前
回复了 pipixiarwksb 创建的主题 职场话题 怎么回事,我要补税 2000 多,
跳槽了就会这样,因为新公司会重新给你申报
47 天前
回复了 charmingchm 创建的主题 程序员 家庭摄像头录像问题
买一个带这个功能的摄像头就行了
47 天前
回复了 williamcc 创建的主题 生活 静电很多怎么解决
@pentilun 好的
1  2  3  4  5  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1378 人在线   最高记录 6543   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 24ms · UTC 17:50 · PVG 01:50 · LAX 10:50 · JFK 13:50
Developed with CodeLauncher
♥ Do have faith in what you're doing.