From 73fb8bda1034ff6c31b67ca405bd0cce1849a7fc Mon Sep 17 00:00:00 2001 From: Glavo Date: Tue, 15 Apr 2025 03:46:33 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E9=BB=98=E8=AE=A4=20JVM=20?= =?UTF-8?q?=E5=8F=82=E6=95=B0=20(#3824)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hmcl/game/HMCLGameRepository.java | 6 +-- .../hmcl/launch/DefaultLauncher.java | 39 ++++++++++++++++--- 2 files changed, 36 insertions(+), 9 deletions(-) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLGameRepository.java b/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLGameRepository.java index b0bfb3d5c..423cc45d2 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLGameRepository.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLGameRepository.java @@ -509,16 +509,16 @@ public class HMCLGameRepository extends DefaultGameRepository { public static long getAllocatedMemory(long minimum, long available, boolean auto) { if (auto) { - available -= 384 * 1024 * 1024; // Reserve 384MiB memory for off-heap memory and HMCL itself + available -= 512 * 1024 * 1024; // Reserve 512 MiB memory for off-heap memory and HMCL itself if (available <= 0) { return minimum; } - final long threshold = 8L * 1024 * 1024 * 1024; + final long threshold = 8L * 1024 * 1024 * 1024; // 8 GiB final long suggested = Math.min(available <= threshold ? (long) (available * 0.8) : (long) (threshold * 0.8 + (available - threshold) * 0.2), - 16384L * 1024 * 1024); + 16L * 1024 * 1024 * 1024); return Math.max(minimum, suggested); } else { return minimum; diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/launch/DefaultLauncher.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/launch/DefaultLauncher.java index 188347f40..22e42e3db 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/launch/DefaultLauncher.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/launch/DefaultLauncher.java @@ -189,30 +189,57 @@ public class DefaultLauncher extends Launcher { if (OperatingSystem.CURRENT_OS != OperatingSystem.WINDOWS) res.addDefault("-Duser.home=", options.getGameDir().getParent()); + final int javaVersion = options.getJava().getParsedVersion(); + final boolean is64bit = options.getJava().getBits() == Bits.BIT_64; + + res.addUnstableDefault("UnlockExperimentalVMOptions", true); + res.addUnstableDefault("UnlockDiagnosticVMOptions", true); + // Using G1GC with its settings by default - if (options.getJava().getParsedVersion() >= 8 + if (javaVersion >= 8 && res.noneMatch(arg -> "-XX:-UseG1GC".equals(arg) || (arg.startsWith("-XX:+Use") && arg.endsWith("GC")))) { - res.addUnstableDefault("UnlockExperimentalVMOptions", true); res.addUnstableDefault("UseG1GC", true); + res.addUnstableDefault("G1MixedGCCountTarget", "5"); res.addUnstableDefault("G1NewSizePercent", "20"); res.addUnstableDefault("G1ReservePercent", "20"); res.addUnstableDefault("MaxGCPauseMillis", "50"); res.addUnstableDefault("G1HeapRegionSize", "32m"); } - res.addUnstableDefault("UseAdaptiveSizePolicy", false); res.addUnstableDefault("OmitStackTraceInFastThrow", false); - res.addUnstableDefault("DontCompileHugeMethods", false); + + // JIT Options + if (javaVersion <= 8) { + res.addUnstableDefault("MaxInlineLevel", "15"); + } + if (is64bit && OperatingSystem.TOTAL_MEMORY > 4 * 1024) { + res.addUnstableDefault("DontCompileHugeMethods", false); + res.addUnstableDefault("MaxNodeLimit", "240000"); + res.addUnstableDefault("NodeLimitFudgeFactor", "8000"); + res.addUnstableDefault("TieredCompileTaskTimeout", "10000"); + res.addUnstableDefault("ReservedCodeCacheSize", "400M"); + if (javaVersion >= 9) { + res.addUnstableDefault("NonNMethodCodeHeapSize", "12M"); + res.addUnstableDefault("ProfiledCodeHeapSize", "194M"); + } + + if (javaVersion >= 8) { + res.addUnstableDefault("NmethodSweepActivity", "1"); + } + } // As 32-bit JVM allocate 320KB for stack by default rather than 64-bit version allocating 1MB, // causing Minecraft 1.13 crashed accounting for java.lang.StackOverflowError. - if (options.getJava().getBits() == Bits.BIT_32) { + if (!is64bit) { res.addDefault("-Xss", "1m"); } - if (options.getJava().getParsedVersion() == 16) + if (javaVersion == 16) res.addDefault("--illegal-access=", "permit"); + if (javaVersion == 24 || javaVersion == 25) + res.addDefault("--sun-misc-unsafe-memory-access=", "allow"); + res.addDefault("-Dfml.ignoreInvalidMinecraftCertificates=", "true"); res.addDefault("-Dfml.ignorePatchDiscrepancies=", "true"); }