2013-03-07 79 views
0

我有6个独立的java Classes A,B,C,D,E and F垃圾收集资格对象

Class A创建Class B的对象,并调用Class B中的方法。

Class B方法创建class C的对象并调用class C中的方法。

Class C方法创建一个对象D,E,F类并调用它们的方法。

当finally控件最后回到class A时,如果我将Class B的对象引用设置为null,这是否会使创建的所有对象class B,C,D,E,F到目前为止符合垃圾回收的条件?

+0

我想你是指所提到的图中的所有对象。并非给定类中的所有对象。如果上述类型的对象在其他地方构建,则不会被GC'ed – 2013-03-15 12:56:50

回答

0

是的。它会。由于父类现在被引用为null并且是孤立的,因此它下面的所有引用对象都将符合GC的条件。

当没有更强的引用存在时,对象将进入不可访问状态。当一个对象不可达,它是集合的候选人

的http:// 192.9.162.55 /docs/books/performance/1st_edition/html/JPAppGC.fm.html

+0

请检查以下链接:http://stackoverflow.com/questions/2433261/when-and-how-are-classes-garbage-collected -in-java – 2013-03-07 06:21:52

0

是的,他们将有资格垃圾回收提供了一个条件,如果它们是在方法内创建的,即在本地,那么它们是合格的,并且如果它们是实例变量对象,则只有该对象被设置为null的副本才有资格获得gc。

+0

B类的对象引用是一个单独的本地对象,这将使得C,D,E,F类的所有对象都符合gc? – user1929905 2013-03-07 06:37:53

+0

不,你应该知道basic.For每个对象,所有的实例变量有不同的副本。所以如果你给B的一个对象分配null,那么只有在该对象内部的副本(它们是C,D,E,F对象)将被垃圾收集。 – 2013-03-07 06:45:18

+0

搜索这些基本的东西,你会得到很多东西来阅读。 – 2013-03-07 06:45:51

0

是的。 “当没有更多对该对象的引用时,对象有资格进行垃圾回收。”

所以如果b不再被引用,它有资格申请gc。反过来,它被收集,没有更多的参考c,所以c变得合格,故事继续。

0

一般是的,但没有更多的信息,我们不能肯定地说。
最好的例子是,如果说C放置了它在存储在http会话或EJB事务(或直接存储引用)的集合中创建的D实例的引用。如果发生这种情况,那些引用将会阻止D的相关实例被垃圾收集,并且它们保留的所有内容都会被引用。

+0

我的课程使用集合,但不使用httpsession或ejb相关的东西,他们现在有资格吗? – user1929905 2013-03-07 06:57:11

+0

@ user1929905取决于。只要集合中存在引用,并且该集合本身不适合垃圾收集,则引用指向的实例也不符合条件。因此,如果您在类中调用了A中的一个集合,该集合已传递给A上的一个方法,该集合添加了对集合B的引用,只要该集合保留在该集合中,B就会保留,除非集合本身已被删除。 – jwenting 2013-03-07 07:48:27