堆栈是什么?到底是堆,还是栈?一个线程一个java方法栈。

解决方案 »

  1.   

    这两种方式是不相同的。声明变量/数组的方式,是在栈中分配内存。程序中的每一个函数都有自己的栈,用于为函数作用域内的变量/对象分配存储空间。当调用完此函数返回的时候,栈空间自动被收回,其中的内容也就全部无效了。而new是在堆中分配内存的,而且一经分配则永久保留,直到显式的释放掉。否则会造成内存泄露。实际上Java是通过实现一个“垃圾收集器”在运行期间实现这一点的。
    说白了,栈和堆都是进程空间内的一段虚存(将被映射到物理内存,所以也可说是内存中的一段空间),所不同的是,计算机对栈给予了更多支持。还记得栈指针寄存器吗,当程序调用内存时,栈指针将指向栈顶,存贮空间的分配就是通过移动栈指针来完成的。那么,哪些变量将在栈中分配空间呢?既然栈用起来这么方便,那么要 堆 来干什么呢?显然,如果我们在程序运行之前(编译时)就能知道要申请多少空间,栈就足够了,但在复杂的应用中,人们很难提前知道自己要申请多少空间.我们可以把 堆 看成存储空间的仓库,当我们需要存储空间时就从仓库中领取,不使用这段空间时就把它还回去(这是一个相当复杂的算法)。领取和归还的过程是程序执行时决定的(所谓的动态决定),编译时无法确定存储空间的位置。
    线程是程序执行的最小单位,每个线程都有自己独立的堆栈.
      

  2.   

    dev2dev.bea.com.cn技术文章里面有篇讲的很详细,去找找!
      

  3.   

    to  wood_217()
    不要误人子弟了!>程序中的每一个函数都有自己的栈,用于为函数作用域内的变量/对象分配存储空间<  
    每一个函数都有自己的栈??对象是在栈中分配吗??>而且一经分配则永久保留,直到显式的释放掉<   
    那垃圾收集器是干什么吃的??>还记得栈指针寄存器吗,...,编译时无法确定存储空间的位置。<
    不要把c,c++的那套用在java上,java中方法调用栈和对象内存一样,是在堆上动态分配的。想知道java内部是如何运作兄弟,还是去找本书看看吧。