堆中存什么?栈中存什么?
堆中存的是对象。
栈中存的是基本数据类型和堆中对象的引用。
java中堆栈的区别?
在Java中,栈stack内存是用来存储函数的主体和变量名的。Java中的代码是在函数体中执行的,每个函数主体都会被放在栈内存中,比如main函数。加入main函数里调用了其他的函数,比如add(),那么在栈里面的的存储就是最底层是main,mian上面是add。栈的运行时后入先出的,所以会执行时会先销毁add,再销毁main。
在Java中,堆内存是用来存储实例的。比如main函数里面声明了一个people的类per,people per;这个per是存储在栈stack内存中的,实例化后(per = new people());实例后的对象实体是存在堆heap内存中的。栈stack内存中存储的per存储着指向堆heap内存的地址指向。堆heap内存的存在是为了更好的管理内存,实现garbage collection。当per不再指向堆heap内存中的实例的时候,garbage collection机制就会把这个堆heap内存中的new people()实例删除,释放内存
为什么要设计堆栈?
设计原因有两点:⑴栈的存取速度特别快,仅次于寄存器。当程序要在内存中读写数据时,先找到栈,再通过栈的指向到堆内存中进行数据的读写。由于不用再遍历速度慢而且数据多的堆内存,所以程序的运行速度会更快。
⑵便于内存的回收。当程序的一些数据不用后,就会丢掉栈内存中相应的数据,此时以前指向的堆内存空间就没有了栈的指向,变成了垃圾。这时Java虚拟机的垃圾回收机制就会将这块没有栈指向的堆内存空间回收,供给以后的程序使用。
为什么要分为堆和栈?
第一,从软件设计的角度看,栈代表了处理逻辑,而堆代表了数据。这样分开,使得处理逻辑更为清晰。分而治之的思想。这种隔离、模块化的思想在软件设计的方方面面都有体现。
第二,堆与栈的分离,使得堆中的内容可以被多个栈共享(也可以理解为多个线程访问同一个对象)。这种共享的收益是很多的。一方面这种共享提供了一种有效的数据交互方式(如:共享内存),另一方面,堆中的共享常量和缓存可以被所有栈访问,节省了空间。
第三,栈因为运行时的需要,比如保存系统运行的上下文,需要进行地址段的划分。由于栈只能向上增长,因此就会限制住栈存储内容的能力。而堆不同,堆中的对象是可以根据需要动态增长的,因此栈和堆的拆分,使得动态增长成为可能,相应栈中只需记录堆中的一个地址即可。
第四,面向对象就是堆和栈的完美结合。
更多理解可以参考这篇文章:
http://blog.jobbole.com/75321/