rt 。 全局静态成员变量和全局普通变量变量占用的内存单元都是在程序结束后才释放的吗?

解决方案 »

  1.   

    java中不存在全局静态成员变量和全局普通变量类的静态变量在内存中只有一个。静态变量位于方法区,被类的所有实例共享。静态变量的生命周期取决于类的生命周期(即类何时被加载和卸载)。   2. 类的每个实例都有相应的实例变量。实例变量位于堆区中。实例变量的生命周期取决于实例的生命周期(即实例何时被创建及销毁)。   3. 假如成员变量(包括静态变量和实例变量)是引用变量,那么当该成员变量结束生命周期时,并不意味着它所引用的对象也一定结束生命周期。变量的生命周期和对象的生命周期是两个不同的概念。   4. 局部变量位于栈区,其生命周期取决于所属的方法何时被调用及结束调用。        总结一下:     局部变量位于栈区,静态变量位于方法区,实例变量位于堆区,方法的字节码位于方法区,对象本身位于堆区,对象的引用位于栈区
      

  2.   

    全局静态变量在程序结束后释放,局部变量超过作用域后消失,普通变量在实例销毁时消失,无主对象不定时被jvm回收
      

  3.   


    你的对Java的理解不透彻,甚至错误!
    首先你就应该明确的告诉楼主,在Java语言中,变量的作用域有两种:成员变量和局部变量,变量的作用域决定了变量的可见性。
    其次你对Java内存存储原理和内存回收原理的理解也不正确,Java程序运行时,有6个地方可以存储数据:① 寄存器 ② 堆(stack)③栈(heap)④ 静态存储 ⑤常量存储 ⑥ROM存储。一般来说,字面值数据是存放于栈内存中(heap),且栈内存中(heap)所存放的数据可以被共享(默认指向)。对象实例存储与堆内存中(stack),每一个存储对象实例的内存空间都是独立的,且堆内存中数据不能被更像(非默认指向)。还有关于堆内存和栈内存的其他不同点,我在这里就不说了。
    最后再说说内存回收,栈内存的内存回收是编译器在编译前就已经明确了该字面值数据的具体内存大小和生命周期,也就是说程序结束则回收。堆内存中所存放的对象实例,则是动态回收机制,也就是说当Java内存回收器检测到程序检测到堆某个对象已经没有任何引用的时候,则释放该对象的内存空间,只是时间上不能够明确而已。