OutOfMemoryError: Java heap space
(Java heap space에서 넘어옴)
OutOfMemoryError: Java heap space는 마인크래프트 서버가 할당받은 힙 메모리를 모두 사용해 더 이상 객체를 만들 수 없을 때 발생하는 오류이다. 대개 서버가 정지하거나 응답하지 않는 상태가 된다.
메모리를 늘리는 것이 첫 번째 대응으로 알려져 있으나, 원인이 메모리 누수라면 늘려도 발생 시점만 늦어질 뿐이다. 얼마나 빨리 다시 발생하는지가 판단 기준이 된다.
원인 구분
| 양상 | 해석 |
|---|---|
| 접속자가 늘어난 시점에 발생 | 실제로 메모리가 부족하다. 할당량 조정이 필요하다 |
| 가동 시간이 길어질수록 반복 발생 | 메모리 누수를 의심한다. 대개 플러그인이 원인이다 |
| 특정 작업 중에만 발생 | 대량 월드 편집, 지도 렌더링, 백업 등 해당 작업의 설정을 조정한다 |
| 메모리를 늘려도 곧 재발 | 할당량 문제가 아니다 |
조사
/spark heapsummary로 어떤 종류의 객체가 힙을 차지하고 있는지 확인할 수 있다. 특정 플러그인의 클래스가 비정상적으로 많다면 그 플러그인을 우선 검토한다.
JVM 실행 인자에 다음을 추가하면 오류 발생 시 힙 덤프를 남긴다.
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/경로/dumps
덤프 파일은 힙 크기만큼 커질 수 있으므로 저장 공간을 확인한 뒤 사용한다.
흔한 원인
- 과도한
view-distance·simulation-distance— 불러온 청크 수에 비례해 메모리를 사용한다 - 청크를 계속 붙잡아 두는 플러그인 — 지도 렌더링, 좌표 이동, 자동 농장 관련 플러그인
- 대량 엔티티 — 아이템이나 몹이 정리되지 않고 누적되는 구역
- 지나치게 큰 할당량 — 물리 메모리보다 크게 잡으면 스왑이 발생해 오히려 불안정해진다
할당량 조정
-Xms와 -Xmx를 같은 값으로 두고, 물리 메모리에서 운영체제와 다른 프로세스가 쓸 몫을 남긴다. 8GB 장비에서 서버에 8GB를 모두 주면 안 된다.