v8的内存分配 (栈(执行环境)跟堆)
堆内存负责垃圾回收机制,只有新生代和老生代两部分
新生代:对等分的(严格)
老生代: 都是由新生代转变的(连续的空间)
内存空间
注意: node(v14)已经为2GB了,内存空间可改 (因为node底层是c++,可以扩)
为什么内存才2GB(1.4GB)呢?
因为前端代码是不持久化的,做更多的是轻业务
如果回收一次1.5g堆内存50ms,那4GB要200ms
200ms专门用来回收垃圾什么事情都不做的话,显然是不能接受的,那么慢,所以更多把js做的比较轻,所以v8到现在才扩到2GB,因为没必要那么大
垃圾回收算法
新生代简单来说是copy scavenge 算法(新生代互换)
老生代 就是标记整理清除 之前是标记清除,现在是标记整理
一开始变量都是在新生代中的,满足条件才会到老生代
一开始有obj在from空中,之后有obj1,obj2也在from中,之后obj1,obj2代码删除了,但是内存还没有清除,只是告诉内存是垃圾,然后这个时候要加入obj3,发现form空间满了,GC就会对form进行清除,然后就把obj跟obj3copy到to空间,然后把form跟to空间对调,来回往复,这就叫新生代互换,
问题:
新生代为什么要采用copy这种形式呢?
From有32MB To也是,牺牲空间换时间(时间复杂度优先)
因为总有一半被浪费掉,因为空间浪费,copy又是最简单的操作,只要互换就行
老生代为什么不用copy呢?
因为老生代有1400MB太大了
GC有个根节点,所有变量都会变根引用
老生代算法:
- 广度扫描
- 标记
- 增量标记
因为速度快了, 主线程—>GC—>主线程—>GC 可能1次GC只标记了几个,让现场切换的更频繁
标记清除:
标记整理清除:
先整理后清除,
先整理后清除会覆盖垃圾,就减少了清除的操作了
新生代什么时候晋升为老生代
各位大佬们,觉得可以点个赞呗!!!