编程语言书籍中经常解释:
值类型被创建在栈上,引用类型被创建在堆上。
 
构造函数,原型之类的算是引用类型吗?
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. react-native实现电影列表

    页面运行效果 代码: import React, { Component } from "react"; import { Image, FlatList, StyleSheet, ...

  2. 使用bcftools提取指定样本的vcf文件(extract specified samples in vcf format)

    1.下载安装bcftools. 2.准备样本ID文件,这里命名为samplelistname.txt,一个样本一行,如下所示: sample1 sample2 sample3 3.输入命令: bcft ...

  3. java 分隔函数split("",-1)的用途

    转: java 分隔函数split("",-1)的用途 2017年12月14日 11:37:58 jaryle 阅读数:8517   1.如果字符串最后一位有值,则没有区别, 2. ...

  4. Luogu P2852 [USACO06DEC]牛奶模式Milk Patterns

    题目链接 \(Click\) \(Here\) 水题.利用\(Height\)的性质维护一个单调栈即可. #include <bits/stdc++.h> using namespace ...

  5. (Dijkstra) POJ1797 Heavy Transportation

    Heavy Transportation Time Limit: 3000MS   Memory Limit: 30000K Total Submissions: 53170   Accepted:  ...

  6. Linux设备树(一 概述)

    一 概述 设备树(Device tree)是一套用来描述硬件属相的规则.ARM Linux采用设备树机制源于2011年3月份Linux创始人Linus Torvalds发的一封邮件,在这封邮件中他提倡 ...

  7. 解析:为什么设计师选择mac电脑居多?

    mac电脑的使用者中程序员和设计师居多,上篇文章说明了程序员选择mac的原因以及使用体验,这次,本文说明一下,设计师选择mac的原因. 解析:为什么程序员应该有一台Mac个人电脑? 1.外观. 设计师 ...

  8. 流畅的python--python数据模型

    python最好的品质之一就是一致性.初步接触python可能会len(collection)而不是collection.len()觉得不适应,这是通常所说的“python风格”(Pythonic)的 ...

  9. 2017-12-15python全栈9期第二天第三节之使用while循环输出0到10不包含7

    #!/user/bin/python# -*- coding:utf-8 -*-count = 0while count < 10: count += 1 if count == 7 : con ...

  10. NorFlash 学习

    目录 NorFlash 学习 NOR/NAND Flash的差别 引脚接口 命令 参数识别(CFI) 写数据 程序设计 程序优化 其他设计点 title: NorFlash 学习 tags: ARM ...