堆栈理解

原创 2015年07月07日 15:03:10

1 内存分配策略 
  按照编译原理的观点,程序运行时的内存分配有三种策略,分别是静态的,栈式的,和堆式的. 
  静态存储分配是指在编译时就能确定每个数据目标在运行时刻的存储空间需求,因而在编译时就可以给他们分配固定的内存空间.这种分配策略要求程序代码中不允许有可变数据结构(比如可变数组)的存在,也不允许有嵌套或者递归的结构出现,因为它们都会导致编译程序无法计算准确的存储空间需求. 
  栈式存储分配也可称为动态存储分配,是由一个类似于堆栈的运行栈来实现的.和静态存储分配相反,在栈式存储方案中,程序对数据区的需求在编译时是完全未知的,只有到运行的时候才能够知道,但是规定在运行中进入一个程序模块时,必须知道该程序模块所需的数据区大小才能够为其分配内存.和我们在数据结构所熟知的栈一样,栈式存储分配按照先进后出的原则进行分配。 
  静态存储分配要求在编译时能知道所有变量的存储要求,栈式存储分配要求在过程的入口处必须知道所有的存储要求,而堆式存储分配则专门负责在编译时或运行时模块入口处都无法确定存储要求的数据结构的内存分配,比如可变长度串和对象实例.堆由大片的可利用块或空闲块组成,堆中的内存可以按照任意顺序分配和释放. 

2 Java 中的堆和栈 
  Java把内存划分成两种:一种是栈内存,一种是堆内存。 
  在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配。 
  当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java会自动释放掉为该变量所分配的内存空间,该内存空间可以立即被另作他用。 
  堆内存用来存放由new创建的对象和数组。 
  在堆中分配的内存,由Java虚拟机的自动垃圾回收器来管理。 
  在堆中产生了一个数组或对象后,还可以在栈中定义一个特殊的变量,让栈中这个变量的取值等于数组或对象在堆内存中的首地址(数组的下标),栈中的这个变量就成了数组或对象的引用变量。 
  引用变量就相当于是为数组或对象起的一个名称,以后就可以在程序中使用栈中的引用变量来访问堆中的数组或对象。 
  具体的说: 
  栈与堆都是Java用来在Ram中存放数据的地方。与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆。 
  Java的堆是一个运行时数据区,类的(对象从中分配空间。这些对象通过new、newarray、anewarray和multianewarray等指令建立,它们不需要程序代码来显式的释放。堆是由垃圾回收来负责的,
堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,因为它是在运行时动态分配内存的,Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是,由于要在运行时动态分配内存,存取速度较慢。 
  栈的优势是,存取速度比堆要快,仅次于寄存器,栈数据可以共享。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。栈中主要存放一些基本类型的变量(,int, short, long, byte, float, double, boolean, char)和对象句柄。 
  栈有一个很重要的特殊性,就是存在栈中的数据可以共享。假设我们同时定义: 
  int a = 3; 
  int b = 3; 
  编译器先处理int a = 3;首先它会在栈中创建一个变量为a的引用,然后查找栈中是否有3这个值,如果没找到,就将3存放进来,然后将a指向3。接着处理int b = 3;在创建完b的引用变量后,因为在栈中已经有3这个值,便将b直接指向3。这样,就出现了a与b同时均指向3的情况。这时,如果再令a=4;那么编译器会重新搜索栈中是否有4值,如果没有,则将4存放进来,并令a指向4;如果已经有了,则直接将a指向这个地址。因此a值的改变不会影响到b的值。要注意这种数据的共享与两个对象的引用同时指向一个对象的这种共享是不同的,因为这种情况a的修改并不会影响到b, 它是由编译器完成的,它有利于节省空间。而一个对象引用变量修改了这个对象的内部状态,会影响到另一个对象引用变量 

堆栈初级理解应用

  • 2012年08月04日 14:16
  • 2KB
  • 下载

计算机有关堆栈的理解

  • 2010年12月07日 14:08
  • 22KB
  • 下载

8051 深层次的堆栈理解

http://home.cnblogs.com/group/topic/56699.html 到网上找了几篇堆栈的很好的博客: http://bbs.21ic.com/icview-14724...

深入理解堆栈

  • 2012年04月09日 20:23
  • 269KB
  • 下载

深入理解linux核心堆栈

  • 2016年04月07日 20:15
  • 119KB
  • 下载

深入理解Java的栈与堆栈

我想这篇足以让大家很清晰理解Java的栈和堆栈的区别。下面的是我收集了好多网友的资料加以整理的。 Java 中的堆和栈  Java把内存划分成两种:一种是栈内存,一种是堆内存。  1.栈...

深入理解JavaScript执行上下文、函数堆栈、提升的概念

首先明确几个概念: - EC:函数执行环境(或执行上下文),Execution Context - ECS:执行环境栈,Execution Context Stack - VO:变量对象,Var...

深入理解堆栈、堆在内存中的实现

尽管在.NET framework下我们并不需要担心内存管理和垃圾回收(GarbageCollection),但是我们还是应该了解它们,以优化我们的应用程序。同时,还需要具备一些基础的内存管理工作机制...

深入理解 c#堆栈和托管堆

【转】堆栈和托管堆 c# 原文地址:http://blog.csdn.net/baoxuetianxia/archive/2008/11/04/3218913.aspx 首先堆...

深入理解Java的栈与堆栈

我想这篇足以让大家很清晰理解Java的栈和堆栈的区别。下面的是我收集了好多网友的资料加以整理的。 Java 中的堆和栈  Java把内存划分成两种:一种是栈内存,一种是堆内存。  1.栈(sta...
  • im_xiao
  • im_xiao
  • 2016年09月01日 20:58
  • 4380
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:堆栈理解
举报原因:
原因补充:

(最多只允许输入30个字)