最近我遇到了一个问题:当我创建一个新实例时,对象存储了多长时间?基本上我是在询问它是如何存储的。
示例:
public void initUser(Player player) {
User u = new User(ally, player.getUuid());
u.setHealth(20);
}
(用户是对象)
那么u
存储了多长时间?在我完成之后,Java会清理它吗? (在调用#setHealth之后)?
感谢。
答案 0 :(得分:0)
Java Runtime 的一个特殊部分称为垃圾收集器负责在不再使用时销毁所有对象。
应用程序可以在对象创建时通过显式和隐式方式为对象分配内存,但它们无法显式释放该内存。
要向JVM发出一个对象已准备好进行垃圾回收的信号,对象需要以下列方式之一取消:
显式未引用
person = null
; // person是Person的实例
对象超出范围
一旦方法返回到调用方法,在方法内创建的对象就会超出范围。
因此,在method()
结束后的情况下,p隐式变为空。
public void method(){
人p =新人(); }
取消激活后,VM可以回收该内存。虚拟机可以决定何时垃圾收集不可用的对象。但规范并不保证任何可预测的行为。 VM可以决定何时从不受欢迎的对象中回收内存,也可能根本不回收内存。
如果类声明了终结器(即public void finalize()
方法),那么垃圾收集器将在释放该实例占用的内存空间之前对该类的实例执行finalize()
方法。
很明显,垃圾收集的确切时间是不可预测的。
来源:http://geekrai.blogspot.com.br/2013/05/life-cycle-of-object-in-java.html
答案 1 :(得分:0)
您为User创建的对象是本地对象。所以它会在方法中存活,一旦程序退出该方法,该对象就有资格获得GC。
class Test{
User u1 = new User();
public void initUser(Player player) {
User u = new User(ally, player.getUuid());
u.setHealth(20);
}
}
在上面的代码中,对象u1在整个类的生命周期中都是活着的。如果你需要对象是GC,那么make u1 = null
答案 2 :(得分:-2)
一旦完成Object
,Java就会自行执行gc。