JS内存管理机制

容器化部署
• 阅读 1730

内存模型

  • 堆(引入数据类型:Object,Array)
  • 栈(基本数据类型:Undefined、Null、Boolean、Number和String)
  • 池(常量:const)
内存分配问题举例
let a = 10;
let b = a;
b = 20;
console.log(a)  // 10

JS内存管理机制

let obj = {
    aa: 20,
    bb: 30
}
let newObj = obj;
newObj.aa = 10;
console.log(obj.aa)  // 10

JS内存管理机制

内存的生命周期

let obj = {
    aa: 20,
    bb: 30
}
console.log(obj)  // 后面没有再使用,js机制会自动回收,这就是内存的生命周期

内存泄漏

// 导致内存泄漏的例子1
function fn(){
    demo = '我很棒'  // window.demo = '我很棒'
}
fn();
console.log(this.demo)  // 我很棒
// 导致内存泄漏的例子2
function fn2(){
    this.demo2 = 123;
}
fn2();
console.log(this.demo2)  // 123
// 闭包导致的内存泄漏
function findBF() {
    this.name = '肖战';
    this.leg = 165;
}
findBF.prototype.selectName = function() {
    let _this = this; // 有问题 js内存机制  1、全局变量不会回收  2、闭包内的变量也会持续保存在闭包中
    return function() {
        return _this.name;;
    }
    name = null;
}
let bf = new findBF();
console.log(bf.selectName()());
可通过chrome的工具查看内存情况(缺点:不够清晰)

JS内存管理机制

使用node查看内存情况(可查看到具体的内存使用情况)
console.log(process.memoryUsage());

JS内存管理机制

优化
function findBF() {
    this.name = '肖战';
    this.leg = 165;
}
findBF.prototype.selectName = function() {
    let name = this.name;
    return function() {
        return name;
    }
    name = null;
}
let bf = new findBF();
console.log(bf.selectName()());
console.log(process.memoryUsage());

JS内存管理机制

内存常驻

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>

<body>
    <div class="test">
        <p id="demo">好好学习</p>
        <button id="btn">移除节点</button>
    </div>
</body>
<script>
    window.onload = () => {
        let dom = document.getElementById('demo');
        setInterval(() => {
            let time = new Date();
            if (dom) {
                dom.innerHTML = JSON.stringify(time);
            }
            console.log('time');  // 即使节点移除,time也会一直打印,存在内存常驻问题
        }, 1000);

        let btn = document.getElementById('btn');
        btn.onclick = () => {
            dom.remove();
        }
    }
</script>

</html>
优化
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>

<body>
    <div class="test">
        <p id="demo">好好学习</p>
        <button id="btn">移除节点</button>
    </div>
</body>
<script>
    window.onload = () => {
        let dom = document.getElementById('demo');
        let timeInterval = setInterval(() => {
            let time = new Date();
            if (dom) {
                dom.innerHTML = JSON.stringify(time);
            }
            console.log('time');  // 即使节点移除,time也会一直打印,存在内存常驻问题
        }, 1000);

        let btn = document.getElementById('btn');
        btn.onclick = () => {
            // 显示的移除
            clearInterval(timeInterval);
            dom.remove();
        }
    }
</script>

</html>

垃圾回收机制

未创建对象前的内存

JS内存管理机制

// 垃圾回收 引用 所以不会被回收
let o = {
    a: {
        b: 2
    }
}

创建对象后的内存

JS内存管理机制

let o = {
    a: {
        b: 2
    }
}

let o2 = 0;  // o2对o进行了引用 o的原始引用被o2替换掉了
// o 是一个零引用状态
o = 1;

let oa = o2.a;
o2 = 'test';

o不会被回收,因为o的属性a还在被调用

JS内存管理机制

let o = {
    a: {
        b: 2
    }
}

let o2 = 0;  // o2对o进行了引用 o的原始引用被o2替换掉了
// o 是一个零引用状态
o = 1;

let oa = o2.a;
o2 = 'test';
oa = null;  // 释放内存

JS内存管理机制

引用

垃圾回收算法主要依赖引用的概念。在内存管理的环境中,一个对象如果有访问另一个对象的权限(隐式或者显示),叫做一个对象引用另一个对象。例如,一个JavaScript对象具有对它原型的引用(隐式引用)和对它属性的引用(显示引用)。

”对象“的概念不仅特指JavaScript对象,还包括函数作用域(或者全局词法作用域)。

引用计数垃圾收集

初级的垃圾收集算法。此算法把”对象是否不再需要“简化定义为”对象有没有其他对象引用到它“。如果没有引用指向该对象(零引用),对象将被垃圾回收机制回收。

缺点:循环引用不会被回收

function fn2(){
    let o = {};
    let o2 = {};
    o.a = o2;
    o2.a = o;
}
fn2();

标记清除算法

设置一个叫做根(root)的对象(在JavaScript里,根是全局对象)。垃圾回收器将定期从根开始,找所有从根开始引用的对象,然后找这些对象引用的对象......从根开始,垃圾回收器将找到所有可以获得的对象和收集所有不能获得的对象。

缺点:无法从根对象查询到的对象都将被清除(可被忽略)

点赞
收藏
评论区
推荐文章
晴空闲云 晴空闲云
4年前
javascript实践教程-05-数据类型
本节目标1.掌握js中7种数据类型。2.掌握5种基本数据类型number、string、boolean、null、undefined的声明。3.掌握js中数组的声明和数组相关的方法。4.掌握js中对象的声明和属性、方法的使用。内容摘要本篇介绍了js中的7种数据类型,其中5种基本数据类型:number、string、boolean、null、unde
Wesley13 Wesley13
4年前
java的内存机制
Java把内存划分成两种:一种是栈内存,另一种是堆内存。 Heap(堆)Stack(栈)JVM中的功能内存数据区内存指令区存储数据对象实例基本数据类型,指令代码,常量,对象的引用地址堆中存储数据堆内存用来存放由new创建的对象和数组。 保存对象实例,实际上是保存对象实例的属性值,属性的类型和
Jacquelyn38 Jacquelyn38
4年前
你不可不知的JS面试题
1、JS中有哪些内置类型?7种。分别是boolean、number、string、object、undefined、null、symbol。2、NaN是独立的一种类型吗?不是。NaN是number类型。3、如何判断是哪个类型?Object.prototype.toString.call(),返回为\objectType\。现在我们来验证一下
Jacquelyn38 Jacquelyn38
4年前
你不可不知的JS面试题(第一期)
1、JS中有哪些内置类型?7种。分别是boolean、number、string、object、undefined、null、symbol。2、NaN是独立的一种类型吗?不是。NaN是number类型。3、如何判断是哪个类型?Object.prototype.toString.call(),返回为objectType。现在我们来验证一下。Objec
Jacquelyn38 Jacquelyn38
4年前
面试官:JavaScript的数据类型你了解多少?
前言作为JavaScript的入门知识点,Js数据类型在整个JavaScript的学习过程中其实尤为重要。最常见的是边界数据类型条件判断问题。我们将通过这几个方面来了解数据类型:概念检测方法转换方法概念undefined、Null、Boolean、String、Number、Symbol、BigInt为基础类型;Ob
LinMeng LinMeng
5年前
js之传值与传址/undefined和null/严格模式
传值与传址基本数据类型有五种Undefined、Null、Boolean、Number和String引用数据类型有两种object,array,fn两种数据类型的区别:1.存储位置不同原始数据类型直接存储在栈(stack)中简单数据段,占据空间小,大小固定,属于被频繁使用的数据,所以存储在栈中;引用数据类型直接存
劳伦斯 劳伦斯
4年前
前端面试题自检 JS CSS 部分
JS类型JavaScript的简单数据类型Number,String,Boolean,Undefined,Null,Symboltypeof操作符的返回值numberstringbooleanundefinedobjectfunction
Stella981 Stella981
4年前
JavaScript的深拷贝和浅拷贝
一、数据类型数据分为基本数据类型(String,Number,Boolean,Null,Undefined,Symbol)和对象数据类型。、1.基本数据类型的特点:直接存储在栈(stack)中的数据2.引用数据类型的特点:存储的是该对象在栈中引用,真实的数据放在堆内存里。引用数据类型在栈中存储了指针,该指针指向堆中该实
Wesley13 Wesley13
4年前
C++内存管理
C内存管理一、内存分配方式在C中,内存分成5个区,分别是堆、栈、自由存储区、全局/静态区和常量存储区。栈:存放函数参数以及局部变量,在出作用域时,将自动被释放.栈内存分配运算内置于处理器的指令集中,效率
Wesley13 Wesley13
4年前
Java中的OutOfMemoryError的各种情况及解决和JVM内存结构
在JVM中内存一共有3种:Heap(堆内存),NonHeap(非堆内存)\3\和Native(本地内存)。\1\堆内存是运行时分配所有类实例和数组的一块内存区域。非堆内存包含方法区和JVM内部处理或优化所需的内存,存放有类结构(如运行时常量池、字段及方法结构,以及方法和构造函数代码)。本地内存是由操作系统管理的虚拟内存。当一个应用内存不足时
Stella981 Stella981
4年前
JavaScript学习小结
JavaScirpt变量可用来保存两种类型值:基本类型值,引用类型值基本类型值:Undefined,Null,Boolean,Number,String基本类型及引用类型值特点:1.基本类型值在内存中占据固定大小的空间,被保存在栈内存中;2.从一个变量向另一个变量复制基本类型值,会创建这个值的一个副本;
容器化部署
容器化部署
Lv1
何当共剪西窗烛,却话巴山夜雨时。
文章
4
粉丝
0
获赞
0