저는 현재 응용 프로그램을 최적화하고 있으며 거의 1 기가의 RAM을 차지하는 것으로 나타났습니다. 나는 프로파일 링을하고 문제를 발견했다 :나는 내가 만든 텍스처 클래스에서 픽셀 데이터를 가지고있는 int 배열을 생성함으로써 많은 메모리를 할당하고 있었다. 그러나 이것은 새로운 배열을 만들 때 이전 배열이 더 이상 사용되지 않으며 어디에도 참조가 없으므로 혼란 스럽습니다.Java 참조되지 않은 배열이 여전히 메모리를 차지합니다.
나는이 문제를 재현 테스트 프로그램을 작성했습니다 :
public class Main {
static class ArrayHolder {
int[] array;
void init() {
array = null;
array = new int[4000];
}
}
public static void main(String[] args) {
ArrayHolder holder = new ArrayHolder();
for (int i = 0; i < 1000000; i++) {
holder.init();
}
System.out.println(holder.array.length);
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
나는 프로그램이 RAM 600 메가 바이트까지 사용이 코드를 실행
. ArrayHolder에서 init() 메서드를 호출하면 배열 필드가 새 배열로 설정되고 이전 배열에 대한 참조가 손실되므로 그 이유를 알지 못합니다. 그것은 더 이상 공간을 차지하지 않는다는 것을 의미하지 않습니까? 이것이 멍청한 질문이라면 유감스럽게 생각합니다.하지만 왜이 사람이 내가 여기서 잘못하고 있는지 설명 할 수 있습니까?
이전 배열은 gc의 재량에 의해서만 시작되었습니다. 메모리를 재 할당 한 직후에 gc가 실행되면 공간은 다시 확보되지 않을 것입니다. – SMA
큰 배열은 tenured 공간에 추가되며 채워지는 경우 기본적으로 GC-ed됩니다. 예 : 잠자기해도 GC가 실행되지 않습니다. 간단히 말해서, 이렇게 많은 수의 큰 배열을 만드는 것은 여러 가지 이유로 이상적입니다. –