编程语言书籍中经常解释:
值类型被创建在栈上,引用类型被创建在堆上。
 
构造函数,原型之类的算是引用类型吗?
5种基本数据类型有Undefined、Null、Boolean、Number 和 String,基本类型在栈中。
当我们需要访问引用类型(如对象,数组,函数等)的值时,首先从栈中获得该对象的地址指针(都会有个变量名),然后再从堆内存中取得所需的数据。
 
局部变量,全局变量,静态局部之类的区别?
全局变量也被创建在堆上。
栈中分配局部变量空间,堆区是向上增长的用于分配程序员申请的内存空间。另外还有静态区是分配静态变量,全局变量空间的;只读区是分配常量和程序代码空间的;以及其他一些分区。
 
栈遵循后进先出,从栈顶开始进去,释放也是从栈顶开始释放。

从栈(也叫堆栈)中释放块(free block)只不过是指针的偏移而已。
 
比如例子:
var p1={name:"zs",age:"12"},//对象在堆里。p1在栈里。
var p2=p1;//p1和p2引用同一个堆。
p2.name="ls",//操作了堆
console.log(p1.name)——>ls。
p2=null,//只是栈里的p2被删除了
console.log(p2.name)//此时报错
console.log(p1.name)//依然是ls。因为堆没有被删除,引用存在。
那么这里怎么才能去释放引用的堆内存?
堆里的东西只要不存在引用就会被回收
p1=null。这个堆就被释放了
 
访问时一种是按值一种是按引用。这个就涉及到深拷贝和浅拷贝。即看拷贝传的是值还是地址。
例:
var a = {
key1:"11111"
}
function Copy(p) {var c = {};
for (var i in p) {
c[i] = p[i];//这里就是只传了值。c的堆里有了这些值
}
return c;
}
a.key2 = ['小辉','小辉'];
var b = Copy(a);//这里指向了c指向的堆
b.key3 = '33333';//b操作了堆
alert(b.key1); //
alert(b.key3); //
alert(a.key3); //undefined
再一个例子:
function setName(obj) {
obj.name = 'Nicholas';
obj = new Object();
obj.name = 'Greg';
}
var obj = new Object();
setName(obj);
alert(obj.name);//'Nicholas'

递归的例子:

function sum(i)
{
if (i == 1) return 1;
return i + sum(i - 1);
}
这是一个递归函数,函数自己调用自己,那么每个调用,都必须保存一个i的变量。这样每次在栈里都保存了一个i。
堆栈的栈顶始终保持着函数的局部变量。当函数返回,则往回收缩。即直到函数调用结束,里面所有的i按照后进先出逐个销毁。

堆(heap)与栈(stack)的更多相关文章

  1. [转]JVM 内存初学 (堆(heap)、栈(stack)和方法区(method) )

    这两天看了一下深入浅出JVM这本书,推荐给高级的java程序员去看,对你了解JAVA的底层和运行机制有比较大的帮助.废话不想讲了.入主题: 先了解具体的概念:JAVA的JVM的内存可分为3个区:堆(h ...

  2. 堆heap和栈Stack(百科)

    堆heap和栈Stack 在计算机领域,堆栈是一个不容忽视的概念,堆栈是两种数据结构.堆栈都是一种数据项按序排列的数据结构,只能在一端(称为栈顶(top))对数据项进行插入和删除.在单片机应用中,堆栈 ...

  3. JVM 内存初学 堆(heap)、栈(stack)和方法区(method)

    这两天看了一下深入浅出JVM这本书,推荐给高级的java程序员去看,对你了解JAVA的底层和运行机制有比较大的帮助.废话不想讲了.入主题:先了解具体的概念:JAVA的JVM的内存可分为3个区:堆(he ...

  4. 转:JVM 内存初学 (堆(heap)、栈(stack)和方法区(method) )

    原文地址:JVM 内存初学 (堆(heap).栈(stack)和方法区(method) ) 博主推荐 深入浅出JVM 这本书 先了解具体的概念:JAVA的JVM的内存可分为3个区:堆(heap).栈( ...

  5. java虚拟机知识和 内存 堆(heap)、栈(stack)和方法区(method)

    1.虚拟机实例 每个java程序都运行在自己的java虚拟机实例中,运行三个java程序就会得到三个虚拟机实例 守护线程(虚拟机自己使用,比如说执行垃圾收集任务的线程) 非守护线程(java初试线程, ...

  6. JVM 内存初学 (堆(heap)、栈(stack)和方法区(method) )(转载)

    想想面试的时候很多会问jvm这方面的问题虽然还是菜鸟不太能用到现在但是还是了解一下, 找资料的时候看见个大佬写的很好转载到这方便以后自己复习和给大佬做宣传 以下为大佬的博客原文: 这两天看了一下深入浅 ...

  7. iOS数据存储类型 及 堆(heap)和栈(stack)

    iOS数据存储类型 及 堆(heap)和栈(stack) 一般认为在c中分为这几个存储区: 1栈 --  由编译器自动分配释放. 2堆 --  一般由程序员分配释放,若程序员不释放,程序结束时可能由O ...

  8. java面试之----堆(heap)、栈(stack)和方法区(method)

    JAVA的JVM的内存可分为3个区:堆(heap).栈(stack)和方法区(method)也叫静态存储区. 堆区: 1.存储的全部是对象,每个对象都包含一个与之对应的class的信息.(class的 ...

  9. 堆(heap)和栈(stack)几点认识

    堆(heap)和栈(stack)主要的区别由以下几点:1.管理方式不同:2.空间大小不同:3.产生碎片不同:4.生长方向不同:5.分配归属不同:6.分配效率不同:7.存取效率不同:管理方式:对于栈来讲 ...

  10. JVM内存模型——堆(heap)、栈(stack)和方法区(method)

      JAVA的JVM的内存可分为3个区:堆(heap).栈(stack)和方法区(method) 堆区:堆内存用于存放由new创建的对象和数组.堆是JVM管理的内存中最大的一块,堆被所有线程共享,目的 ...

随机推荐

  1. python高并发的解决方案

    一.cnd加速 简单说就是把静态资源放到别人服务器上 全称:Content Delivery Network或Content Ddistribute Network,即内容分发网络 基本思路: 尽可能 ...

  2. struts2 二: 参数封装

    封装请求正文到对象中(非常重要) 1.静态参数封装 在struts.xml配置文件中,给动作类注入值.调用的是setter方法. struts.xml的编写: <action name=&quo ...

  3. ES6(promise)_解决回调嵌套简单应用

    一.前言 这个小案例是在node平台上应用的所以需要保证你的电脑: 1.安装和配置node.js环境 2.需要用node.js来开启一个http-server: 开启方法:https://blog.c ...

  4. 这3周以来的面试总结(C#/.net 智能硬件/物联网)

    2017.3找工作面试记录-第一周 2017.3找工作面试记录-第一周(2) 2017.3找工作面试记录-第二周 2017.4找工作面试记录-第三周 2017.4找工作面试记录-第三周(2)--金蝶 ...

  5. java连接数据库报了ssl连接的警告

    警告内容:Establishing SSL connection without server's identity verification is not recommended(不建议在没有服务器 ...

  6. 数据挖掘的标准流程-CRISP-DM

    1.起源 CRISP-DM (cross-industry standard process for data mining), 即为"跨行业数据挖掘过程标准".此KDD(know ...

  7. django新建项目

    命令: django-admin startproject 项目名 pycharm创建: 1. File --> New project --> 左侧选Django --> 右侧填项 ...

  8. 1042. Shuffling Machine (20)

    Shuffling is a procedure used to randomize a deck of playing cards. Because standard shuffling techn ...

  9. sklearn机器学习-泰坦尼克号

    sklearn实战-乳腺癌细胞数据挖掘(博主亲自录制视频) https://study.163.com/course/introduction.htm?courseId=1005269003& ...

  10. gcc生成含有C信息的汇编

    title: gcc生成含有C信息的汇编 tags: gcc date: 2018-10-24 23:40:19 --- https://www.cnblogs.com/fengkang1008/p/ ...