Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > когда объект готов к удалению gc?


Автор: gr-dmitro 15.3.2006, 21:22
Учу Java. Готовился к собеседованию по тестам TestKing Sun Certified Programmer
for Java 2 Platform 1.4 [310-035(v.8)] c http://itbooks.msk.ru/archives/ebooks/testking/
Не понимаю их ответов smile :
Цитата

QUESTION NO: 35
Given:
Код

10. public Object m() {
11. Object o = new Float(3.14F);
12. Object [] oa = new Object[1];
13. oa[0] = o;
14. o = null;
15. return oa[0];
16. }

When is the Float object, created in line 11, eligible for garbage collection?
A. Just after line 13.
B. Just after line 14.
C. Never in this method.
D. Just after line 15 (that is, as the method returns).
Answer: B


Я считаю, что D.
Но это не опечатка - есть ещё пару подобных вопросов/ответов.
Как правильно?

Автор: LSD 15.3.2006, 21:30
Правильный ответ C. Объект готов к удалению сборщиком мусора, когда на него не осталось ссылок (исключение: SoftReference, WeakReference и FantomReference, но это отдельный разговор). В строке 13 ссылка из переменной o дублируется в переменную oa[0], а затем возвращается из метода m(), и может продолжить сущетвовать дальше.
При большом желании это можно даже доказать.

Автор: gr-dmitro 15.3.2006, 21:40
Понял. Еще один момент, пожалуйста:
Цитата

QUESTION NO: 43
Given:
Код

1. class TestA {
2. TestB b;
3. TestA() {
4. b = new TestB(this);
5. }
6. }
7. class TestB {
8. TestA a;
9. TestB(TestA a) {
10. this.a = a;
11. }
12. }
13. class TestAll {
14. public static void main (String args[]) {
15. new TestAll().makeThings();
16. // ...code continues on
17. }
18. void makeThings() {
19. TestA test = new TestA();
20. }
21. }

Which two statements are true after line 15, before main completes? (Choose two)
A. Line 15 causes a stack overflow.
B. An exception is thrown at runtime.
C. The object referenced by a is eligible for garbage collection.
D. The object referenced by b is eligible for garbage collection.
E. The object referenced by a is not eligible for garbage collection.
F. The object referenced by b is not eligible for garbage collection.
Answer: C, F

тогда тут C,D?

Автор: batigoal 15.3.2006, 21:44
Я тоже считаю, что C. Какова же логика авторов теста?

Автор: chief39 15.3.2006, 21:56
Цитата(gr-dmitro @ 15.3.2006, 21:40 Найти цитируемый пост)
Which two statements are true after line 15, before main completes? (Choose two)
A. Line 15 causes a stack overflow.
B. An exception is thrown at runtime.
C. The object referenced by a is eligible for garbage collection.
D. The object referenced by b is eligible for garbage collection.
E. The object referenced by a is not eligible for garbage collection.
F. The object referenced by b is not eligible for garbage collection.
Answer: C, F

Не проверял... имхо, исключения не будет....
Из остальных человеческих вариантов остаются E+F

Автор: LSD 15.3.2006, 22:01
E, F

Что-то меня смущают эти тесты...

Автор: gr-dmitro 15.3.2006, 22:03
Цитата(chief39 @ 15.3.2006, 21:56)
Не проверял... имхо, исключения не будет....
Из остальных человеческих вариантов остаются E+F

Но ведь test более не хранит ссылку на экземпляр TestA.
Значит, по идее, экземпляры TestA and TestB не доступны с текущего потока, и явл. "dead"

Автор: LSD 15.3.2006, 22:13
Точно! Был не внимателен.
Действительно ссылок не останется, так что C, D.

Автор: gr-dmitro 15.3.2006, 22:19
Цитата(LSD @ 15.3.2006, 22:01)
Что-то меня смущают эти тесты...

Да это только с gc проблемы, а в остальном - ничего, заковытистые

All
спасибо

Автор: allex 15.3.2006, 22:25
gr-dmitro, странно, что С, но F. По идее, в строке 15 создается три объекта разных классов. Ссылок на TestAll не будет, TestA и TestB будут ссылаться друг на друга. Документация к пакету java.lang.ref говорит, что
  • An object is strongly reachable if it can be reached by some thread without traversing any reference objects. A newly-created object is strongly reachable by the thread that created it.
  • An object is softly reachable if it is not strongly reachable but can be reached by traversing a soft reference.
  • An object is weakly reachable if it is neither strongly nor softly reachable but can be reached by traversing a weak reference. When the weak references to a weakly-reachable object are cleared, the object becomes eligible for finalization.
  • An object is phantom reachable if it is neither strongly, softly, nor weakly reachable, it has been finalized, and some phantom reference refers to it.
  • Finally, an object is unreachable, and therefore eligible for reclamation, when it is not reachable in any of the above ways.
По идее, TestA и TestB не strongly reachable, у нас нет reference objects, значит они unreachable, and therefore eligible for reclamation.

Автор: Entry_N3 24.3.2007, 18:26
в догонку:

Код

10. public Object m() {
11. Object o = new Float(3.14F);
12. Object [] oa = new Object[1];
13. oa[0] = o;
14. o = null;
15. oa[0] = null;
16. return 0;
17. } 


The Float object is, created in line 11, eligible for garbage collection after line 15. 

Это так?

Автор: powerOn 25.3.2007, 00:01
Цитата(Entry_N3 @  24.3.2007,  18:26 Найти цитируемый пост)
The Float object is, created in line 11, eligible for garbage collection after line 15. 

Это так? 

Тебе с английского перевести?  smile 

В строке 11 создается объект и ссылка на него была присвоена переменной o
В программе на объект созданный в строке 11, имеется одна ссылка: o.
Цитата(Entry_N3 @  24.3.2007,  18:26 Найти цитируемый пост)
Object o = new Float(3.14F);

далее создается массив.
Цитата(Entry_N3 @  24.3.2007,  18:26 Найти цитируемый пост)
 Object [] oa = new Object[1];

потом нулевому элементу этого массива присваивается ссылка на объект созданный в строке 11.
Теперь в программе на объект созданный в строке 11, имеется две ссылки: o и oa[0].
Цитата(Entry_N3 @  24.3.2007,  18:26 Найти цитируемый пост)
oa[0] = o;

Далее обе ссылки зануляются:
Цитата(Entry_N3 @  24.3.2007,  18:26 Найти цитируемый пост)
o = null;
oa[0] = null;

Теперь ссылок на объект, созданный в строке 11, нет, а значит он готов к удалению сборщиком мусора.

Автор: Entry_N3 25.3.2007, 12:10
powerOn, классно описал  smile . Хотел убедиться.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)