2016-06-26 2 views
3

배열이 인데, 여기서 배열의 형식은 T입니다. 요소를 null로 설정하면 가비지 수집으로 표시됩니다.Java의 배열 및 가비지 컬렉션

예를 들어, 내가 a[36] = null을 수행하거나에서 null 유형의 해당 개체에 입력란을 설정하는 것과 같이 더 필요한 것이 있습니까?

+0

글쎄, 자신의 메모리를 관리하고, OutOfMemoryError'를 얻고, 질문 대신에 코멘트에 추가하는 정보가 무엇이든 반영하도록 질문을 편집하고 싶을 것입니다. – user1803551

답변

1

다른 사람들이 말했듯이, 코드 없이는 말하기 어렵습니다. 그러나이 도움이 될 :

을 조쉬 블로흐의 효과적인 자바 2 판 2 장 6 항에, 당신은 당신이 당신의 자신의 메모리를 관리하는 경우가 을 GC'd 수 있도록하기 위해 null에 대한 참조를 설정해야. 그는 당신이 null 참고를 쓸모없는 참고가 될 수 있고 OutOfMemoryError를 일으키는 원인이 될 수 있는지 설명하지 않는다는 것을 설명한다.

그가 제공하는 예는 다음과 같습니다 (단축합니다). 객체를 push 및 pop 할 수있는 스택 구현을 고려하십시오. 문제는 pop 작동 명단 : 당신이 size 변수와 GC에 수동으로 할당 된 크기를 제어하고

public class Stack { 

    private Object[] elements; 
    private int size = 0; 

    public Object pop() { 
     if (size == 0) 
      throw new EmptyStackException(); 
     Object result = elements[--size]; 
     elements[size] = null; // Eliminate obsolete reference, or you'll have a "memory leak" 
     return result; 
    } 

참고 할당하고 무료있는하는 요소 알 수 없다.

관련성이있는 경우 자세한 내용은 해당 책의 해당 섹션을 참조하십시오. 귀하의 사례는 내가 작성한 것과 유사하지만 코드 없이는 확신 할 수 없습니다.

2

Java에서 개체는 힙에 저장되지만 변수/참조는 스택에 저장됩니다. GC는 '주기 (cycle)'를 수행하며, 어떤 변수가 더 이상 실제 데이터 유형을 참조하지 않는지 확인하고 객체가 여전히 범위에서 참조되는지 여부를 확인합니다. 마리오가 언급했듯이 객체는 결국 아무것도 참조하지 않을 때 수집됩니다. 그러나 일부 성능/메모리 중요한 응용 프로그램에서는 객체를 null로 설정하고 가비지 수집 프로세스의 속도를 높이려고하면 성능에 별 이득이되지 않습니다. 이 경우 너무 걱정하지 않아도됩니다.

+0

간단한 예입니다. 필자의 원래 코드에서는 Spark에서 스칼라 코드를 사용하고 있으며, 한 태스크가 완료되고 다른 태스크가 실행 된 후에도 Executor는 계속 메모리를 소비합니다. 기본적으로 이전 작업의 메모리가 제대로 가비지 수집되지 않는 것 같습니다. 그리고 범인은 HashMap에 배치 된 객체 내에서 StringBuffer 유형의 변수로 보입니다. 끝에 setLength 메서드를 사용하여 StringBuffer의 길이를 0으로 설정하더라도 여전히 문제가 해결되지 않습니다. – pythonic

+2

코드를 더 게시 할 수 있습니까? 이러한 종류의 일들은 객체 참조가 여전히 보유되고 수집되지 않는 많은 양의 데이터를 반복하는 루프 내에서 발생하는 경향이 있습니다. –