关于堆、栈和堆栈

来源:互联网 发布:简单的php源码 编辑:程序博客网 时间:2024/04/29 03:38
关于堆、栈和堆栈

初学者在看书的时候会经常看到堆、栈、堆栈这几个词,也许大概知道他们是用来表示变量或对象在内存中存储的一块区域。下面说说他们的含义和区别:

Java把内存划分成两种:一种是栈内存,一种是堆内存。

在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配。

当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java会自动释放掉为该变量所分配的内存空间,该内存空间可以立即被另作他用。

堆内存用来存放由new创建的对象和数组。在堆中分配的内存,由Java虚拟机的自动垃圾回收器来管理。

在堆中产生了一个数组或对象后,还可以在栈中定义一个特殊的变量,让栈中这个变量的取值等于数组或对象在堆内存中的首地址,栈中的这个变量就成了数组或对象的引用变量。引用变量就相当于是为数组或对象起的一个名称,以后就可以在程序中使用栈中的引用变量来访问堆中的数组或对象。


栈(stack)
     JVM是基于栈(stack)的,程序中大量的局部变量都存储在栈中,以便快速地访问。学过数据结构的都知道, 栈是先进后出(FILO:First In,Last Out),我们只能访问最上面的数据。它在内存中是从高地址到低地址扩展的。

堆(heap)
    程序中的new出来的对象都是放在heap中的,但对象的引用是放在stack中的。它和栈的区别在于堆是先进先出,只能访问最下面的数据。它在内存中是从低地址到高地址扩展的。

而我们说“堆栈”的时候,一般就是指栈的意思。

 

tb:http://blog.donews.com/chouchy/archive/2007/10/05/1216034.aspx