Java内存管理:将各种方法中的静态/非静态对象保留到最后

时间:2014-09-02 18:47:15

标签: java memory memory-management memory-leaks jvm

这听起来很基本,但我肯定不知道。

我有一个main方法main(),从这个方法我调用两个方法: - >

OneClass {
public static void main(String[] args){
//



  AnotherClass aCObject = new AnotherClass();

   Type1 objectOfType1 = aCObject.method1();

   Type2 objectOfType2 = AnotherClass.method2();

}

}

以下方法(可能属于同一类或其他类)可能属于同一类: - >

Another Class - :>

public AnotherClass(){

public Type1 method1(){

// do something using maps, arraylists etc
//and return 
}


public static Type2 method2(){

// lots of variables. hashmaps, lists etc
//and return
}


}

现在,从上面的示例代码中,我的查询是,JVM是否保留了这些变量中的任何一个以导致内存泄漏。返回类型(Type1和Type2)可以是任何内容(String,Map,List等)。

查询 我从main方法调用method1和method2。他们执行某些操作并返回一些东西。所以问题是:JVM是否会破坏method1和method2中使用的变量/对象?方法1和方法2中可能存在内存泄漏问题,但我们是否已经从他们那里返回了我们想要的东西,现在他们是GC的候选者?或者jvm保留在静态方法的情况下分配的内存,但在非静态方法的情况下删除。

1 个答案:

答案 0 :(得分:2)

如果method1()method2()返回的对象不包含对这些方法的局部变量引用的对象的直接或间接引用,则只要方法返回,局部变量就会消失范围和引用的对象立即有资格进行垃圾回收。 (这提供了方法没有做任何事情导致对那些对象的引用被隐藏在其他地方,例如静态List。)何时或如果它们被收集取决于机器实现和内存需求运行时间。

静态和实例方法的规则没有区别:只要局部变量超出范围(例如,方法返回),引用的对象就有资格获得GC,除非在其他地方有另一个对象的实时引用。调用方法也无关紧要(从静态方法,实例方法,初始化程序......)。