支持禁止生成 JVM 优化参数 (#4507)

This commit is contained in:
Glavo
2025-09-18 20:04:25 +08:00
committed by GitHub
parent 8bd104c207
commit a24fea4a95
8 changed files with 80 additions and 40 deletions

View File

@@ -55,6 +55,7 @@ public class LaunchOptions implements Serializable {
private String proxyUser;
private String proxyPass;
private boolean noGeneratedJVMArgs;
private boolean noGeneratedOptimizingJVMArgs;
private String preLaunchCommand;
private String postExitCommand;
private NativesDirectoryType nativesDirType;
@@ -226,6 +227,13 @@ public class LaunchOptions implements Serializable {
return noGeneratedJVMArgs;
}
/**
* Prevent game launcher from generating optimizing JVM arguments.
*/
public boolean isNoGeneratedOptimizingJVMArgs() {
return noGeneratedOptimizingJVMArgs;
}
/**
* Command called before game launches.
*/
@@ -281,7 +289,7 @@ public class LaunchOptions implements Serializable {
return daemon;
}
public static class Builder {
public static final class Builder {
private final LaunchOptions options = new LaunchOptions();
@@ -439,6 +447,11 @@ public class LaunchOptions implements Serializable {
return this;
}
public Builder setNoGeneratedOptimizingJVMArgs(boolean noGeneratedOptimizingJVMArgs) {
options.noGeneratedOptimizingJVMArgs = noGeneratedOptimizingJVMArgs;
return this;
}
public Builder setPreLaunchCommand(String preLaunchCommand) {
options.preLaunchCommand = preLaunchCommand;
return this;

View File

@@ -193,50 +193,52 @@ public class DefaultLauncher extends Launcher {
final int javaVersion = options.getJava().getParsedVersion();
final boolean is64bit = options.getJava().getBits() == Bits.BIT_64;
res.addUnstableDefault("UnlockExperimentalVMOptions", true);
res.addUnstableDefault("UnlockDiagnosticVMOptions", true);
if (!options.isNoGeneratedOptimizingJVMArgs()) {
res.addUnstableDefault("UnlockExperimentalVMOptions", true);
res.addUnstableDefault("UnlockDiagnosticVMOptions", true);
// Using G1GC with its settings by default
if (javaVersion >= 8
&& res.noneMatch(arg -> "-XX:-UseG1GC".equals(arg) || (arg.startsWith("-XX:+Use") && arg.endsWith("GC")))) {
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("OmitStackTraceInFastThrow", false);
// JIT Options
if (javaVersion <= 8) {
res.addUnstableDefault("MaxInlineLevel", "15");
}
if (is64bit && SystemInfo.getTotalMemorySize() > 4L * 1024 * 1024 * 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");
// Using G1GC with its settings by default
if (javaVersion >= 8
&& res.noneMatch(arg -> "-XX:-UseG1GC".equals(arg) || (arg.startsWith("-XX:+Use") && arg.endsWith("GC")))) {
res.addUnstableDefault("UseG1GC", true);
res.addUnstableDefault("G1MixedGCCountTarget", "5");
res.addUnstableDefault("G1NewSizePercent", "20");
res.addUnstableDefault("G1ReservePercent", "20");
res.addUnstableDefault("MaxGCPauseMillis", "50");
res.addUnstableDefault("G1HeapRegionSize", "32m");
}
if (javaVersion >= 8) {
res.addUnstableDefault("NmethodSweepActivity", "1");
res.addUnstableDefault("OmitStackTraceInFastThrow", false);
// JIT Options
if (javaVersion <= 8) {
res.addUnstableDefault("MaxInlineLevel", "15");
}
}
if (is64bit && SystemInfo.getTotalMemorySize() > 4L * 1024 * 1024 * 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 (is64bit && javaVersion == 25) {
res.addUnstableDefault("UseCompactObjectHeaders", true);
}
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 (!is64bit) {
res.addDefault("-Xss", "1m");
if (is64bit && javaVersion == 25) {
res.addUnstableDefault("UseCompactObjectHeaders", true);
}
// 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 (!is64bit) {
res.addDefault("-Xss", "1m");
}
}
if (javaVersion == 16)