gpt4 book ai didi

Java内存管理: Do static/non-static objects in various methods retained till end

转载 作者:行者123 更新时间:2023-12-02 05:30:10 25 4
gpt4 key购买 nike

这听起来可能很基础,但我肯定不知道。

我有一个主方法 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 等)。

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

最佳答案

如果 method1()method2() 返回的对象不包含对这些方法的局部变量引用的对象的直接或间接引用,则尽快当方法返回时,局部变量超出范围,引用的对象立即适合垃圾回收。 (前提是这些方法没有执行任何操作来导致对这些对象的引用存储在其他地方,例如静态List。)何时或是否收集它们取决于机器实现和运行时的内存需求。

静态方法和实例方法的规则没有什么不同:一旦局部变量超出范围(例如,方法返回),则引用的对象就有资格进行 GC,除非在其他地方存在对该对象的另一个实时引用。该方法的调用方式(从静态方法、实例方法、初始值设定项……)也并不重要。

关于Java内存管理: Do static/non-static objects in various methods retained till end,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25630228/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com