Java heap and stack

heap:堆

stack:栈

    以前在学习的时候经常听见的两个名字,只知道是内存中的空间,但一直没有去深究堆和栈的区别。趁着周末好好来理顺一下,下面的内容绝大部分参考网上其他人的资料,中间夹杂了自己的一些认识见解,可能有偏差的地方,以后再慢慢学习。

    heap(堆):

        heap是运行时数据区,顾名思义就是在程序运行期间动态分配内存空间,有垃圾回收来负责空间的释放。也正是由于动态内存的分配,导致存取速度比较慢。

    stack(栈):

        stack的存取速度比heap要快,仅次于寄存器。栈中数据可共享。栈中主要存放基本数据类型和对象句柄。缺点是栈中数据大小和生命周期是确定的,不灵活。

        栈的最大特点就是数据共享。也就是通常所说的“有则指向,无则创建”。需要注意的是栈的数据共享与对象引用指向同一个对象的数据共享是不同的概念,前一种栈的共享之间是不会有影响的,也就是修改一个变量的值不会影响其他变量的值。而对象的引起是会影响其他对象的。

      eg. 

            String s1 = "abc";

            String s2  = new String("abc");

        String的这两种创建方式是有差别的,第一种是在栈中创建一个对象引用变量s1,然后查找栈中有没有“abc”,如果没有将“abc”存入栈。如果已经有了,就直接指向。第二种是在堆中,每次都会创建一个新的对象。

 

         heap是FIFO(先进先出),stack是FILO(先进后出)

 

          Java把内存划分为两种:栈内存、堆内存

          在方法中定义的基本类型变量和对象的引用变量都在方法的栈内存中分配。当超过变量的作用域后,Java会自动释放掉为该变量所分配的内存空间。

          堆内存用来存放new 出来的对象和数组,由JVM的垃圾回收器来管理

posted on 2013-08-04 17:32  <安之若素>  阅读(1717)  评论(1编辑  收藏  举报

导航