2011-03-16 3 views
10

다음 번에 정리할 개체를 Java에서 가비지 수집하도록 표시 할 수 있습니까?GC에서 제거 할 개체 표시

개체를 null로 설정하면 더 이상 작동하지 않는다고 들었습니다.

+2

:

http://exampledepot.8waytrips.com/egs/java.lang.ref/PhantomRef.html

여기에서 나온 주요 사이트입니까? 물론 'null'로 설정해도 gc로 처리된다는 보장은 없습니다. –

+1

개체에 대한 모든 참조를 제거하면 (예 : 'null'에 대한 참조를 설정하여) 가비지 수집을 위해 * 자격 *이됩니다. 메모리가 회수되기 전에 메모리가 부족하게되지는 않습니다 (힙 공간이 부족하고 힙이 부족하지 않다는 가정하에). GC가 실제로 발생하면 VM에 달려 있습니다. 왜 그것이 당신에 관한 것입니까? –

+2

상당한 양의 데이터를 다루고 있기 때문에 상당한 양의 데이터가 포함되어 있기 때문에 걱정이됩니다. 할당은 일반적으로 한 번에 1000 번에 온다. – monksy

답변

4

이 질문에 대한 답변이되었지만 Java Garbage collector가 참조를 보는 방식을 조작 할 수있는 방법이 있습니다.Soft References, Weak References 및 Phantom References를 통해이를 수행 할 수 있습니다. 더 자세한 설명은 java.lang.ref 패키지를보십시오.

http://download.oracle.com/javase/1.5.0/docs/api/java/lang/ref/package-summary.html

또한 여기에 PhantomReference 쓰레기 수집 일하려고 할 때 결정하는 좋은 샘플입니다. 당신이 작동하지 않을 것입니다 null``에 객체를 설정하는 이유에 대한 몇 가지 링크 또는 문서를 제공 할 수

http://exampledepot.8waytrips.com/

+0

내가 찾고있는 정보의 종류 그게 다. – monksy

+0

이것 역시 재미 있었다 : http : //weblogs.java.net/blog/2006/05/04/understanding-weak-references – monksy

2

Java Garbage Collector는 표시 및 스윕 방식과 함께 작동합니다. 이는 여전히 사용중인 것으로 알려진 객체로부터 모든 참조가 이어지고 그 방법으로 방문 된 객체가 표시된다는 것을 의미합니다. 그런 식으로 참조가없는 객체는 표시되지 않으므로 반드시 삭제해야합니다. 따라서이 객체에 대한 모든 참조가 제거되었는지 확인하여 다음 번 가비지 수집기에서 항목이 삭제되도록 할 수 있습니다.

또한 당신은 가비지 콜렉터를 실행해야 함을 표시하기 위해

Runtime.getRuntime().gc(); 

를 사용할 수 있습니다. 참고 : 실제로 실행되는지 확신 할 수 없습니다.

+0

가비지 컬렉터는 참조 카운팅을 기반으로하지 않습니다. 모든 최신 JVM은 마크 앤 스위프 (mark-and-sweep)이며, 대부분이 다중 세대입니다. –

+0

JVM의 구현에 의존하지 않습니까? – RoflcoptrException

+0

아니요. 참조 계산에서 참조주기 문제로 인해 Java 언어 사양을 올바르게 구현할 수 없습니다. 따라서 기존의 JVM 구현에서는 참조 카운팅을 사용할뿐만 아니라 완전히 다른 올바른 수집 메커니즘을 구현하지 않으면 참조 계산을 수행 할 수없고 준수 할 수도 없습니다. –

7

아니요, 불가능합니다. 다른 변수에 대한 참조가 있으면 어떻게 될 것으로 예상됩니까? 당신은 단지 null로하는 변수 설정할 수 있습니다 - 당신이 널 (null)에 객체를 설정할 수 없습니다

참고. 다른 변수에 여전히 오브젝트에 대한 참조가 있으면, 여전히 가비지 콜렉션의 대상이되지 않습니다.

이렇게해야한다고 생각하면 데이터를 잘못 해석했거나 코드 어딘가에 누수가있을 수 있습니다 (예 : 항목을 추가 한 목록, 정적으로 참조 된 목록 변수 - 클래스 로더가 살아있는 동안에는 해당 항목이 가비지 수집 대상이되지 않습니다.

각 JVM에는 고유 한 GC가 있지만 핫스팟에서는 개체가 현재 "살아"있는 세대에 GC가 실행될 때 개체가 가비지 수집됩니다 (상황을 복잡하게하는 종결자가 없다고 가정). 객체가 "젊은"세대에 있다면, 곧 그렇게 될 것입니다. "오래된"세대에 있다면 오래 걸릴 수도 있습니다.

당신은 물론 일이 이후에 이동하고 있지만, 자세한 내용은 Java 6 GC tuning documentation를 볼 수 있습니다

는 등 오픈 JDK 7

+0

글쎄, 나는 많은 것을 만들고 있는데, 나는 처리를 마친 후에 더 이상 필요가 없다고 말했 다. [프로파일 러가 지원하는] 의심 스럽지만 그들은 멸망하지 않고 있습니다. – monksy

+0

@monksy : 다음은 GC가 실행 중이라고 가정 할 때 어딘가에 숨어있는 참조가 있음을 나타냅니다. –

+1

그게 내 의심이야. 현재 시작된 물건의 양은 거의 늘지 않는다. 당신이 이것을 도울 수있는 도구가 있습니까? Netbeans Profiler를 사용하여이를 찾아야했습니다. – monksy

1

을 위해 당신은 잘못 들었지만, 다시 설명이 너무 잘못된 것입니다.

개체를 null로 설정하지 않으면 변수를 null로 설정합니다. 변수가 객체에 도달하는 데 사용될 수 있으면 변수는 객체에 대한 "참조"를 갖습니다. 변수를 null로 설정하는 것은 "참조를 잃는"변수와 동일합니다.

Java가 실행중인 프로그램에서 객체 또는 객체 그룹에 접근 할 수 없다는 것을 감지하면 메모리에서 객체를 제거합니다. 프로그램에서 다른 부분이 객체에 대한 참조를 사용하려고 시도했기 때문에 Java에서 허용되지 않는 방식으로 참조가 실패하기 때문에 메모리에서 한 번 빨리 제거하지는 않습니다.

트릭은 null에 대한 참조를 하나만 설정하는 것이 아니므로 null로 설정되었을 수있는 모든 참조를 설정해야합니다. 따라서 새 참조를 만들 때마다 고려해야 할 중요한 이유는 메모리 누수가 발생하지 않는 한 최종 참조가 만들어지기를 원하기 때문입니다.

관련 문제