原文  http://blog.csdn.net/xdd19910505/article/details/41900693

堆和栈这两个字我们已经接触多很多次,那么具体是什么存在栈中什么存在堆中呢?就拿 JavaScript 中的变量来说:

首先 JavaScript 中的变量分为基本类型和引用类型。

基本类型就是保存在栈内存中的简单数据段,而引用类型指的是那些保存在堆内存中的对象。

1 、基本类型

基本类型有 Undefined、Null、Boolean、Number 和String。这些类型在内存中分别占有固定大小的空间,他们的值保存在栈空间,我们通过按值来访问的。

2 、引用类型

引用类型,值大小不固定,栈内存中存放地址指向堆内存中的对象。是按引用访问的。如下图所示:栈内存中存放的只是该对象的访问地址, 在堆内存中为这个值分配空间 。 由于这种值的大小不固定,因此不能把它们保存到栈内存中。但内存地址大小的固定的,因此可以将内存地址保存在栈内存中。 这样,当查询引用类型的变量时, 先从栈中读取内存地址, 然后再通过地址找到堆中的值。对于这种,我们把它叫做按引用访问。

其他语言中的内存分配类似。

PS:当我们看到一个变量类型是已知的,就分配在栈里面,比如INT,Double等。其他未知的类型,比如自定义的类型,因为系统不知道需要多大,所以程序自己申请,这样就分配在堆里面。

为什么会有栈内存和堆内存之分?

通常与垃圾回收机制有关。为了使程序运行时占用的内存最小。

当一个方法执行时,每个方法都会建立自己的内存栈,在这个方法内定义的变量将会逐个放入这块栈内存里,随着方法的执行结束,这个方法的内存栈也将自然销毁了。因此,所有在方法中定义的变量都是放在栈内存中的;

当我们在程序中创建一个对象时,这个对象将被保存到运行时数据区中,以便反复利用(因为对象的创建成本通常较大),这个运行时数据区就是堆内存。堆内存中的对象不会随方法的结束而销毁,即使方法结束后,这个对象还可能被另一个引用变量所引用(方法的参数传递时很常见),则这个对象依然不会被销毁,只有当一个对象没有任何引用变量引用它时,系统的垃圾回收机制才会在核实的时候回收它。

转载于:https://www.cnblogs.com/wxiaona/p/4998219.html

JavaScript变量——栈内存or堆内存相关推荐

  1. python释放变量内存_Python尚学堂高淇|1113引用的本质栈内存,堆内存,内存的示意图,标识符,变量的声明初始化,垃圾回收机制...

    011-引用的本质-栈内存和堆内存-内存的示意图在Python当中,变量也成为:对象的引用,因为,变量的存储就是对象的地址变量通过地址引用了对象变量位于堆内存(压栈,出栈等细节,后续再介绍)对象位于: ...

  2. JavaScript栈内存和堆内存区别

    和栈这两个字我们已经接触多很多次,那么具体是什么存在栈中什么存在堆中呢?就拿JavaScript中的变量来说: 首先JavaScript中的变量分为基本类型和引用类型. 基本类型就是保存在栈内存中的简 ...

  3. JS 中的 栈内存和堆内存

    栈内存 1.访问顺序 栈是一种先进后出的数据结构,栈内存是内存中用于存放临时变量的一片内存块. 它是一种特殊的列表,栈内的元素只能通过列表的一端访问,这一端称为栈顶,另一端称为栈底. 2.存储数据 一 ...

  4. Java栈内存、堆内存、方法区对对象和引用的关系

    问题:Java栈内存.堆内存.方法区对对象和引用的关系 答案: 1.单个对象 如图所示: (1)首先类加载器加载要运行的类,首先将main方法加载进方法区,并进栈内存,顺序执行代码,创建对象,将对象的 ...

  5. 数据类型,栈内存、堆内存

    一.基础数据类型 二.栈和堆的区别 三.栈内存.堆内存 四.栈.队列.树.链表 基础数据类型 我把它总结为:USONB(是不是很nice哈哈) Undefined.String.Symbol.Obje ...

  6. Java必突-JVM知识专题(一): Java代码是如何跑起来的+类加载到使用的过程+类从加载到使用核心阶段(类初始化)+类加载的层级结构+什么是JVM的内存区域划分?Java虚拟机栈、Java堆内存

    前言: 该章节知识点梳理:本文主要是入门和了解jvm,不做深入 1.Java代码是如何运行起来的? 2.类加载到使用的过程? 3.验证准备和初始化的过程? 4.类从加载到使用核心阶段:初始化.类加载器 ...

  7. 栈内存和堆内存的区别

    总结: 1 栈:为编译器自动分配和释放,如函数参数.局部变量.临时变量等等 2 堆:为成员分配和释放,由程序员自己申请.自己释放.否则发生内存泄露.典型为使用new申请的堆内容. 除了这两部分,还有一 ...

  8. 栈内存和堆内存的区别(一个笔试题的一部分)

    笔试题目:请解释一个栈内存与一个堆内存的区别,请分析下面代码运行是否有问题,如果有问题请改正. char* GetMemory(void) { char p[] = "Hello world ...

  9. 栈内存 ,堆内存区别 C++ 动态内存 == 与equal区别 复合函数奇偶性 三角函数转换公式: 虚函数和纯虚函数: C++ 中的运算符重载 数据封装,数据抽象 C++ 接口(抽象类

    目录 栈内存 ,堆内存区别 C++ 动态内存 == 与equal区别 复合函数奇偶性 三角函数转换公式: 虚函数和纯虚函数: C++ 中的运算符重载 数据封装,数据抽象 C++ 接口(抽象类): #和 ...

最新文章

  1. 机器学习概念 — 线性感知机、线性回归、单个神经元、多层次神经元
  2. 带您走进七周七语言的程序世界
  3. IDisposable实现的方法什么时候被执行的
  4. ATM(BZOJ 1179)
  5. hadoop jar包_快速搭建Hadoop-Hive-Zoopkeeper-Sqoop环境进入Sqoop学习环境
  6. 打不开磁盘“D:\CentOS7\CentOS7.vmdk”或它所依赖的某个快照磁盘。
  7. 剑指Offer - 面试题61. 扑克牌中的顺子
  8. asp.net 页面缓存、数据缓存
  9. c#求长方形的面积周长公式_长方形的面积和周长公式是什么?
  10. 小企业会计准则 ——主要账务处理和财务报表(1)
  11. 金融行业基于 DELL EMC 高端存储的核心系统实践经验分享
  12. 程序员在囧途之风投五宗罪
  13. zend studio 12.5 安装aptana
  14. 中关村标协智能物联分技术委员会成立,小米张明当选第一届主任委员
  15. 字节跳动混沌工程实践总结
  16. 清梦_飘云羽逸_新浪博客
  17. 利用阿里云虚拟机作为跳板机实现内网穿透
  18. iphone开发之仿微信用户引导界面的实现
  19. 我真希望有人在我学计算机之前,就告诉了我这100多个程序员学习网站!【全编程人员都可以看】
  20. rstudio安装后如何打开_如何安装R与Rstudio

热门文章

  1. python合法标识符int32_在Python中使用0xFFFFFFFF掩码检测int32溢出?
  2. 【暖*墟】#逆矩阵# 矩阵求逆的思路与方法
  3. pchar,pwidechar,pansichar作为返回参数时内存访问错误
  4. 【从零开始学BPM,Day2】默认表单开发
  5. 如何快速重置打印队列
  6. ASP.NET防伪令牌与JSON有效载荷
  7. Introduction to PostGIS 之线性参考、地理编码
  8. [多级联动下拉选择框]和[Tree to Tree]续——让他们可以设置默认值
  9. 几种软负载均衡策略分析
  10. Coherence-Enhancing Shock Filters(附源码)