当前位置: 代码迷 >> J2EE >> Java方法内,创建对象实例后,什么时候释放内存(引用这个对象不再安全)?该如何处理
  详细解决方案

Java方法内,创建对象实例后,什么时候释放内存(引用这个对象不再安全)?该如何处理

热度:17   发布时间:2016-04-22 01:43:45.0
Java方法内,创建对象实例后,什么时候释放内存(引用这个对象不再安全)?
我的理解:
原本在方法内声明并创建的对象,它的“有效范围”应该只限于这个方法,方法运行结束,方法内对象的“生命期”也应就结束了,占用的内存理论上就不再属于这些对象。但由于Java通过垃圾回收,自动管理内存中创建的对象,那么在方法内创建的对象,其“生命期”不一定就只限于这个方法,只要它被外部引用,则会在方法结束后继续“存活”(即:Java虚拟机继续保留这块内存给这个对象使用),只到那个引用它的外部因素“死亡”。

问题1:我上面的理解正确吗?

问题2:如果正确。会不会有以下问题:
Java code
public clase User{}public class Test{    public void fun{        User user = new User();        abc.user = user;           //abc为一个外部变量    }}

当用“Test tm = new Test();” 创建tm后,这个tm占用的内存什么时候被释放?
是不是整个tm占用的内存,都要等到那个abc失效后才会被释放?


------解决方案--------------------
user肯定已经死了,但是user所用的那块内存在abc.user=user的同时就分配给abc了,所以只有在abc死掉的时候原来user的那块内存才会释放。
------解决方案--------------------
1
理解正确

2
不是,要分清楚对象,tm是tm对象,没有变量引用它,它就会被回收
而tm的方法fun所创建的对象uere依然有变量引用它,所以它不会被回收

给你个例子好好理解一下吧

Java code
public class Test {    public static void main(String[] args) {        B b = null;        {            A a = new A();            b = a.getB();        } //离开这个花括号,a消亡,a的属性b也不复存在(注意b是变量),但是main的b还是存在          //main的b指向a的b所指向的对象,所以在A的构造方法中new出来的b对象依然没有消亡          //a对象有自己的内存空间,b对象有自己的内存空间          //a的b属性只是一个指针,它指向b对象,即a的b属性的变量本身的内存保存b对象的地址          //所以a消亡只是a的b指针变量不复存在,并不是b对象不存在,只要还有其他变量引用b的话        System.out.println(b);    }}class A {    B b;    public A() {        b = new B();    }    public B getB() {return B;}}class B {}
  相关解决方案