我编写Java程序,我想用Java中的一些内存管理清楚。 例如,像这样的方法:
public void example1() {
byte[] bytes = new byte[100];
}
调用此方法后,堆空间中“new”创建的byte []空间是否会消失? 第二个例子是这样的:
public byte[] example2() {
byte[] bytes = new byte[100];
return bytes
}
还有一个问题,在这种情况下,byte []空间是否会消失?
答案 0 :(得分:4)
当垃圾收集器运行时,空间被垃圾收集并且它检测到没有更多对它的引用。在这种情况下,如果这是唯一有关的代码,则当方法退出时,引用将不复存在,因此从那时起,空间符合条件进行收集。
答案 1 :(得分:1)
第一个例子:
public void example1() {
byte[] bytes = new byte[100];
}
当方法退出时,对方法中创建的对象的所有引用都消失了,因此它有资格被垃圾收集器“破坏”。
在你的第二个例子中:
public byte[] example2() {
byte[] bytes = new byte[100];
return bytes
}
在这里,您将返回该值。如果您在某处使用该返回值,例如byte[] myByte = example2();
,则会保留一个活动引用,因此该对象将无法进行收集。
答案 2 :(得分:0)
你作为Java程序员不能强制Java中的垃圾收集;它只会在JVM认为需要基于Java堆大小的垃圾收集时触发。垃圾收集器运行,它检测到没有更多的引用。
答案 3 :(得分:0)
public void example1() {
byte[] bytes = new byte[100];
}
bytes
方法完成后,example1()
变量引用的对象将有资格进行垃圾回收,因为它是本地变量形式的唯一活动引用{{1将从函数调用堆栈中清除。
bytes
此处public byte[] example2() {
byte[] bytes = new byte[100];
return bytes
}
引用的对象在bytes
方法结束后不能立即进行垃圾回收,因为您将返回引用。所以,如果你有这样的事情example2()
。然后,即使在从函数调用堆栈中清除了本地方法变量byte[] returnedRef = example2()
之后,引用仍由变量returnRef
保持。因此,除非bytes
所持有的引用通过使1)returnedRef
或2)(如果returnedRef=null
是局部变量)分离,然后在方法的末尾{{1定义后,它将被清除,该对象将不符合垃圾回收的条件。
即使某个对象符合垃圾收集条件,也不一定意味着它会被GC销毁。当垃圾收集器运行时最好留给JVM来决定。
答案 4 :(得分:0)
一般来说,当对象的空间“死亡”时,不可能肯定地说;即当用于表示它的存储器将被回收时。你可以肯定地说:
当任何东西仍然可能使用该对象时,该空间将不会被回收;即,它仍然可以。
如果对象无法访问,它将在JVM到达必须告诉应用程序内存不足的点之前回收。
< / LI>好消息是,当回收发生时,您无需担心。如果它可能发生,它将在它引起麻烦之前发生。
坏消息(某种程度上)是因为您无法预测何时会回收对象,所以编写取决于时间的代码是一个坏主意;例如依靠finalize
方法及时运行。
在您的第一个示例中,byte[]
符合条件的在方法返回时进行垃圾回收。在第二个例子中,我们根本不能说什么。这取决于调用者对返回值的处理方式。