gc只能清除在堆上分配的内存(纯java语言的所有对象都在堆上使用new分配内存),而不能清除栈上分配的内存(当使用JNI技术时,可能会在栈上分配内存,例如java调用c程序,而该c程序使用malloc分配内存时).因此,如果某些对象被分配了栈上的内存区域,那gc就管不着了,对这样的对象进行内存回收就要靠finalize().这段话好像给出了“堆”和“栈”的区别,new出来的是“堆”内存,而C中malloc分配的内存就是“栈”? 同样是内存分配,为何会产生两个结果?“堆”和“栈"可以看出同为内存中的一段区域,二者到底有何不同?

解决方案 »

  1.   

    栈的分配空间是连续的 所以访问速度快,堆的访问速度慢,java里面的引用就是放到栈上面,对象放到堆上
      

  2.   

    堆是heap,栈是stack,堆栈应该是栈,即stack
      

  3.   

    "当使用JNI技术时,可能会在栈上分配内存,例如java调用c程序,而该c程序使用malloc分配内存时"为何c malloc分配的内存是在栈上?
      

  4.   

    ◆栈:存储在栈中的数据的大小和生命周期必须是已知的。对象的reference存放在栈中,但对象本身并不放在栈里。◆堆:所有的java对象都保存在这里。与栈有不同是:在分配空间时,编译器不需要知道该分配多少空间或是这些数据会在堆里呆多久。
      

  5.   

    知道CPU有一级缓存和二级缓存不? 
    前者小但是被访问频繁而且速度快后者比较大但是访问速度慢,他们影响着CPU的计算性能(赛扬和奔腾唯一不同的就是二级缓存,价格差距巨大:) )。
    栈使用的是一级缓存,JAVA中的方法调用和基本变量都是运行时存在这个区域中, 他们通常都是被调用时处于存储空间中,调用完毕立即释放, 而堆则是存放在二级缓存中,生命周期由虚拟机的垃圾回收算法来决定(并不是一旦成为孤儿对象就能被回收)。所以调用这些对象的速度要相对来得低一些。所以JAVA通过使用一些优化方式来优化调用,比如final等。“堆栈”是数据结构的一种,用于表示后进先出(LIFO)型数据。
      

  6.   

    homeesos, super_zzww 两位,说的好
      

  7.   

    尤其是super_zzw,居然和硬件的关系都搞定,nb
      

  8.   

    “当使用JNI技术时,可能会在栈上分配内存,例如java调用c程序,而该c程序使用malloc分配内存时”
    哪本书上讲的此时分配的内存会分配在栈上?
    C程序malloc其实分配的内存也在堆上,而C语言的堆是由程序员自己来管理,free()。
    估计此处为区分java中由GC管理的堆和C语言中由程序员管理的堆,所以
    java的GC其实是由一线程计算各对象的引用,如果没有有效的引用时,则收集此对象的内存。
      

  9.   

    super_zzw(之支吾) 说得在理.是否栈有个栈指针,而堆没有.
      

  10.   

    如果说“堆栈”的话,指的是栈(Stack),而不是堆(heap)
      

  11.   


    栈是用指针的吧,堆的大小好像是运行期动态变化的。gc好像主要是针对heap的吧
    不知道我说的对不对,高手指点一下
      

  12.   

    super_zzw(之支吾)全说清楚了,我就定下算了。
      

  13.   

    我觉得  CSDN 应该有  “面向对象经典百问” 专栏。
    FAQ 似乎还是有些难以被命中。