JavaScript之内存空间

简介: JavaScript之内存空间

开发中,声明变量是每个前端都经常做的一件事,那么你声明的变量都是怎么存放的呢?


开发中的变量按数据类型分为


基本数据类型(Undefined、Null、Number、String、Boolean和Symbol)


引用数据类型(Object)


浏览器内存空间中有栈和堆,其中


存放基本数据类型以及引用数据类型的内存地址


存放引用数据类型


下面我们用图更加形象的解释一下栈和堆:



可以看到,当查找引用数据类型的时候,先在栈中找到它的内存地址,然后通过内存地址找到堆中的Object(可能这就是叫做引用数据类型的原因吧)


计算机对栈的读取要比堆快,而且栈中每个变量占有固定大小的空间,而Object的大小是变化的(可以对其进行增删改查操作),所以Object放在堆中,但是栈中存放有它对应的内存地址,通过这种方式实现引入数据类型的读取和操作。


可能代码+图会更加好理解:


let a = 1,b = 'str',c = {name:'c'},d = false;复制代码


接下来我们看几个例子:


let a = 1;
let b = a;
a = 2;
a // 2
b // 1复制代码


let a = 1,在内存中开辟a的内存1


let b=a,在内存中开辟b的内存1


a = 2,将a内存中的值修改为2


let obj1 = {name:'obj1'};
let obj2 = obj1;
obj1.name = 'obj2';
obj1 // {name:'obj2'}
obj2 // {name:'obj2'}复制代码


let obj1 = {name:'obj1'},在堆中保存对象 {name:'obj1'},并将变量obj1指向该对象的内存地址


let obj2 = obj1,在栈中创建obj2的空间,并将其指向{name:'obj1'}的内存地址


obj1.name = 'obj2',通过obj1对{name:'obj1'}的引用,修改其name为obj2,所以该对象变为{name:'obj2'}


总结:(源自高程3)


如果从一个变量向另一个变量复制基本类型的值,会在变量对象上创建一个新值,然后把该值复制 到为新变量分配的位置当从一个变量向另一个变量复制引用类型的值时,同样也会将存储在变量对象中的值复制一份放到 为新变量分配的空间中。不同的是,这个值的副本实际上是一个指针,而这个指针指向存储在堆中的一 个对象。复制操作结束后,两个变量实际上将引用同一个对象。因此,改变其中一个变量,就会影响另 一个变量

既然说到内存,我们就再谈一下浏览器内存空间的管理,如上所述


当声明一个变量的时候,如果为基本数据类型,浏览器会为其在栈中分配内存空间,如果为引用数据类型,浏览器会为该变量在栈中分配内存空间,同时将其声明的Object存放在堆中,并将该变量指向Object的内存地址


接下来是该变量的使用过程(读,写)


如果该变量不再被使用,则将其释放,浏览器的垃圾回


而JavaScript 中最常用的垃圾收集方式是标记清除


当变量进入环境的时候(如:变量被声明),将其标记为‘进入环境’,而当该变量不再需要的时候,则将其标记为‘离开环境’。每隔一段时间,浏览器的垃圾收集器就会运行一次,将标记为‘离开环境’的变量回收,并释放其内存。


注:以上为了方便理解对垃圾回收机制做了简化。


如果有错误或者不严谨的地方,请给予指正,十分感谢!

相关文章
|
1月前
|
Web App开发 监控 JavaScript
监控和分析 JavaScript 内存使用情况
【10月更文挑战第30天】通过使用上述的浏览器开发者工具、性能分析工具和内存泄漏检测工具,可以有效地监控和分析JavaScript内存使用情况,及时发现和解决内存泄漏、过度内存消耗等问题,从而提高JavaScript应用程序的性能和稳定性。在实际开发中,可以根据具体的需求和场景选择合适的工具和方法来进行内存监控和分析。
|
1月前
|
JavaScript 前端开发 Java
避免 JavaScript 中的内存泄漏
【10月更文挑战第30天】避免JavaScript中的内存泄漏问题需要开发者对变量引用、事件监听器管理、DOM元素操作以及异步操作等方面有深入的理解和注意。通过遵循良好的编程实践和及时清理不再使用的资源,可以有效地减少内存泄漏的风险,提高JavaScript应用程序的性能和稳定性。
|
2月前
|
存储 JavaScript 前端开发
JS 中的内存管理
【10月更文挑战第17天】了解和掌握 JavaScript 中的内存管理是非常重要的。通过合理的内存分配、及时的垃圾回收以及避免内存泄漏等措施,可以确保代码的高效运行和稳定性。同时,不断关注内存管理的最新发展动态,以便更好地应对各种挑战。在实际开发中要时刻关注内存使用情况,以提升应用的性能和质量。
40 1
|
29天前
|
监控 JavaScript 算法
如何使用内存监控工具来定位和解决Node.js应用中的性能问题?
总之,利用内存监控工具结合代码分析和业务理解,能够逐步定位和解决 Node.js 应用中的性能问题,提高应用的运行效率和稳定性。需要耐心和细致地进行排查和优化,不断提升应用的性能表现。
181 77
|
29天前
|
监控 JavaScript
选择适合自己的Node.js内存监控工具
选择合适的内存监控工具是优化 Node.js 应用内存使用的重要一步,它可以帮助你更好地了解内存状况,及时发现问题并采取措施,提高应用的性能和稳定性。
116 76
|
29天前
|
监控 JavaScript 数据库连接
解读Node.js内存监控工具生成的报告
需要注意的是,不同的内存监控工具可能会有不同的报告格式和内容,具体的解读方法可能会有所差异。因此,在使用具体工具时,还需要参考其相关的文档和说明,以更好地理解和利用报告中的信息。通过深入解读内存监控报告,我们可以不断优化 Node.js 应用的内存使用,提高其性能和稳定性。
100 74
|
1月前
|
存储 缓存 JavaScript
如何优化Node.js应用的内存使用以提高性能?
通过以上多种方法的综合运用,可以有效地优化 Node.js 应用的内存使用,提高性能,提升用户体验。同时,不断关注内存管理的最新技术和最佳实践,持续改进应用的性能表现。
122 62
|
1月前
|
监控 JavaScript Java
Node.js中内存泄漏的检测方法
检测内存泄漏需要综合运用多种方法,并结合实际的应用场景和代码特点进行分析。及时发现和解决内存泄漏问题,可以提高应用的稳定性和性能,避免潜在的风险和故障。同时,不断学习和掌握内存管理的知识,也是有效预防内存泄漏的重要途径。
130 52
|
26天前
|
存储 缓存 监控
如何使用内存监控工具来优化 Node.js 应用的性能
需要注意的是,不同的内存监控工具可能具有不同的功能和特点,在使用时需要根据具体工具的要求和操作指南进行正确使用和分析。
67 31
|
1月前
|
缓存 监控 JavaScript
避免在Node.js中出现内存泄漏
总之,避免内存泄漏需要在开发过程中保持谨慎和细心,遵循最佳实践,不断优化和改进代码。同时,定期进行内存管理的检查和维护也是非常重要的。通过采取这些措施,可以有效地降低 Node.js 应用中出现内存泄漏的风险,确保应用的稳定和性能。