堆的内存和栈的内存游什么不同???

解决方案 »

  1.   

    都是存储空间,JVM做了区分而已。每个JVM有1个堆,多个线程共享:存放类实例、数组。
    每个线程启动时JVM会分配1个栈给它:存放线程状态
      

  2.   

    Java的堆是一个运行时数据区,类的实例(对象)从中分配空间,它的管理是由垃圾回收来负责的:不给程序员显式释放对象的能力。Java不规定具体使用的垃圾回收算法,可以根据系统的需求使用各种各样的算法。 
      

  3.   

    栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区。里面的变量通常是局部变量、函数参数等。
        堆,就是那些由new分配的内存块,他们的释放在c++和c中是程序员的职责,如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。在java中是JVM的职责,由垃圾收集机制负责回收。
      据个例子:void f() { int* p=new int[5]; } 一句话就包含了堆与栈:汇编代码可以看到他们的不同:
        00401028   push        14h
        0040102A   call        operator new (00401060)
        0040102F   add         esp,4
        00401032   mov         dword ptr [ebp-8],eax
        00401035   mov         eax,dword ptr [ebp-8]
        00401038   mov         dword ptr [ebp-4],eax
      

  4.   

    栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方。与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆.栈的优势是,存取速度比堆要快,仅次于直接位于CPU中的寄存器。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。另外,栈数据可以共享,详见第3点。堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是,由于要在运行时动态分配内存,存取速度较慢。
      

  5.   

    想起一句话:方法入stack 对象动态在heap