javascript 内存管理
为什么要管理内存
- 减少浏览器卡顿;
- 防止node端服务中断;
变量如何保存在内存中
- 普通类型(字符串,数字、布尔等)数据保存在栈内存中;
- 引用类型(对象,数组,方法等)数据保存在堆内存中,栈内存保存堆内存地址;
V8
占用内存大小
- 64位1.4G;
- 32位700MB;
- 根据不同浏览器有些许扩容;node也会有一些c++内存扩容;
内存分布
新生代
保存短时间存活的新变量,新生代内存极小,64位大概是32MB;
回收算法:复制清空(以空间换时间);
- 内存划分为A,B空间;
- 存活变量复制至B空间,清空A空间;
- 对调并重复2步骤;
老生代
保存生存时间较长的变量,由新生代转存过来,几乎占据所有的内存,64位大概是1400MB;
回收算法:标记清除整理(以时间换空间);
- 标记失活变量;
- 清除失活变量;
- 整理内存;
新生代转化为老生代
触发:回收复制时占用超过25%的空间;
转化:将经历过一次回收机制的变量放入老生代中;
回收触发机制
- 执行完一次代码
var a = 1;
setTimeout(() => {
a++;
// 第二次回收
}, 1000);
// 第一次回收
- 内存不足
判定变量可回收
- 全局变量 程序执行完毕;
- 普通变量 失去引用;
优化内存
查看内存
- 浏览器
window.performance.memory
- node端
process.memoryUsage()
设置内存
- 浏览器(不可以)
- node端
node --max-old-space-size=1000 index.js
node --max-new-space-size=1000 index.js
优化建议
- 尽量不使用全局变量;
- 注意使用闭包;
为什么v8设计为1.4G
- 1.4G对于浏览器脚本来说够用;
- 回收时是阻塞的,内存占用越大,回收时间越长;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通