이것은 Minecraft용 Java 조정 가이드입니다. 모든 플래그와 조정은 회귀 테스트를 위해 개별적으로 벤치마킹되고 중복을 피하기 위해 Java 기본값과 비교하여 확인됩니다.
이러한 조정으로 인해 일부 서버 및 클라이언트 끊김 현상이 눈에 띄게 줄어들었지만 기껏해야 약간의 TPS 이득 + 최소한의 FPS 이득, RAM + CPU 사용량이 다소 증가할 것으로 예상됩니다. 그리고 Spark나 Observable과 같은 모드를 사용하여 느린 문제를 해결하는 것을 대체할 수 없습니다.
질문 등에 대한 디스코드: https://discord.gg/zeFSR9PnUw
모든 플래그는 Benchmark.py 스크립트로 테스트됩니다. 진행 중인 Benchmarks.md를 참조하세요.
Minecraft 1.16.5 이상의 경우 Java 17을 사용하십시오. Curseforge 및 Prism Launcher와 같은 일부 실행 프로그램은 1.16.X에서 Java 8을 사용하도록 요청하지만 Minecraft 1.16.5+, 모든 1.18+ 모드 및 대부분의 1.16.5 모드는 호환됩니다. 자바 17을 사용합니다.
Java 17이 작동하지 않는 곳에서 Java 11이 작동하는 경우도 있습니다.
1.12.2 이하는 일반적으로 Java 8이 필요합니다.
Azul, Microsoft, Adoptium, Amazon 등의 Java 런타임은 기본적으로 동일합니다. 몇 가지 주목할만한 예외:
Oracle GraalVM Enterprise Edition은 더욱 공격적인 Java 컴파일러를 제공합니다. 이것이 제가 개인적으로 Minecraft를 실행하는 방법입니다. 아래 GraalVM 섹션을 참조하세요.
Intel의 Clear Linux OpenJDK는 다른 OpenJDK와 동일한 코드를 사용하지만(호환성이 높음) 빌드 프로세스 자체와 종속성은 최신 CPU에 최적화되어 있습니다. swupd
를 통해 Clear Linux 저장소, Distrobox 또는 Docker에서 가져옵니다. Java 17 릴리스로 롤백해야 하며 Java 18에서는 일부 성능 향상 기능을 되돌립니다.
Azul의 Prime OpenJDK는 llvm에 연결되므로 매우 빠르지만 현재 대부분의 모드와 호환되지 않으며 Linux 전용입니다. 여기에서 다운로드하세요: https://docs.azul.com/prime/prime-quick-start-tar
Red Hat Java 8 에는 Shenandoah 가비지 수집기가 있습니다. 무료 이메일 가입이 가능합니다: https://developers.redhat.com/products/openjdk/download
IBM의 OpenJ9 는... Minecraft에서 훨씬 느리고 다른 Java 빌드와 완전히 다른 플래그를 사용하지만 OpenJDK 기반 런타임보다 메모리를 덜 소비합니다. 낮은 메모리 소비 플래그에 대해서는 FAQ, 벤치마크 폴더 및 이 Gist를 참조하세요.
무엇을 선택해야 할지 모르겠다면 GraalVM EE(아래 참조) 또는 최신 Adoptium Java 17 JRE(https://adoptium.net/)를 권장합니다.
Couleur는 https://rentry.co/JREs에서 JRE 실행 목록을 잘 관리하고 있습니다.
이러한 최적화된 플래그는 모든 Java 11+ 빌드에서 실행됩니다. 서버와 클라이언트 모두에서 작동합니다.
-XX:+UnlockExperimentalVMOptions -XX:+UnlockDiagnosticVMOptions -XX:+AlwaysActAsServerClassMachine -XX:+AlwaysPreTouch -XX:+DisableExplicitGC -XX:+UseNUMA -XX:NmethodSweepActivity=1 -XX:ReservedCodeCacheSize=400M -XX:NonNMethodCodeHeapSize=12M -XX:ProfiledCodeHeapSize=194M -XX:NonProfiledCodeHeapSize=194M -XX:-DontCompileHugeMethods -XX:MaxNodeLimit=240000 -XX:NodeLimitFudgeFactor=8000 -XX:+UseVectorCmov -XX:+PerfDisableSharedMem -XX:+UseFastUnorderedTimeStamps -XX:+UseCriticalJavaThreadPriority -XX:ThreadPriorityPolicy=1 -XX:AllocatePrefetchStyle=3
이러한 Java 인수에 가비지 수집 플래그를 추가 해야 합니다 .
-Xmx8G -Xms8G -XX:+UnlockExperimentalVMOptions -XX:+UnlockDiagnosticVMOptions -XX:+AlwaysPreTouch -XX:+DisableExplicitGC -XX:+UseNUMA -XX:NmethodSweepActivity=1 -XX:ReservedCodeCacheSize=400M -XX:NonNMethodCodeHeapSize=12M -XX:ProfiledCodeHeapSize=194M -XX:NonProfiledCodeHeapSize=194M -XX:-DontCompileHugeMethods -XX:MaxNodeLimit=240000 -XX:NodeLimitFudgeFactor=8000 -XX:+UseVectorCmov -XX:+PerfDisableSharedMem -XX:+UseFastUnorderedTimeStamps -XX:+UseCriticalJavaThreadPriority -XX:ThreadPriorityPolicy=1 -XX:AllocatePrefetchStyle=3 -XX:+UseG1GC -XX:MaxGCPauseMillis=37 -XX:+PerfDisableSharedMem -XX:G1HeapRegionSize=16M -XX:G1NewSizePercent=23 -XX:G1ReservePercent=20 -XX:SurvivorRatio=32 -XX:G1MixedGCCountTarget=3 -XX:G1HeapWastePercent=20 -XX:InitiatingHeapOccupancyPercent=10 -XX:G1RSetUpdatingPauseTimePercent=0 -XX:MaxTenuringThreshold=1 -XX:G1SATBBufferEnqueueingThresholdPercent=30 -XX:G1ConcMarkStepDurationMillis=5.0 -XX:G1ConcRSHotCardLimit=16 -XX:G1ConcRefinementServiceIntervalMillis=150 -XX:GCTimeRatio=99 -XX:+UseLargePages -XX:LargePageSizeInBytes=2m
https://dzone.com/articles/benefits-of-setting-initial-and-maximum-memory-siz에 설명된 대로 최소 및 최대( -xms
및 -xmx
) 메모리는 동일한 값으로 설정되어야 합니다.
한 가지 예외: 메모리가 부족한 시스템을 사용하고 있으며 Minecraft가 RAM을 거의 모두 차지하는 경우 최소 메모리를 최대 메모리보다 낮게 설정하여 최대한 절약하세요.
크기는 메가바이트( -Xms4096M
) 또는 기가바이트( -Xmx8G
)로 설정됩니다.
메모리를 너무 많이 할당하면 여유 공간이 많더라도 GC가 중단되거나 Minecraft 속도가 느려질 수 있습니다. 너무 적게 할당하면 게임 속도가 느려지거나 중단될 수도 있습니다. Minecraft가 실행되는 동안 Windows 작업 관리자(또는 DE의 시스템 모니터)를 주의 깊게 관찰하고 필요한 만큼만 할당하십시오(보통 8G 미만). sparkc gcmonitor
할당량이 너무 높은지(일시 중지가 너무 길어짐) 또는 너무 낮은지(알림에 메모리 부족 경고가 포함된 빈번한 GC) 알려줍니다.
가비지 수집 플래그는 Minecraft 서버 및 클라이언트에 추가되어야 합니다 . 기본적으로 클라이언트에서 끊김 현상과 서버 지연으로 가비지 매니페스트를 중지하고 수집하기 위한 기본 "일시 중지"입니다. Spark 모드에서 /sparkc gcmonitor
명령을 사용하여 게임 내 일시 중지를 관찰하세요. 이전 세대의 일시 중지는 좋지 않으며 젊은 세대의 G1GC 수집은 드물지만 눈에 띄지 않을 만큼 짧아야 합니다.
하나의 플래그 세트를 선택하십시오. 클라이언트에서는 Shenandoah를 , 강력한 Java 17 서버에서는 ZGC를 , Graal이나 RAM과 코어 수가 적은 서버/클라이언트에서는 G1GC를 권장합니다.
ZGC는 높은 메모리/많은 코어 수의 서버에 적합합니다. 측정할 수 있는 서버 처리량 히트가 없으며 절대 끊김 현상이 발생하지 않습니다. 그러나 다른 가비지 수집기보다 더 많은 RAM과 더 많은 코어가 필요합니다.
불행하게도 내(8코어/16스레드) 노트북에서는 상당한 클라이언트 FPS가 발생했습니다. 벤치마크 폴더에서 "ZGC" 벤치마크를 확인하세요. Java 8에서는 사용할 수 없으며 Java 17보다 Java 11에서 성능이 훨씬 떨어집니다.
-XX:+UseZGC -XX:AllocatePrefetchStyle=1 -XX:-ZProactive
이를 활성화하지만 일반적으로 다른 GC에 비해 더 많은 RAM과 ConcGCThreads
할당합니다. ZGC는 AllocatePrefetchStyle=3을 좋아하지 않으므로 1로 설정하면 이전 항목이 무시됩니다. 유
Shenandoah는 클라이언트에서 잘 작동하지만 테스트에서 서버 처리량을 저하시킵니다. -XX:+UseShenandoahGC -XX:ShenandoahGCMode=iu -XX:ShenandoahGuaranteedGCInterval=1000000 -XX:AllocatePrefetchStyle=1
사용하여 활성화합니다.
여기에서 더 많은 튜닝 옵션을 확인하세요. "herustic" 및 "mode" 옵션은 크게 변경되지 않습니다(사용해서는 안 되는 "compact" 제외). ZGC와 마찬가지로 Shenandoah는 AllocatePrefetchStyle=3을 좋아하지 않습니다.
Shenandoah는 Java 8에 없습니다. Oracle Java 빌드에도 없습니다! Java 8 사용자인 경우 Shenandoah를 사용하려면 Red Hat OpenJDK를 사용해야 합니다: https://developers.redhat.com/products/openjdk/download
G1GC는 기본 가비지 수집기이며 GraalVM 사용자가 사용할 수 있는 유일한 가비지 수집기입니다. Aikar의 유명한 Minecraft 서버 G1GC 인수는 두 가지 주의 사항과 함께 클라이언트에서 훌륭하게 실행됩니다. G1NewSizePercent
너무 높게 설정하여 MaxGCPauseMillis
매개 변수를 효과적으로 고정하고 일부 클라이언트에서 긴 끊김 현상을 생성하며 오래된 쓰레기를 너무 공격적으로 수집합니다(클라이언트 가 채워진 서버).
이는 aikar 플래그와 유사하지만 더 짧고 더 빈번한 일시 중지, 덜 공격적인 G1 혼합 컬렉션 및 더 공격적인 백그라운드 컬렉션이 있습니다. -XX:+UseG1GC -XX:MaxGCPauseMillis=37 -XX:+PerfDisableSharedMem -XX:G1HeapRegionSize=16M -XX:G1NewSizePercent=23 -XX:G1ReservePercent=20 -XX:SurvivorRatio=32 -XX:G1MixedGCCountTarget=3 -XX:G1HeapWastePercent=20 -XX:InitiatingHeapOccupancyPercent=10 -XX:G1RSetUpdatingPauseTimePercent=0 -XX:MaxTenuringThreshold=1 -XX:G1SATBBufferEnqueueingThresholdPercent=30 -XX:G1ConcMarkStepDurationMillis=5.0 -XX:G1ConcRSHotCardLimit=16 -XX:G1ConcRefinementServiceIntervalMillis=150 -XX:GCTimeRatio=99
G1NewSizePercent
및 MaxGCPauseMillis
사용하여 젊은 세대 컬렉션의 빈도/기간을 조정할 수 있습니다. 설정에서 이전 세대가 일시 중지되는 경우 G1HeapWastePercent=18
제거해야 합니다. 또는 이 값을 높이고 G1MixedGCCountTarget
2 또는 1로 설정하여 혼합 가비지 수집을 더욱 게으르게 만들 수 있습니다(메모리 사용량이 높아짐).
서버에서는 더 긴 일시 중지가 더 허용됩니다. 이러한 플래그는 aikar 기본값과 매우 유사합니다.
-XX:+UseG1GC -XX:MaxGCPauseMillis=130 -XX:+UnlockExperimentalVMOptions -XX:+DisableExplicitGC -XX:+AlwaysPreTouch -XX:G1NewSizePercent=28 -XX:G1HeapRegionSize=16M -XX:G1ReservePercent=20 -XX:G1MixedGCCountTarget=3 -XX:InitiatingHeapOccupancyPercent=10 -XX:G1MixedGCLiveThresholdPercent=90 -XX:G1RSetUpdatingPauseTimePercent=0 -XX:SurvivorRatio=32 -XX:MaxTenuringThreshold=1 -XX:G1SATBBufferEnqueueingThresholdPercent=30 -XX:G1ConcMarkStepDurationMillis=5 -XX:G1ConcRSHotCardLimit=16 -XX:G1ConcRefinementServiceIntervalMillis=150
-XX:ConcGCThreads=[Some Number]
가비지 수집기가 사용할 수 있는 최대 백그라운드 스레드 수를 제어하고 기본값은 logical (hyperthreaded) cores / 4
입니다. 최신 버전의 Java에서는 필요한 경우 gc 스레드 수를 줄입니다.
어떤 경우에는(특히 ZGC 또는 Shenandoh의 경우) 이 스레드 캡을 기본값 이상으로 늘리고 싶을 수도 있습니다. 스레드가 4개인 CPU에서는 "2"를 권장하고 대부분의 다른 CPU에서는 [number of real cores - 2]
권장하지만 이 매개변수를 사용해야 할 수도 있습니다. 너무 낮으면 가비지 수집이 Minecraft를 따라갈 수 없으며 게임이 버벅거리거나 RAM 덩어리를 먹기 시작하여 충돌이 발생합니다. 너무 높으면 특히 Java 8을 실행하는 경우 게임 속도가 느려질 수 있습니다.
ParallelGCThreads
또는 JVMCIThreads
와 같은 다른 "스레딩" 플래그는 Java 8+에서 좋은 자동 설정으로 기본적으로 활성화되므로 필요하지 않습니다.
참고: 대형 페이지에는 Windows에서 관리자 권한이 필요합니다. 이는 보안 위험이 있으므로 해당 내용이 마음에 들지 않으면 이 섹션을 건너뛰어야 합니다.
대형 페이지를 활성화하면 Minecraft 서버 및 클라이언트의 성능이 향상됩니다. 이를 활성화하기 위한 몇 가지 훌륭한 튜토리얼은 다음과 같습니다.
Windows에서는 Java와 실행 프로그램을 관리자로 실행 해야 합니다 . 이는 javaw.exe
, java.exe
및 your launcher.exe
에 대해 "관리자 권한으로 실행" 호환성 확인란을 선택하는 것을 의미합니다. 그렇지 않으면 Large Pages가 자동으로 실패합니다. 인수에 -XX:+UseLargePages -XX:LargePageSizeInBytes=2m
추가합니다.
Linux에서는 일반적으로 -XX:+UseTransparentHugePages
사용하려고 합니다. 대신 (더 큰 성능 향상을 위해) 메모리를 수동으로 할당하기 위해 Red Hat에는 Fedora, CentOS 또는 Oracle Linux와 같은 RHEL과 유사한 Linux 배포판에 대한 유용한 튜토리얼이 있습니다: https://www.redhat.com/en/blog/optimizing -rhel-8-run-java-구현-minecraft-서버
Java 17에서 -Xlog:gc+init
java 인수를 사용하여 대형 페이지가 작동하는지 확인하세요.
모든 Java 버전/플랫폼에서 대형 페이지가 작동하지 않으면 로그에 다음과 유사한 경고가 표시됩니다.
Java HotSpot(TM) 64비트 서버 VM 경고: JVM은 메모리의 페이지를 잠글 수 있는 충분한 권한이 없기 때문에 대형 페이지 메모리를 사용할 수 없습니다.
GraalVM은 (모드 및 바닐라) Minecraft의 성능을 향상시킬 수 있는 Oracle의 새로운 Java VM입니다. 클라이언트 FPS 향상은 미미하지만 청크 생성과 같은 서버 측 워크로드는 20% 이상 향상될 수 있습니다!
GraalVM Enterprise Edition에만 전체 최적화 세트가 제공됩니다. Oracle의 직접 링크를 통해 다운로드하세요.
Windows AMD64(64비트): https://oca.opensource.oracle.com/gds/GRAALVM_EE_JAVA17_22_3_1/graalvm-ee-java17-windows-amd64-22.3.1.zip
Linux AMD64(64비트): https://oca.opensource.oracle.com/gds/GRAALVM_EE_JAVA17_22_3_1/graalvm-ee-java17-linux-amd64-22.3.1.tar.gz
Linux AARCH64(ARM 64비트): https://oca.opensource.oracle.com/gds/GRAALVM_EE_JAVA17_22_3_1/graalvm-ee-java17-linux-aarch64-22.3.1.tar.gz
Mac AMD64(64비트): https://oca.opensource.oracle.com/gds/GRAALVM_EE_JAVA17_22_3_1/graalvm-ee-java17-darwin-amd64-22.3.1.tar.gz
Windows AMD64(64비트): https://oca.opensource.oracle.com/gds/GRAALVM_EE_JAVA11_22_3_1/graalvm-ee-java11-windows-amd64-22.3.1.zip
Linux AMD64(64비트): https://oca.opensource.oracle.com/gds/GRAALVM_EE_JAVA11_22_3_1/graalvm-ee-java11-linux-amd64-22.3.1.tar.gz
Linux AARCH64(ARM 64비트): https://oca.opensource.oracle.com/gds/GRAALVM_EE_JAVA11_22_3_1/graalvm-ee-java11-linux-aarch64-22.3.1.tar.gz
Mac AMD64(64비트): https://oca.opensource.oracle.com/gds/GRAALVM_EE_JAVA11_22_3_1/graalvm-ee-java11-darwin-amd64-22.3.1.tar.gz
Windows AMD64(64비트): https://oca.opensource.oracle.com/gds/GRAALVM_EE_JAVA8_21_3_5/graalvm-ee-java8-windows-amd64-21.3.5.zip
Linux AMD64(64비트): https://oca.opensource.oracle.com/gds/GRAALVM_EE_JAVA8_21_3_5/graalvm-ee-java8-linux-amd64-21.3.5.tar.gz
Mac AMD64(64비트): https://oca.opensource.oracle.com/gds/GRAALVM_EE_JAVA8_21_3_5/graalvm-ee-java8-darwin-amd64-21.3.5.tar.gz
(선택한 GraalVM EE 버전은 AUR 및 Oracle Linux 저장소에서도 사용 가능)
ARM Mac용 새 버전을 사용하려면 Oracle의 기본 다운로드 페이지(https://www.oracle.com/downloads/graalvm-downloads.html)에서 무료 등록이 필요합니다.
이 릴리스는 Java 설치 프로그램이 아닙니다. 런처의 Java 버전을 수동으로 교체하거나 Java 경로 지정을 지원하는 Minecraft 런처를 사용해야 합니다. ATLauncher, Prism Launcher 또는 GDLauncher를 추천합니다. Java 경로를 지정할 때 GraalVM 다운로드의 "bin" 폴더로 이동하여 "javaw.exe" 또는 "java.exe"를 사용하십시오.
서버의 경우 서버 시작 sh/bat 파일의 "java" 명령을 따옴표로 묶은 graalvm java의 전체 경로로 바꿔야 합니다.
또는 Oracle 가이드(https://www.graalvm.org/22.2/docs/getting-started/#install-graalvm)에 따라 시스템 전체에 설치할 수 있습니다.
GraalVM EE 22+ Java 17(또는 Java 11)에 대한 인수:
-XX:+UnlockExperimentalVMOptions -XX:+UnlockDiagnosticVMOptions -XX:+AlwaysActAsServerClassMachine -XX:+AlwaysPreTouch -XX:+DisableExplicitGC -XX:+UseNUMA -XX:AllocatePrefetchStyle=3 -XX:NmethodSweepActivity=1 -XX:ReservedCodeCacheSize=400M -XX:NonNMethodCodeHeapSize=12M -XX:ProfiledCodeHeapSize=194M -XX:NonProfiledCodeHeapSize=194M -XX:-DontCompileHugeMethods -XX:+PerfDisableSharedMem -XX:+UseFastUnorderedTimeStamps -XX:+UseCriticalJavaThreadPriority -XX:+EagerJVMCI -Dgraal.TuneInlinerExploration=1 -Dgraal.CompilerConfiguration=enterprise
이러한 인수와 함께 G1GC를 사용해야 합니다. GraalVM은 현재 ZGC 또는 Shenandoah에서 작동하지 않습니다.
GraalVM EE 22.3.0은 알려진 모든 Minecraft 버그를 수정합니다.
이전 Java 8 기반 버전의 GraalVM을 실행하는 경우 몇 가지 잠재적인 문제가 있습니다.
VectorizeSIMD
Optifine, Iris 또는 Occulus와 같은 셰이더 모드를 사용하여 개체를 보이지 않게 만듭니다. 하지만 특정 조건에서만 가능합니다. 이 문제는 GraalVM EE 22.3.0에서 수정될 예정입니다. 참조: oracle/graal#4849
GraalVM CE 및 EE는 모두 1.16.5 Astral Sorcery에서 별자리 렌더링을 중단합니다. 이는 셰이더 버그와 관련이 있을 수 있습니다. 참조: HellFirePvP/AstralSorcery#1963
아직 서버 측 버그를 관찰하지 못했습니다.
GraalVM을 추적할 수 있는 다른 모드 문제가 발생하는 경우 Github 문제를 생성하거나 Discord에 게시하세요! 일반적으로 주요 dgraal
최적화 플래그를 비활성화하거나 Dgraal.PrintCompilation=true
로 올바른 함수를 찾고, 잘못 컴파일된 함수를 찾은 후 -Dgraal.GraalCompileOnly=~...
를 사용하여 문제를 해결할 수 있습니다.
ReShade와 유사한 "범용" Windows 모드인 SpecialK에는 두 가지 주요 성능 이점이 있습니다.
끊김 현상을 줄이고, 끊김 현상을 제거하고, 전력을 절약하고, 필요할 때 부스트할 수 있도록 CPU TDP를 절약하는 "스마트" 프레임 제한기입니다. VRR 또는 Nvidia Reflex와 함께 작동할 수도 있습니다.
Minecraft의 창 모드 오버헤드를 제거하고 다른 기능(자동 HDR 또는 크기 조정 가능한 경계 없는 창 등)을 활성화하는 OpenGL-IK라는 OpenGL-to-DirectX11 래퍼입니다.
여기에서 다운로드하세요: https://wiki.special-k.info/en/SpecialK/Tools
MC 런처를 추가하고 "상승된 서비스" 확인란을 선택하세요. 그런 다음 javaw.exe가 있는 Java bin 폴더로 이동하여 SpecialK.OpenGL32
라는 빈 파일을 만듭니다. SpecialK 런처를 사용하여 Minecraft 런처를 실행하면 런처가 Minecraft에 SpecialK를 "주입"합니다.
더욱 편리하게 SpecialK UI를 통해 Minecraft 런처에 대한 바탕화면 바로가기를 만들 수 있습니다.
VSync와 게임 내 Minecraft 프레임 제한기를 꺼야 합니다.
한 사용자가 SpecialK를 실행할 때 FPS가 감소했다고 보고했습니다. 이런 일이 발생하면 Discord나 Github를 통해 알려주세요!
Minecraft를 시작한 후 작업 관리자를 사용하여 Windows에서 "보통 이상" 프로세스 우선 순위로 실행되도록 Java를 설정하세요.
Linux 사용자는 실행 명령 시작 부분에 sudo nice -n -10
추가할 수 있지만 0 미만의 nice 수준("max"는 -20임)에서는 Minecraft를 sudo
로 실행해야 합니다. 또는 이러한 보안 위험을 방지하려면 Minecraft를 시작한 후 renice
명령을 사용하십시오.
이것은 성능 모드를 찾기 위한 환상적인 저장소입니다: https://github.com/NordicGamerFE/usefulmods
Optifine 대신 Sodium + Iris 또는 Rubidium + Oculus와 같은 더 호환 가능한 대안을 권장합니다.
Java 17을 사용하는 것이 좋습니다. 8이 꼭 필요한 경우가 아니면 Java 11을 사용하는 것이 좋습니다. 그러나 그렇다면 이러한 플래그는 Shenandoh GC(클라이언트의 Red Hat OpenJDK) 또는 G1GC(다른 모든 경우)와 함께 OpenJDK8에서 작동합니다.
-XX:+UnlockExperimentalVMOptions -XX:+UnlockDiagnosticVMOptions -XX:+AlwaysActAsServerClassMachine -XX:+ParallelRefProcEnabled -XX:+DisableExplicitGC -XX:+AlwaysPreTouch -XX:+PerfDisableSharedMem -XX:+AggressiveOpts -XX:+UseFastAccessorMethods -XX:MaxInlineLevel=15 -XX:MaxVectorSize=32 -XX:+UseCompressedOops -XX:ThreadPriorityPolicy=1 -XX:+UseNUMA -XX:+UseDynamicNumberOfGCThreads -XX:NmethodSweepActivity=1 -XX:ReservedCodeCacheSize=350M -XX:-DontCompileHugeMethods -XX:MaxNodeLimit=240000 -XX:NodeLimitFudgeFactor=8000 -XX:+UseFPUForSpilling -Dgraal.CompilerConfiguration=community
x86 Java 8 사용자(대부분의 Java 8 사용자라고도 함)는 다음과 같은 추가 인수를 추가할 수 있습니다.
-XX:+UseXMMForArrayCopy
Oracle 사이트의 21.X 섹션에서 GraalVM EE의 Java 8 버전을 다운로드하고 다음 인수를 사용할 수도 있습니다.
-XX:+UnlockExperimentalVMOptions -XX:+UnlockDiagnosticVMOptions -XX:+AlwaysActAsServerClassMachine -XX:+ParallelRefProcEnabled -XX:+DisableExplicitGC -XX:+AlwaysPreTouch -XX:+AggressiveOpts -XX:+UseFastAccessorMethods -XX:AllocatePrefetchStyle=1 -XX:ThreadPriorityPolicy=1 -XX:+UseNUMA -XX:+UseDynamicNumberOfGCThreads -XX:NmethodSweepActivity=1 -XX:ReservedCodeCacheSize=350M -XX:-DontCompileHugeMethods -XX:MaxNodeLimit=240000 -XX:NodeLimitFudgeFactor=8000 -XX:+UseFPUForSpilling -XX:+EnableJVMCI -XX:+UseJVMCICompiler -XX:+EagerJVMCI -Dgraal.TuneInlinerExploration=1 -Dgraal.CompilerConfiguration=enterprise -Dgraal.UsePriorityInlining=true -Dgraal.Vectorization=true -Dgraal.OptDuplication=true -Dgraal.DetectInvertedLoopsAsCounted=true -Dgraal.LoopInversion=true -Dgraal.VectorizeHashes=true -Dgraal.EnterprisePartialUnroll=true -Dgraal.VectorizeSIMD=true -Dgraal.StripMineNonCountedLoops=true -Dgraal.SpeculativeGuardMovement=true -Dgraal.InfeasiblePathCorrelation=true
셰이더를 실행하는 경우 -Dgraal.VectorizeSIMD
false
로 설정해야 합니다.
Clear Linux에서 Minecraft 서버를 실행하세요! 이는 기본적으로 가장 최적화된 Linux 배포판이며, 몇 가지 다른 멋진 기능(예: 상태 비저장 구성 시스템)을 갖추고 있습니다. 또한 AMD/Intel GPU에서 클라이언트를 매우 잘 실행합니다: https://web.archive.org/web/20220916090057/https://docs.01.org/clearlinux/latest/tutorials/multi-boot/dual-boot- win.html
Oracle Linux는 기본적으로 합리적으로 최적화되어 있고 패키지 관리자를 통해 Graalvm EE를 사용할 수 있으므로 서버용으로도 좋은 선택입니다. 클라이언트의 경우 CachyOS 또는 EndeavorOS와 같은 Arch 기반 배포판이 탁월합니다. 대부분의 하드웨어를 폭넓게 지원하기 때문입니다.
Minecraft 클라이언트가 개별 GPU를 사용하고 있는지 확인하세요! F3 탭을 확인하고 AMD/Nvidia 제어판이 아닌 " Windows 그래픽 설정 "에서 Minecraft가 이를 사용하도록 강제합니다(더 이상 작동하지 않는 것 같습니다).
Minecraft 클라이언트 Linux 사용자는 https://github.com/Admicos/minecraft-wayland를 확인해야 합니다.
Discord, 게임 런처, 브라우저 등 백그라운드의 모든 항목을 닫으세요! Minecraft는 리소스 집약적이며 CPU 인터럽트를 생성하거나 디스크 I/O, RAM 등을 먹는 다른 앱을 좋아하지 않습니다.
Java 18/19에는 일부 모드 비호환성이 있습니다. 일부 모드팩과 함께 작동하는 것으로 알려졌으나 성능상의 이점이 있는지는 확실하지 않습니다.
Java 조정은 서버 성능과 클라이언트 끊김 현상을 개선하지만 평균 클라이언트 FPS를 크게 향상시키지는 않습니다. 이를 위해서는 올바른/최신 그래픽 드라이버와 성능 모드를 실행하는 것이 훨씬 더 중요합니다: https://github.com/NordicGamerFE/usefulmods
이 가이드에서는 Minecraft를 실행할 때 약간의 여유 RAM이 있다고 가정합니다. 설정에 RAM이 제한된 경우 특히 다음 인수를 제거해 보세요. -XX:NmethodSweepActivity=1 -XX:ReservedCodeCacheSize=400M -XX:NonNMethodCodeHeapSize=12M -XX:ProfiledCodeHeapSize=194M -XX:NonProfiledCodeHeapSize=194M
서버를 사용해 보세요. G1GC 인수.
IBM의 OpenJ9는 명성에서 알 수 있듯이 실제로 RAM을 절약하지만 테스트에서 서버 청크 생성 속도가 30% 이상 느립니다. OpenJDK와 경쟁할 수 있는 플래그가 있는 경우 Discord 또는 여기(#9)를 통해 알려주시기 바랍니다.
-XX:+UnlockExperimentalVMOptions -XX:+UnlockDiagnosticVMOptions
사용할 플래그를 더 많이 잠금 해제합니다. 이는 -XX:+PrintFlagsFinal
및 -XX:+JVMCIPrintProperties
플래그와 함께 나열될 수 있습니다. 플래그 덤프를 참조하세요.-XX:G1MixedGCCountTarget=3
: "혼합" gc에서 대상으로 삼을 oldgen gc 블록 수입니다. 이러한 혼합 컬렉션은 훨씬 느리고 Minecraft 클라이언트는 oldgen을 매우 빠르게 생성하지 않으므로 더 짧은 GC 일시 중지를 위해 이 값을 3, 2 또는 1로 낮출 수 있습니다.-XX:+UseNUMA
해당되는 경우 멀티소켓 시스템에 대한 최적화를 활성화합니다. 이것이 Ryzen 또는 Epyc과 같은 MCM CPU에 적용되는지 확실하지 않지만 해당되지 않는 경우 자동으로 비활성화됩니다.-XX:-DontCompileHugeMethods
대규모 메서드를 컴파일 할 수 있습니다 . Modded Minecraft에는 이들 중 일부가 있으며, 우리는 더 높은 백그라운드 컴파일러 CPU 사용량에 관심이 없습니다.-XX:MaxNodeLimit=240000 -XX:NodeLimitFudgeFactor=8000
더 큰 방법의 최적화를 활성화합니다. 참조: https://bugs.java.com/bugdatabase/view_bug.do?bug_id=8058148-XX:ReservedCodeCacheSize=400M -XX:NonNMethodCodeHeapSize=12M -XX:ProfiledCodeHeapSize=194M -XX:NonProfiledCodeHeapSize=194M
컴파일된 코드를 위해 더 많은 공간을 예약합니다. 모든 섹션은 ReservedCodeCacheSize
에 "추가"되어야 합니다. 나는 수정된 Minecraft가 XX:+PrintCodeCache
사용하여 기본 250MB 제한에 도달하는 것을 관찰했지만, 채워지지 않더라도 크기가 커지면 컴파일된 코드의 제거가 덜 공격적이 됩니다.-XX:NmethodSweepActivity=1
(기본값 10)은 "콜드" 코드를 더 오랫동안 캐시에 유지합니다. 코드 캐시가 가득 차면 콜드 코드가 더 적극적으로 제거되므로 코드 캐시를 "채울" 위험도 없습니다.-XX:+UseStringDeduplication
-XX:+UseFastUnorderedTimeStamps
시간을 얻기 위한 시스템 호출을 피합니다. 이로 인한 영향은 시스템마다 다르지만 우리는 로깅 타임스탬프 정확성에 크게 관심을 두지 않습니다.-XX:+UseCriticalJavaThreadPriority
어떤 것도 Minecraft 스레드를 선점해서는 안 됩니다. GC 및 컴파일러 스레드는 기다릴 수 있습니다.-XX:ThreadPriorityPolicy=1
더 넓은 범위의 스레드 우선순위를 사용합니다. Linux에서 작동하려면 sudo가 필요합니다. Graal과 같은 일부 JDK는 기본적으로 이를 활성화하지만 일부는 그렇지 않습니다.-XX:G1SATBBufferEnqueueingThresholdPercent=30 -XX:G1ConcMarkStepDurationMillis=5 -XX:G1ConcRSHotCardLimit=16 -XX:G1ConcRefinementServiceIntervalMillis=150
: G1GC의 동시 수집 스레드를 최적화하며 아직 테스트 중입니다. https://research.spec.org/icpe_proceedings/2014/p111.pdf-XX:G1RSetUpdatingPauseTimePercent=0
: 우리는 이 모든 작업이 일시 중지가 아닌 G1GC 동시 스레드에서 수행되기를 원합니다.-XX:G1HeapWastePercent=18
이 백분율을 초과할 때까지 이전 세대에서 수집하지 마십시오. 이렇게 하면 느린 "혼합" 신세대 GC가 발생하는 것을 방지할 수 있습니다. 이는 Minecraft(충분한 메모리 포함)가 이전 세대를 그렇게 빨리 채우지 않기 때문에 괜찮습니다. 아이디어 출처: https://www.reddit.com/r/Minecraft/comments/k9zb7m/tuning_jvm_gc_for_singleplayer/-XX:GCTimeRatio=99
목표로 CPU 시간의 1%를 가비지 수집에 소비해야 합니다. 기본값은 12인데 너무 낮은 것 같습니다. Java 8의 기본값은 99였습니다.-XX:AllocatePrefetchStyle=3
캐시 라인당 하나의 프리페치 명령을 생성합니다. 더 적극적인 프리페칭은 일반적으로 캐시가 큰 최신 CPU에 유용합니다. ZGC가 깨지는 것 같습니다. 참조: https://github.com/openjdk/jdk/blob/bd90c4cfa63ba2de26f7482ed5d1704f9be9629f/src/hotspot/share/opto/macro.cpp#L1806-Dgraal.LoopRotation=true
기본이 아닌 최적화는 아마도 곧 기본값이 될 것입니다.-Dgraal.TuneInlinerExploration=1
인라인 결정을 내리는 데 더 많은 시간을 투자하세요. Minecraft의 경우 C2 컴파일러가 최대한 느리고 공격적이기를 원합니다.-Dgraal
인수는 기본적으로 활성화되어 있으며 온전성 검사, 디버깅 또는 안전 장치(예를 들어 누군가 다른 플래그를 사용하여 무의식적으로 JVCMI를 비활성화하는 경우)로 사용됩니다.-XX:MaxInlineLevel=15 -XX:MaxVectorSize=32
)는 Java 17 기본값에서 복사되었습니다. +AggressiveOpts
와 같은 다른 것들은 일부 이전 Java 8 빌드에서만 기본값이 아닙니다.-Dgraal.BaseTargetSpending=160
(기본값 120) 및 OpenJDK의 다른 플래그를 통해 더욱 공격적인 인라인 처리. 캐시가 더 큰 CPU는 이로부터 이점을 얻을 수 있습니다.-XX:+AlignVector -XX:+OptoBundling -XX:+OptimizeFill -XX:+AlwaysCompileLoopMethods -XX:+EnableVectorAggressiveReboxing -XX:+EnableVectorSupport -XX:+OptoScheduling -XX:+UseCharacterCompareIntrinsics -XX:+UseCopySignIntrinsic -XX:+UseVectorStubs
-Dgraal.LSRAOptimization=true
-Dgraal.OptWriteMotion=true
및 graal.WriteableCodeCache=true
안정적이지는 않지만 GraalVM 22.3.0에서는 더 안정적일 수 있습니다.G1HeapWastePercent
값.-XX:+PrintFlagsFinal
및 -XX:+JVMCIPrintProperties
플래그를 통해 플래그 설명/기본값을 덤프하는 Java 자체.