1.关于堆(heap)和栈(stack)的区别是什么,局部变量是存放在堆里还是栈里?而全局变量又是存放在那里?
我本来的理解是,放在堆里的东西,虚拟机是自动回收的,这么说来是,局部变量是方在堆里的,而全局变量是放在栈里的,所以要手动回收(通常是让其指向为null,)不知道是不是这样?2.static修饰的变量是放在那里?堆里还是栈里?3.new出来的对象是放在那里的?请高手帮忙一下,最好能用代码说明一下,真心谢过了。

解决方案 »

  1.   

    (1)Registers(寄存器):在CPU内部,是最快的存储场所,但程序员无法直接控制。
        (2)Stack(栈):位于一般的RAM(随机访问内存),速度仅次于Registers。存放基本类型的数据和对象的reference,但对象本身不存放在stack中,而是存放在Heap中。
        (3)Heap(堆):也位于RAM,存放用new产生的数据。他比stack好在编译器不需要知道实际在heap中存储数据的大小,也不知道这个空间需要分配多长时间,弹性好,但分配空间的速度比Stack慢很多。
        (4)Static storage(静态存储空间):位于RAM,存放在对象中用static定义的静态成员,它是“程序执行期间”一直存在的数据,Java对象本身是不会被分配在这里的。
        (5)Constant storage(常量存储空间):存放常量。
        (6)NON-RAM存储空间:硬盘等永久存储空间,实现对象的持久化存储。java编程思想里面都有的
      

  2.   

    1,堆是放实例和数组的,JAVA里面没有全局变量这个概念,所有变量都是以类的属性或者参数等形式存在的。GC是自动回收的。
    stack是程序运行(或者叫线程更合适)的时候JVM分配给他的,里面有该程序当前的状态。呵呵。
    2,static修饰的变量的特点是new一个对象的时候就分配了内存。而其他是要初始化的时候才分配。也是作为一个变量而已。
    3,见1。放在堆里的。
      

  3.   

    1)Registers(寄存器):在CPU内部,是最快的存储场所,但程序员无法直接控制。
        (2)Stack(栈):位于一般的RAM(随机访问内存),速度仅次于Registers。存放基本类型的数据和对象的reference,但对象本身不存放在stack中,而是存放在Heap中。
        (3)Heap(堆):也位于RAM,存放用new产生的数据。他比stack好在编译器不需要知道实际在heap中存储数据的大小,也不知道这个空间需要分配多长时间,弹性好,但分配空间的速度比Stack慢很多。
        (4)Static storage(静态存储空间):位于RAM,存放在对象中用static定义的静态成员,它是“程序执行期间”一直存在的数据,Java对象本身是不会被分配在这里的。
        (5)Constant storage(常量存储空间):存放常量。
        (6)NON-RAM存储空间:硬盘等永久存储空间,实现对象的持久化存储。
      

  4.   

    堆里存放的是对象,而栈里存放是对象的引用,和基本的数据类型,
    栈里存放的数据必须是知道它的大小和作用范围,编译器生成相应的代码以便向上和向下移动指针(创建和释放),函数的局部变量也应该存放在里,因为虚拟机会自动回收,
    堆:程序运行时候动态分配的,需要程序员手动去释放它(让指向他的引用为null),速度慢,存放的大小和时间不受限制,用new生成的java对象就放在堆里。还有,栈里的数据的生存空间一般在当前的scope内有效。
      

  5.   

    学习ING
    关于局部变量存放在栈里,我有一处不大理解:
    比如:
    method(){
        String str = “”;
        int i = 0;
    }
    str是存放在堆里还是栈里?因为它不是一个基本类型,而是个对象。
    按照实例应该放在堆里,岂不是和局部变量放在栈里矛盾?
      

  6.   

    好贴、这不是基础问题、而是真东西啊、CSDN就缺少这种贴:堆又叫托管堆、意思就是由操作系统交给JVM托管、NEW出来的对象其引用放在栈中、相当于指针指向堆中该对象的实体、一旦这个引用被直接或间接“杀死”那么堆中该对象的实体就变成所谓的“不可到达实体”(UNREACHABLE INSTANCE)、此时这个对象就处于GC的回收范围中、下次GC启动自会回收之、
    直接“杀死”就是直接把一个引用赋NULL值、间接是指所有引用这个对象的对象都已不复存在、这个和GC的工作机制又有关系、GC是把堆中所有对象作为树型结构看待、GC启动后要全树搜索、找到符合上述条件的对象就将其回收、同时GC还要重新整理回收过的堆、这个和操作系统的存储管理类似。栈之所以快就是因为它是物理连续的、所有操作都是指针跳转、传统数组就是因为这一点所以是最快的、除此之外内存中还有全局区、代码区等等、而且不同语言的具体做法都是不一样的、Registers(寄存器)主要目的是为了大大提高CPU的指令搜索效率、Registers(寄存器)大则CPU的指令搜索命中率大大提高、Registers(寄存器)又分一级全速缓存、二级缓存、有些二级缓存是放在主板上的、Registers(寄存器)不应算在内存管理范畴内、.NET中的结构体就是一种存储在栈中的对象结构、而JAVA的对象数组...太多了、抛砖、希望高手赐教、
      

  7.   

    同意 programeyonger堆里存放的是对象,而栈里存放是对象的引用,和基本的数据类型,
    栈里存放的数据必须是知道它的大小和作用范围,编译器生成相应的代码以便向上和向下移动指针(创建和释放),函数的局部变量也应该存放在里,因为虚拟机会自动回收,
    堆:程序运行时候动态分配的,需要程序员手动去释放它(让指向他的引用为null),速度慢,存放的大小和时间不受限制,用new生成的java对象就放在堆里。