ca,Tahoma,Arial,sans-serif; white-space:pre; text-align:left">ce:pre">ca,Tahoma,Arial,sans-serif; white-space:pre; text-align:left">ce:pre">堆栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方。与C++不同c;class="tags" href="/tags/JAVA.html" title=java>java自动管理栈和堆c;程序员
ca,Tahoma,Arial,sans-serif; white-space:pre; text-align:left">ce:pre">ca,Tahoma,Arial,sans-serif; white-space:pre; text-align:left">不能直接的设置栈或者堆。从堆和栈的功能来通俗的比较c;堆主要用于存放对象c;栈主要是用来执行程序的。这
ca,Tahoma,Arial,sans-serif; white-space:pre; text-align:left">ce:pre">ca,Tahoma,Arial,sans-serif; white-space:pre; text-align:left">种不同是由于堆栈和堆的特性决定的c;以下是它们在概念上的区别:
ca,Tahoma,Arial,sans-serif; white-space:pre; text-align:left">ce:pre">ca,Tahoma,Arial,sans-serif; white-space:pre; text-align:left">
ce:pre">ce:pre">堆栈:位于通用RAM(随机访问class="tags" href="/tags/CunChu.html" title=存储>存储器)中c;但通过堆栈指针可以从处理器那里获得直接支持。堆栈指针若向下移动c;则分配新的内存;若向上移动c;则释放那些缓存。这是一种快速有效的分配class="tags" href="/tags/CunChu.html" title=存储>存储方式c;仅次于寄存器。创建程序时c;class="tags" href="/tags/JAVA.html" title=java>java系统必须知道class="tags" href="/tags/CunChu.html" title=存储>存储在堆栈内的所有项的确切生命周期c;以便上下移动堆栈指针。ca,Tahoma,Arial,sans-serif; font-size:18px; line-height:25px; white-space:pre"> 这一约束限制了程序的灵活性c;所以虽然某些class="tags" href="/tags/JAVA.html" title=java>java数据class="tags" href="/tags/CunChu.html" title=存储>存储于堆栈中---特别是对象引用c;但是class="tags" href="/tags/JAVA.html" title=java>java对象并不class="tags" href="/tags/CunChu.html" title=存储>存储于其中。
ce:pre">ce:pre">堆:一种通用的内存池(也位于RAM区)c;用于存放所有的class="tags" href="/tags/JAVA.html" title=java>java对象。堆不同于堆栈的好处是:class="tags" href="/tags/BianYiQi.html" title=编译器>编译器不需要知道class="tags" href="/tags/CunChu.html" title=存储>存储的数据在堆里存活多长时间。因此c;在堆里分配class="tags" href="/tags/CunChu.html" title=存储>存储有很大的灵活性。当需要一个对象时c;只需要用new写一行简单的代码c;当执行这行代码时c;会自动在堆里进行class="tags" href="/tags/CunChu.html" title=存储>存储分配。当然c;为这种灵活性必须要付出相应代价:用堆进行class="tags" href="/tags/CunChu.html" title=存储>存储分配和清理可能比用堆栈进行class="tags" href="/tags/CunChu.html" title=存储>存储分配需要更多的时间(如果确实可以在class="tags" href="/tags/JAVA.html" title=java>java中像在C++中一样在栈中创建对象)。
ce:pre">ce:pre">此外c;ca,Tahoma,Arial,sans-serif; line-height:25px; text-align:left">栈(stack):是一个先进后出的class="tags" href="/tags/ShuJuJieGou.html" title=数据结构>数据结构,通常用于保存方法(函数)中的参数,局部变量。ca,Tahoma,Arial,sans-serif; line-height:25px; text-align:left">在class="tags" href="/tags/JAVA.html" title=java>java中,所有基本类型和引用类型都在栈中class="tags" href="/tags/CunChu.html" title=存储>存储。栈中数据的生存空间一般在当前scopes内(就是由{...}括起来的区域)。
ca,Tahoma,Arial,sans-serif; text-align:left" /> ca,Tahoma,Arial,sans-serif; line-height:25px; text-align:left">ce:pre">ce:pre">堆(heap):是一个可动态申请的内存空间(其记录空闲内存空间的链表由操作系统维护),C中的malloc语句所产生的内存空间就在堆中。ca,Tahoma,Arial,sans-serif; line-height:25px; text-align:left">在class="tags" href="/tags/JAVA.html" title=java>java中,所有使用new xxx()构造出来的对象都在堆中class="tags" href="/tags/CunChu.html" title=存储>存储,当垃圾回收器检测到某对象未被引用,则自动销毁该对象。所以,理论上说class="tags" href="/tags/JAVA.html" title=java>java中对象的生存空间是没有限制的,只要有引用类型指向它,则它就可以在任意地方被使用。