2013-07-11 2 views
1

Q : 02 감안할 때 :자바 가비지 컬렉션

11. public void genNumbers() { 
12. ArrayList numbers = new ArrayList(); 
13. for (int i=0; i<10; i++) { 
14.  int value = i * ((int) Math.random()); 
15.  Integer intObj = new Integer(value); 
16.  numbers.add(intObj); 
17. } 
18. System.out.println(numbers); 
19. } 

intObj 가 참조하는 객체가 가비지 컬렉션의 후보가되는 최초의 지점을 표시 코드의 어느 라인?

A. Line 16 
B. Line 17 
C. Line 18 
D. Line 19 
E. The object is NOT a candidate for garbage collection. 

답변 : D

대답은 D는하지 B. 나를 이해하는 데 도움이됩니다 왜 혼란. 미리 감사드립니다.

+0

왜 'B'라고 생각하십니까? – Maroun

답변

8

변수 수명이 블록 끝에서 끝났기 때문에 가비지 수집기에서 개체를 제거 할 수 있습니다. 그러나 해당 개체가 목록 numbers에 추가 되었기 때문에 여전히 참조됩니다. 따라서 수명이 끝난 후 numbers이 끝나고 가비지 수집기에서 목록을 제거 할 수도 있습니다. 가변 intObj 라인 17

1

이 범위를 벗어나 있지만, 이것은 단지 이전보다 정수 객체 하나 이하 기준이 있다는 것을 의미한다. numbers 배열은 여전히 ​​intObj과 동일한 개체를 참조하므로 numbers이 범위를 벗어나기 전에는 수집 할 수 없습니다.

0

오브젝트 intObj는 라인 (15)에서 생성되고, 그것을 기준이 라인 17에서 범위를 벗어나 intObj 동안 라인 (16)에 numbers에 첨가, 여전히 범위 밖으로 이동하지 않는, numbers 의해 참조

1

임의의 참조로 도달 할 수없는 경우에만 개체 ID 가비지가 수집됩니다. 그러나이 예제에서는 새로운 Integer (value); rechable tointObj에서 벗어나지 만 arraylist가 액세스하므로 새로운 Integer (value)에 여전히 액세스합니다. arraylist가 범위를 벗어날 때만 가비지 수집됩니다.