javascript 内存管理

为什么要管理内存

  • 减少浏览器卡顿;
  • 防止node端服务中断;

变量如何保存在内存中

  • 普通类型(字符串,数字、布尔等)数据保存在栈内存中;
  • 引用类型(对象,数组,方法等)数据保存在堆内存中,栈内存保存堆内存地址;

V8

占用内存大小

  • 64位1.4G;
  • 32位700MB;
  • 根据不同浏览器有些许扩容;node也会有一些c++内存扩容;

内存分布

新生代

保存短时间存活的新变量,新生代内存极小,64位大概是32MB;
回收算法:复制清空(以空间换时间);

  1. 内存划分为A,B空间;
  2. 存活变量复制至B空间,清空A空间;
  3. 对调并重复2步骤;

老生代

保存生存时间较长的变量,由新生代转存过来,几乎占据所有的内存,64位大概是1400MB;
回收算法:标记清除整理(以时间换空间);

  1. 标记失活变量;
  2. 清除失活变量;
  3. 整理内存;

新生代转化为老生代

触发:回收复制时占用超过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对于浏览器脚本来说够用;
  • 回收时是阻塞的,内存占用越大,回收时间越长;
posted @   梦渊同学  阅读(17)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示