배열이 인데, 여기서 배열의 형식은 T
입니다. 요소를 null로 설정하면 가비지 수집으로 표시됩니다.Java의 배열 및 가비지 컬렉션
예를 들어, 내가 a[36] = null
을 수행하거나에서 null
유형의 해당 개체에 입력란을 설정하는 것과 같이 더 필요한 것이 있습니까?
배열이 인데, 여기서 배열의 형식은 T
입니다. 요소를 null로 설정하면 가비지 수집으로 표시됩니다.Java의 배열 및 가비지 컬렉션
예를 들어, 내가 a[36] = null
을 수행하거나에서 null
유형의 해당 개체에 입력란을 설정하는 것과 같이 더 필요한 것이 있습니까?
다른 사람들이 말했듯이, 코드 없이는 말하기 어렵습니다. 그러나이 도움이 될 :
을 조쉬 블로흐의 효과적인 자바 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;
}
참고 할당하고 무료있는하는 요소 알 수 없다.
관련성이있는 경우 자세한 내용은 해당 책의 해당 섹션을 참조하십시오. 귀하의 사례는 내가 작성한 것과 유사하지만 코드 없이는 확신 할 수 없습니다.
Java에서 개체는 힙에 저장되지만 변수/참조는 스택에 저장됩니다. GC는 '주기 (cycle)'를 수행하며, 어떤 변수가 더 이상 실제 데이터 유형을 참조하지 않는지 확인하고 객체가 여전히 범위에서 참조되는지 여부를 확인합니다. 마리오가 언급했듯이 객체는 결국 아무것도 참조하지 않을 때 수집됩니다. 그러나 일부 성능/메모리 중요한 응용 프로그램에서는 객체를 null로 설정하고 가비지 수집 프로세스의 속도를 높이려고하면 성능에 별 이득이되지 않습니다. 이 경우 너무 걱정하지 않아도됩니다.
간단한 예입니다. 필자의 원래 코드에서는 Spark에서 스칼라 코드를 사용하고 있으며, 한 태스크가 완료되고 다른 태스크가 실행 된 후에도 Executor는 계속 메모리를 소비합니다. 기본적으로 이전 작업의 메모리가 제대로 가비지 수집되지 않는 것 같습니다. 그리고 범인은 HashMap에 배치 된 객체 내에서 StringBuffer 유형의 변수로 보입니다. 끝에 setLength 메서드를 사용하여 StringBuffer의 길이를 0으로 설정하더라도 여전히 문제가 해결되지 않습니다. – pythonic
코드를 더 게시 할 수 있습니까? 이러한 종류의 일들은 객체 참조가 여전히 보유되고 수집되지 않는 많은 양의 데이터를 반복하는 루프 내에서 발생하는 경향이 있습니다. –
글쎄, 자신의 메모리를 관리하고, OutOfMemoryError'를 얻고, 질문 대신에 코멘트에 추가하는 정보가 무엇이든 반영하도록 질문을 편집하고 싶을 것입니다. – user1803551