GDLauncher logo

Java 메모리와 GC

Minecraft가 메모리를 쓰는 법

Minecraft는 Java 프로그램. 모든 Java 프로그램처럼 시스템 RAM의 고정된 조각을 받는 Java 가상 머신(JVM) 안에서 돕니다. Minecraft가 하는 모든 것, 로드된 청크, 엔티티, 모드 상태, 텍스처가 그 조각 안에서 살아갑니다.

GDLauncher 인스턴스 설정에서 Instance Java Memory를 조정하면 -Xmx(JVM이 쓸 수 있는 최대 힙 크기)를 설정하는 것입니다. Java 코드 자체(객체 할당, 모드 데이터 구조, 월드 상태)는 이 힙에 삽니다. 텍스처와 OpenGL 버퍼는 힙 밖 네이티브 메모리에 살며 Xmx의 영향을 받지 않습니다.

진짜 병목은 가비지 컬렉터

Java는 메모리를 손으로 해제하지 않습니다. 가비지 컬렉터가 주기적으로 힙을 스캔해 더는 참조되지 않는 객체를 찾고 회수합니다. 현대 Minecraft는 기본으로 G1 컬렉터를 사용.

GC는 두 모드:

  • Young GC. 짧고 자주. 최근 생성된 객체의 작은 “young generation”을 스캔. 보통 1~2밀리초.
  • Old GC / Mixed GC. 길고 덜 자주. 힙의 나머지를 스캔. 큰 힙에서는 수십 밀리초 이상 걸리기도.

GC가 돌 때 Minecraft는 일시정지됩니다. 힙이 길수록 큰 컬렉션이 더 오래 걸립니다. 그래서 게임이 실제로 필요한 양을 넘는 RAM 추가는 일시정지 끊김을 악화시킵니다, 개선하지 않습니다.

이건 Java 메모리 튜닝에서 가장 반직관적인 점: 덜 할당하는 게 더 매끄러울 수 있다.

적절한 RAM 양

대략적 가이드라인, 활성 힙이 스래시 없이 들어맞는 기준:

워크로드권장 Xmx
바닐라 Minecraft2~4 GB
라이트 모드(20~40, Sodium 류)4 GB
중규모 모드팩(80~120 모드)4~6 GB
대형 모드팩(ATM, FTB Continents, 250+ 모드)6~8 GB
”키친 싱크” 모드팩(500+ 모드, 깊은 청크 프리젠)8~10 GB

10 GB 이상은 팩 문서가 명시적으로 권장하지 않는 한 거의 도움이 안 됩니다. 일부 팩은 명시적으로 더 요구합니다(Better End, NetherEx 같은 메모리 욕심꾸러기 조합); 팩의 권장 설정을 따르세요.

GDLauncher 슬라이더 작동 방식

인스턴스를 열고 Settings 탭을 누른 뒤 Instance Java Memory까지 스크롤. 토글을 켜서 인스턴스별 오버라이드를 활성화하고 슬라이더를 끕니다. 범위는 1 GB부터 시스템 전체 RAM까지(80% 넘으면 경고). 런처가 값을 -Xmx<n>M으로 변환해 JVM에 전달합니다.

같은 슬라이더가 Settings → Java → Java Memory에 글로벌 수준으로 존재. 인스턴스별 오버라이드가 없는 인스턴스의 기본값으로 쓰입니다. 평소엔 글로벌을 낮게 두고 무거운 모드팩만 따로 올리세요.

Aikar’s flags

G1을 처리량보다 짧은 일시정지에 맞춘 긴 JVM 인자 세트. 원래 Minecraft 서버용으로 작성됐지만 모드 클라이언트에도 유용합니다. 이렇게 생겼습니다:

-XX:+UseG1GC -XX:+ParallelRefProcEnabled -XX:MaxGCPauseMillis=200 ...

GDLauncher는 기본으로 적용하지 않습니다. 사용하려면 인스턴스 Settings 탭의 Instance Java Arguments 필드에 전체 문자열을 붙여넣으세요(글로벌 적용은 Settings → Java → Java Arguments). 효과는 다양하며, 가장 일관된 이득은 6~10 GB 힙에서 긴 일시정지가 줄어드는 것.

몇 가지 주의:

  • 옛 Java 버전용으로 튜닝됨. Java 17+에서는 기본값이 이미 꽤 좋아 Aikar의 이득이 작습니다.
  • 서버형 할당 패턴을 가정. 작은 힙의 데스크톱에서는 오히려 해가 될 수 있습니다.
  • 메모리를 추가하거나 게임이 쓰는 양을 바꾸지 않습니다. 컬렉터의 동작만 바꿉니다.

특별한 이유가 없다면 GDLauncher가 설정한 Java Arguments 필드를 그대로 두세요.

끊김 진단

Minecraft가 몇 초마다 수백 밀리초씩 멈춘다면:

  1. F3 디버그 화면을 열고 “Mem:” 줄(우측 상단)을 보세요. 낮음과 높음을 빠르게 오가면 GC 채우기.
  2. Xmx를 1~2 GB 낮추고 다시 시도. 반직관적이지만 작은 힙은 GC가 더 빠릅니다.
  3. 특정 모드가 미친 듯이 할당한다면(일부 프리젠/렌더링 모드), 모드 쪽 프로파일러(Spark, JmxMC)에 나타납니다. 모드 업데이트가 필요할 수도.
  4. 일시정지 중 CPU가 100%면 GC가 진심으로 일하는 중. Xmx를 더 줄이거나 메모리 욕심 모드를 제거.

요약

  • Java Memory는 딱 충분히 두세요, 가진 만큼 다 주지 마세요.
  • 병목은 GC 일시정지 시간이지 힙 크기 자체가 아닙니다.
  • Aikar’s flags는 큰 힙에서 도움되지만 만능은 아닙니다.
  • 대부분의 모드 환경엔 4~6 GB가 적절합니다.