• 内存是用来存什么的

通俗的来说呢,就是用来存 var let function const 声明的变量。

  • 内存的大小

与操作系统有关,64位1.4G 32位0.7G。

  • 为啥内存大小要这么设计,为啥不是越大越好

1.表象原因,1.4G够用了 JS设计之初是作为脚本语言(一次性的执行,执行完毕就直接释放),相对于java,C这些 编写持久性的服务语言(内存一般不受限制)来说,够用了,想想你一次性的定义变量超过1.4G还是有难度的(当然不要耍赖用循环)。

2.深层次的原因,JS每回收一次垃圾,会把整个代码的执行暂停, 回收200MB大概需要30ms,如果内存设计的太大,回收垃圾的时候回暂停很久,用户体验不好。

  • V8 的内存分配

新生代会频繁发生变量的移动,老生代存的 比较久。

64位:新生代64MB 老生代1400MB

32位:新生代16MB 老生代700MB

  • 新生代内存

存放生存的并不久的变量

  • 老生代内存

存放常驻变量

  • 变量从新生代 --> 老生代

1.新生代内存空间使用超过了25%(前置条件)。

2.经过了一次垃圾回收,但是还没有回收掉的变量(还有地方会用到的变量),使其变为常驻变量。

var a = (()=>{
var b = '1';
return ()=>{
return b;
}
});
  • 新生代回收算法

为什么分为两部分,因为新生代会频繁发生变量的移动,一开始变量都放在from, 比如a, b, c三个变量,第一次回收以后,比如a, c还活着,那就只需要把a, c放到to中,然后把from中的全部删除,同样的道理,下一次回收从to中吧活着的变量复制到from, 删除to中的。只需要做两步 复制 删除,这样比较高效。

  • 老生代回收算法

标记 清除 整理

先给需要回收的变量加标记,然后执行删除,删除之后呢,删除变量的位置会产生磁盘碎片,举个例子:数组(只能储存相同大小的同类型变量,在内存上必须是连续的空间) [1, ,3, ] 还有两个位置,但是如果我们现在要把[2,4]存进去,是存不进去的。所以还需要进行一步整理磁盘粹片。

  • 内存如何回收

内存快接近满时,如果是全局变量,没有执行完毕不会回收,局部变量失去引用回收。

下面是一个例子,全局的arr,我们不停往里面push大数组,因为arr是全局的,不能被回收内存就爆了。

function printMe(){
var mem = process.memoryUsage();
var format = function(bytes){
return (bytes/1024/1024).toFixed(0) + 'MB';
};
console.log('ToTal:' + format(mem.heapTotal) + 'Used:' + format(mem.heapUsed));
} var arr = [];
var size = 30 * 1024 * 1024;
for (let i = 0; i < 15; i++) {
arr.push(new Array(size));
printMe();
}

在通过一个小例子来看下JS回收临时变量的过程:

function printMe(){
var mem = process.memoryUsage();
var format = function(bytes){
return (bytes/1024/1024).toFixed(0) + 'MB';
};
console.log('ToTal:' + format(mem.heapTotal) + 'Used:' + format(mem.heapUsed));
} var arr = [];
var size = 30 * 1024 * 1024;
function notGolbal() {
var noarr = []; // 临时
for (let i = 0; i < 3; i++) {
noarr.push(new Array(size));
}
}
notGolbal();
setInterval(()=>{
arr.push(new Array(size));
printMe();
}, 1000);

看图中圈出部分,已经进行了临时变量的回收。

  • 开发应该注意些什么

1.能不定义为全局变量,就不要定义为全局变量,非得定义为全局变量,用完记得手动回收(设置值为null/undefined)。

2.如果用内存实现缓存要做限制,如果超过这个限制(先进先出),就把最开始的缓存清空,防止内存爆满。

3.上传大文件时,避免直接操作整个文件,(上传文件其实就是把文件先从硬盘读取到内存中,再从内存进行上传到服务器的操作,如果文件过大,内存可能扛不住),把文件切片上传。

  • 性能监控方案

1.Lighthouse -谷歌推出的,可直接在浏览器安装(需要翻墙),也可以通过npm安装,通过命令行来对网站的性能做测试。比如以下命令的意思就是检测https://study.163.com/的性能,将结果输出为HTML,路径为当前命令行执行的路径。

lighthouse https://study.163.com/ --output=html -path ./

2.对window.performance的数据进行分析,然后自行优化。

JS内存的更多相关文章

  1. JS内存泄露常见原因

    详细内容请点击 分享的笔记本-前端 开发中,我们常遇见的一些关于js内存泄露的问题,有时候我们常常会找半天找不出原因,这里给大家介绍简单便捷的方法 1.闭包上下文绑定后没有释放:   2.观察者模式在 ...

  2. Chrome JS内存泄漏排查方法(Chrome Profiles)

     原文网址:http://blog.csdn.net/kaitiren/article/details/19974269 JS内存泄漏排查方法(Chrome Profiles)   Google Ch ...

  3. Js内存泄露问题总结

    最近接受了一个Js职位的面试,问了很多Js的高级特性,才发现长时间使用已知的特性进行开发而忽略了对这门语言循序渐进的理解,包括Java我想也是一样,偶尔在Sun官方看到JDK6.0列举出来的new f ...

  4. js内存深入学习(二)

    继上一篇文章 js内存深入学习(一) 3. 内存泄漏 对于持续运行的服务进程(daemon),必须及时释放不再用到的内存.否则,内存占用越来越高,轻则影响系统性能,重则导致进程崩溃. 对于不再用到的内 ...

  5. js内存深入学习(一)

    一. 内存空间储存 某些情况下,调用堆栈中函数调用的数量超出了调用堆栈的实际大小,浏览器会抛出一个错误终止运行.这个就涉及到内存问题了. 1. 数据结构类型 栈: 后进先出(LIFO)的数据结构  堆 ...

  6. js内存空间的那点事

    由于js具有自动垃圾回收机制,导致接触js后一直没去关注js的内存分配及变量回收等原理,只是懵懂的了解用变量标记法(null)可以手动的去清除或是回收:是时候弥补这个大坑了... 垃圾回收两种方法 一 ...

  7. 转---单页面应用下的JS内存管理

    正文从这开始- 内存问题对于后端童鞋而言可能是家常便饭,特别是C++童鞋.我在实习时做过半年的c++游戏客户端开发(也是前端开发哦),也见识了各式各样的内存问题,就说说我的第一个坑,当时做个需求,就是 ...

  8. js内存空间详细图解-笔记

    原文参考http://mp.weixin.qq.com/s/NGqdjhoU3MR9LD0yH6tKIw 栈-先进后出堆-类比成书于书架(形象),只要知道Key就可以找到value 基础数据类型(Un ...

  9. JS内存空间详细图解

    JS内存空间详细图解 变量对象与堆内存 var a = 20; var b = 'abc'; var c = true; var d = { m: 20 } 因为JavaScript具有自动垃圾回收机 ...

  10. JS内存机制

    在看JS内存机制之前我们先来看一下JS是门什么样的语言,他又有哪些变量类型. 动静态,强弱类型 静态:在使用之前就需要确认其变量数据类型. 动态:在运行过程中需要检查数据类型. 强类型:不支持隐式类型 ...

随机推荐

  1. PyQt(Python+Qt)学习随笔:Designer中PushButton按钮flat属性

    flat属性用于确认按钮边框是否凸起,如果为False则凸起,如果为True则边框与背景是平坦的. 默认值为False,如果设置为True,则除非按下按钮,否则大多数样式都不会绘制按钮背景.通过使用s ...

  2. 【ZJOI2019】线段树(线段树 & dp)

    Link UOJ LOJ Luogu Solution 很玄妙的一道题,考察了对线段树较本质的理解 然而我并不会这个所谓最可做的题 首先,虽然题目很复杂,好像每个点的标记变化都很玄学,但是我们可以深入 ...

  3. 深入理解Java虚拟机(三)——垃圾回收策略

    所谓垃圾收集器的作用就是回收内存空间中不需要了的内容,需要解决的问题是回收哪些数据,什么时候回收,怎么回收. Java虚拟机的内存分为五个部分:程序计数器.虚拟机栈.本地方法栈.堆和方法区. 其中程序 ...

  4. 使用数据泵,在不知道sys用户密码的情况下导出导入

    expdp \"/as sysdba\" directory=my_dir logfile=expdp.log dumpfile=expdp_scott.dmp schemas=s ...

  5. 淘宝|蚂蚁|菜鸟|盒马|嘀嘀|饿了么面经(已拿多个offer)

    上一篇的同学拿到了bigo和腾讯的offer,这一次的分享来自两位同学的面试综合,他们分别拿到了菜鸟.嘀嘀.盒马的多个offer,由于面试的时间跨度时间太长,且面试的部门太多,只能回忆到具体的面试题, ...

  6. 判断一个对象是否为空?怎么得到一个对象的第几个键名(key)?

    var obj = {"微信":[],"qq":[]} console.log( Object.keys(obj) ) // ["微信",& ...

  7. f12 Network的解析

    Chrome开发者工具面板 面板上包含了Elements面板.Console面板.Sources面板.Network面板.Timeline面板.Profiles面板.Application面板.Sec ...

  8. element Cascader 多选 点击文字选中

    html 部分 1 <el-form-item label="A部署位置" > 2 <el-cascader 3 v-model="itemType.a ...

  9. css进阶 02-CSS布局

    02-CSS布局 #前言 #常见的布局属性 (1)display 确定元素的显示类型: block:块级元素. inline:行内元素. inline-block:对外的表现是行内元素(不会独占一行) ...

  10. Nebula Graph 在微众银行数据治理业务的实践

    本文为微众银行大数据平台:周可在 nMeetup 深圳场的演讲这里文字稿,演讲视频参见:B站 自我介绍下,我是微众银行大数据平台的工程师:周可,今天给大家分享一下 Nebula Graph 在微众银行 ...