`

js内存方面的理解

阅读更多

在正式开始之前,我想先说两句,理解javascript系列博文是通过带领大家分析javascript执行时的内存分配情况,来解释javascript原理,具体会涵盖javascript预加载,闭包原理,面象对象,执行模型,对象模型...,文章的视角很特别,也非常深入,希望大家能接受这种形式,并提供宝贵意见。 

  原始值和引用值

  在ECMAScript中,变量可以存放两种类型的值,即原始值和引用值。原始值指的就是代表原始数据类型(基本数据类型)的值,即Undefined,Null,Number,String,Boolean类型所表示的值。引用值指的就是复合数据类型的值,即Object,Function,Array,以及自定义对象,等等。 

  栈和堆

  与原始值与引用值对应存在两种结构的内存即栈和堆。栈是一种后进先出的数据结构,在javascript中可以通过Array来模拟栈的行为

1
2
3
4
5
var arr = []; //创建一个栈
arr.push("apple");//压入元素"apple" ["apple"]
arr.push("orange");//压入元素"orange"   ["apple","orange"]
arr.pop();//弹出"orange"      ["apple"]
arr.push("banana");//压入元素"banana"   ["apple","banana"]

  我们来看一下,与之对应的内存图:

  原始值是存储在栈中的简单数据段,也就是说,他们的值直接存储在变量访问的位置。

  堆是存放数据的基于散列算法的数据结构,在javascript中,引用值是存放在堆中的。引用值是存储在堆中的对象,也就是说,存储在变量处的值(即指向对象的变量,存储在栈中)是一个指针,指向存储在堆中的实际对象。

  例:var obj = new Object(); obj存储在栈中它指向于new Object()这个对象,而new Object()是存放在堆中的。

  那为什么引用值要放在堆中,而原始值要放在栈中,不都是在内存中吗,为什么不放在一起呢?那接下来,让我们来探索问题的答案!

  首先,我们来看一下代码:

1
2
3
4
5
6
7
8
9
10
11
12
function Person(id,name,age){
    this.id = id;
    this.name = name;
    this.age = age;
}
 
var num = 10;
var bol = true;
var str = "abc";
var obj = new Object();
var arr = ['a','b','c'];
var person = new Person(100,"笨蛋的座右铭",25);

   然后我们来看一下内存分析图:

 

 

  变量num,bol,str为基本数据类型,它们的值,直接存放在栈中,obj,person,arr为复合数据类型,他们的引用变量存储在栈中,指向于存储在堆中的实际对象。

  由上图可知,我们无法直接操纵堆中的数据,也就是说我们无法直接操纵对象,但我们可以通过栈中对对象的引用来操作对象,就像我们通过遥控机操作电视机一样,区别在于这个电视机本身并没有控制按钮。

  现在让我们来回答为什么引用值要放在堆中,而原始值要放在栈中的问题:记住一句话:能量是守衡的,无非是时间换空间,空间换时间的问题。堆比栈大,栈比堆的运算速度快,对象是一个复杂的结构,并且可以自由扩展,如:数组可以无限扩充,对象可以自由添加属性。将他们放在堆中是为了不影响栈的效率。而是通过引用的方式查找到堆中的实际对象再进行操作。相对于简单数据类型而言,简单数据类型就比较稳定,并且它只占据很小的内存。不将简单数据类型放在堆是因为通过引用到堆中查找实际对象是要花费时间的,而这个综合成本远大于直接从栈中取得实际值的成本。所以简单数据类型的值直接存放在栈中。

  总结:

  程序很简单,但它是一切的根本,基础是最重要的,因为摩天大厦也是一块砖一块瓦的搭建起来的。内存是程序执行的根本,搞懂了内存,就等于搞懂了一切。

分享到:
评论

相关推荐

    js内存管理及优化总结和文档

    6. **使用最新的JavaScript引擎**:现代浏览器的JS引擎(如V8)在内存管理和优化方面做了很多工作,可以充分利用它们的特性。 7. **理解和使用闭包**:闭包可以保存状态,但也可能导致内存泄漏,合理使用可避免问题...

    javascript 内存泄漏 检测 解决 检测工具 原因分析

    JavaScript内存泄漏是一个重要的编程问题,尤其对于Web应用来说,它可能导致性能下降,用户界面响应变慢,甚至在...通过实践和学习,你可以提高自己在JavaScript内存管理方面的技能,从而编写出更加健壮和高效的代码。

    JavaScript内存统计专题图示例

    总的来说,JavaScript内存统计专题图的创建涉及到数据处理、图表库选择与配置、绘图逻辑编写、动态更新以及性能优化等多个方面。通过掌握这些知识点,你不仅可以制作出美观的统计图表,还能在GIS应用中实现高效的...

    js闭包个人理解

    在JavaScript中,闭包(Closure)是一种非常重要的概念,它涉及到函数作用域、变量生命周期以及函数内部对外部作用域的访问等多个方面。本文将基于提供的文件内容,深入探讨JavaScript闭包的基本原理及其应用。 ###...

    sIEve-0.0.8-javascript内存泄漏检测工具

    附带的ABCJava.Com.url可能是一个链接,指向有关sIEve的更多信息或者JavaScript内存管理的相关教程和资源,这对于深入理解和解决问题非常有帮助。 总的来说,sIEve作为一款JavaScript内存泄漏检测工具,对于提升Web...

    唯快不破——高效定位线上Node.js应用内存泄漏.pdf

    V8是Node.js的底层JavaScript引擎,因此理解V8的GC过程对于优化Node.js应用性能及排查内存泄漏至关重要。V8中的堆内存被划分为几个区域,包括: - CodeSpace:存放编译后的代码。 - MapSpace:存放对象指向的隐藏类...

    藏经阁-穆客带你快速定位Node.js内存泄露.pdf

    Node.js是一款基于Chrome V8引擎的JavaScript运行环境,以其事件驱动、非阻塞I/O的特性在构建高效、轻量级的Web应用和服务API方面表现出色。由于其高效的开发效率和易扩展性,Node.js在初创公司和大型企业如Uber、...

    Android-WebView的封装获取标题获取图片js支持内存泄漏处理

    总的来说,封装一个功能完善的WebView需要考虑多个方面,包括基本的网页加载、信息获取、JavaScript交互以及性能优化。正确地使用和管理WebView,能为Android应用带来丰富的网页功能,同时保持应用的高效运行和良好...

    nodejs之VM的内存处理测试的demo

    在Node.js环境中,VM...通过这样的测试,开发者可以更好地理解Node.js中的内存管理,尤其是VM模块如何影响内存使用,以及如何优化和调试与内存相关的性能问题。在实际项目中,这有助于提升应用程序的稳定性和效率。

    03_JS内存管理和闭包(day03)1

    JavaScript是一种动态类型的脚本语言,它在执行过程中自动管理内存,这意味着开发者不需要像在C++...总的来说,JavaScript的内存管理和闭包是其核心特性,理解并熟练运用这些概念对于编写高效、无泄漏的代码至关重要。

    webView解决内存泄漏

    在Android开发中,WebView是一...综上所述,解决WebView内存泄漏问题需要关注其生命周期管理、缓存策略、JavaScript交互方式等多个方面。遵循最佳实践并持续优化,可以有效防止内存泄漏,提升应用的稳定性和用户体验。

    javascript错误的认识不用关心内存管理.docx

    本文将深入探讨这一主题,帮助开发者更好地理解 JavaScript 内存管理的重要性。 #### JavaScript 内存管理概述 内存管理是所有编程语言中的一个重要方面,它涉及到内存的分配、使用以及释放。对于低级语言如 C 和 ...

    java内存模型(有助理解多线程)

    ### Java内存模型(有助理解多线程) #### JMM简介 Java内存模型(JMM,Java Memory Model)是Java虚拟机规范中一个重要的概念,它规定了程序中各种变量(包括实例字段、静态字段和数组元素)的访问规则,以及在...

    Node.js-Dennard一个微小零依赖性跨平台Node.js模块显示应用程序的内存占用

    标题中的“Node.js-Dennard一个微小零依赖性跨平台Node.js模块显示应用程序的内存占用”揭示了一个关键知识点:Dennard是一个针对Node.js环境的轻量级、无依赖的工具,它允许开发者监测应用的内存使用情况。...

    javaScript闭包的理解

    ### JavaScript闭包的理解 #### 一、闭包的定义与特点 闭包是JavaScript中一个非常重要的概念,它指的是一个函数能够访问并操作其外部作用域中的变量的能力。这一特性使得JavaScript具有了一些其他语言不具备的...

    Node.js-一个给开发者使用的AndroidApp内存清理监控工具

    Node.js,作为一个强大的JavaScript运行环境,通常用于构建服务器端应用程序。然而,这个技术同样可以被创造性地应用于移动开发领域,尤其是在Android平台上进行性能优化。本文将深入探讨如何利用Node.js来创建一个...

    turbo-net一个Node.js的性能和低内存占用TCP库

    在代码实现方面,Turbo-Net的源码`mafintosh-turbo-net-550958f`提供了详细的实现细节,包括事件监听、数据读写、连接管理等模块,通过阅读和学习这些源码,开发者能够深入理解如何在Node.js中实现高性能的TCP网络...

    网页核心四元素内存使用及回收.docx

    网页的核心四元素包括DOM节点、图片元素、样式表和JavaScript,它们在网页运行过程中占据了大量内存,理解它们的内存使用及回收机制对于优化网页性能至关重要。以下是对这些元素的详细分析: 1. DOM节点的内存占用...

    Sympact运行JS脚本并分析其执行时间CPU使用情况和内存使用情况

    - 内存管理是JavaScript性能优化的重要方面,过多的内存消耗可能导致页面加载慢,甚至内存泄漏。 - `Sympact`能够追踪内存分配,揭示内存峰值和对象生命周期,帮助定位内存泄露问题。 - 通过优化数据结构,使用...

    【JavaScript源代码】vue内存泄露详解.docx

    内存泄露的危害主要体现在以下几个方面: - **性能下降**:内存泄露会导致可用内存减少,使得应用程序运行变慢。 - **资源耗尽**:长期的内存泄露可能会导致系统资源耗尽,最终引起程序崩溃。 - **维护成本增加**:...

Global site tag (gtag.js) - Google Analytics