- 내가 아는 한 힙 공간은 인스턴스 변수로만 차지합니다. 이것이 맞다면, 객체 생성시 인스턴스 변수를위한 공간이 할당 되었기 때문에 얼마 동안 잘 실행 된 후이 오류가 발생한 이유입니다.
즉, 일정 기간 동안 지속적으로 애플리케이션에 더 많은 개체를 만들고 있다는 의미입니다. 새 개체는 힙 메모리에 저장되며 이것이 힙 메모리의 증가 이유입니다.
힙은 인스턴스 변수 만 포함하지 않습니다. 기본이 아닌 모든 데이터 유형 (개체)을 저장합니다. 이러한 개체 수명은 짧거나 (메소드 블록) 길 수 있습니다 (개체가 응용 프로그램에서 참조 될 때까지).
- 힙 공간을 늘리는 방법이 있습니까?
예. 자세한 내용 은이 오라클 기사 를 참조하십시오.
힙 크기를 설정하기위한 두 가지 매개 변수가 있습니다.
-Xms : , 초기 및 최소 힙 크기를 설정합니다.
-Xmx : , 최대 힙 크기를 설정합니다.
- 힙 공간을 덜 차지하려면 프로그램을 어떻게 변경해야합니까?
응용 프로그램에 따라 다릅니다.
애플리케이션 요구 사항에 따라 최대 힙 메모리 설정
응용 프로그램에서 메모리 누수를 일으키지 마십시오.
애플리케이션에서 메모리 누수가 발견되면 MAT , Visual VM , jconsole 등과 같은 프로파일 링 도구를 사용 하여 근본 원인을 찾으십시오. 근본 원인을 찾으면 누수를 수정하십시오.
오라클 기사의 중요 참고 사항
원인 : Java 힙 공간에 대한 자세한 메시지는 Java 힙에서 개체를 할당 할 수 없음을 나타냅니다. 이 오류는 반드시 메모리 누수를 의미하지는 않습니다.
가능한 이유 :
- 부적절한 구성 (충분한 메모리를 할당하지 않음)
- 응용 프로그램이 의도하지 않게 개체에 대한 참조를 보유하고있어 개체가 가비지 수집되는 것을 방지합니다.
- 종료자를 과도하게 사용하는 응용 프로그램. 클래스에 finalize 메서드가있는 경우 해당 유형의 개체는 가비지 수집 시간에 공간을 회수하지 않습니다. 종료 자 스레드가 종료 대기열을 따라 잡을 수없는 경우 Java 힙이 채워질 수 있으며 이러한 유형의 OutOfMemoryError 예외가 발생 합니다.
다른 메모에서 더 나은 가비지 수집 알고리즘 ( CMS 또는 G1GC )을 사용하십시오.
G1GC를 이해하려면 이 질문 을 살펴보십시오.