@@ -382,8 +382,9 @@ private InstanceGameSettingsLoadResult loadGameSettingsFile(Path file) {
382382 + file + ", Actual: " + schemaResult .actual ());
383383 case UNEXPECTED_ID -> LOG .warning ("Unexpected instance game settings schema. Expected: "
384384 + GameSettings .Instance .CURRENT_SCHEMA + ", Actual: " + schemaResult .actual ());
385- case UNSUPPORTED_MAJOR , READ_ONLY_PRESERVE_SCHEMA -> LOG .warning ("Unsupported instance game settings schema. Expected: "
386- + GameSettings .Instance .CURRENT_SCHEMA + ", Actual: " + schemaResult .actual ());
385+ case UNSUPPORTED_MAJOR , READ_ONLY_PRESERVE_SCHEMA ->
386+ LOG .warning ("Unsupported instance game settings schema. Expected: "
387+ + GameSettings .Instance .CURRENT_SCHEMA + ", Actual: " + schemaResult .actual ());
387388 case READ_WRITE , READ_WRITE_PRESERVE_SCHEMA -> {
388389 }
389390 }
@@ -684,7 +685,7 @@ private void saveGameSettingsSync(String id) throws IOException {
684685
685686 /// Result of loading an instance-specific game settings file.
686687 ///
687- /// @param setting the loaded instance settings, or `null` when unavailable
688+ /// @param setting the loaded instance settings, or `null` when unavailable
688689 /// @param allowSave whether the file may be overwritten
689690 private record InstanceGameSettingsLoadResult (
690691 @ Nullable GameSettings .Instance setting ,
@@ -694,26 +695,31 @@ private record InstanceGameSettingsLoadResult(
694695 public LaunchOptions .Builder getLaunchOptions (String version , JavaRuntime javaVersion , Path gameDir , List <String > javaAgents , List <String > javaArguments , boolean makeLaunchScript ) {
695696 GameSettings .Effective vs = getEffectiveGameSettings (version );
696697 boolean noJVMOptions = vs .getInheritable (GameSettings ::noJVMOptionsProperty );
697- boolean autoMemory = vs .get (GameSettings ::autoMemoryProperty );
698+ boolean autoMemory = vs .getInheritable (GameSettings ::autoMemoryProperty );
698699 GameVersionNumber gameVersionNumber = GameVersionNumber .asGameVersion (getGameVersion (version ));
699700
701+ @ Nullable Integer maxMemory ;
702+ if (autoMemory ) {
703+ maxMemory = noJVMOptions
704+ ? null
705+ : Math .toIntExact (getAutoAllocatedMemory (SystemInfo .getPhysicalMemoryStatus ().available ()) / 1024L / 1024L );
706+ } else {
707+ maxMemory = vs .getMaxMemory ();
708+ }
709+
700710 LaunchOptions .Builder builder = new LaunchOptions .Builder ()
701711 .setGameDir (gameDir )
702712 .setJava (javaVersion )
703713 .setVersionType (Metadata .TITLE )
704714 .setVersionName (version )
705715 .setProfileName (Metadata .TITLE )
706- .setGameArguments (StringUtils .tokenize (vs .get (GameSettings ::gameArgumentsProperty )))
707- .setOverrideJavaArguments (StringUtils .tokenize (vs .get (GameSettings ::jvmOptionsProperty )))
708- .setMaxMemory (noJVMOptions && autoMemory ? null : (int ) (getAllocatedMemory (
709- vs .getMaxMemory () * 1024L * 1024L ,
710- SystemInfo .getPhysicalMemoryStatus ().available (),
711- autoMemory
712- ) / 1024 / 1024 ))
713- .setMinMemory (vs .get (GameSettings ::minMemoryProperty ))
714- .setMetaspace (Lang .toIntOrNull (vs .get (GameSettings ::permSizeProperty )))
716+ .setGameArguments (StringUtils .tokenize (vs .getInheritable (GameSettings ::gameArgumentsProperty )))
717+ .setOverrideJavaArguments (StringUtils .tokenize (vs .getInheritable (GameSettings ::jvmOptionsProperty )))
718+ .setMaxMemory (maxMemory )
719+ .setMinMemory (vs .getInheritable (GameSettings ::minMemoryProperty ))
720+ .setMetaspace (Lang .toIntOrNull (vs .getInheritable (GameSettings ::permSizeProperty )))
715721 .setEnvironmentVariables (
716- Lang .mapOf (StringUtils .tokenize (vs .get (GameSettings ::environmentVariablesProperty ))
722+ Lang .mapOf (StringUtils .tokenize (vs .getInheritable (GameSettings ::environmentVariablesProperty ))
717723 .stream ()
718724 .map (it -> {
719725 int idx = it .indexOf ('=' );
@@ -731,16 +737,16 @@ public LaunchOptions.Builder getLaunchOptions(String version, JavaRuntime javaVe
731737 .setPostExitCommand (vs .getInheritable (GameSettings ::postExitCommandProperty ))
732738 .setNoGeneratedJVMArgs (noJVMOptions )
733739 .setNoGeneratedOptimizingJVMArgs (vs .getInheritable (GameSettings ::noOptimizingJVMOptionsProperty ))
734- .setUseCustomNatives (vs .get (GameSettings ::useCustomNativesProperty ))
735- .setNativesDir (vs .get (GameSettings ::nativesDirectoryProperty ))
740+ .setUseCustomNatives (vs .getInheritable (GameSettings ::useCustomNativesProperty ))
741+ .setNativesDir (vs .getInheritable (GameSettings ::nativesDirectoryProperty ))
736742 .setProcessPriority (vs .getInheritable (GameSettings ::processPriorityProperty ))
737743 .setGraphicsBackend (vs .getInheritable (GameSettings ::graphicsBackendProperty ))
738744 .setRenderer (vs .getRenderer (gameVersionNumber ))
739745 .setEnableDebugLogOutput (vs .getInheritable (GameSettings ::enableDebugLogOutputProperty ))
740746 .setAllowAutoAgent (vs .getInheritable (GameSettings ::allowAutoAgentProperty ))
741747 .setDisableAutoGameOptions (vs .getInheritable (GameSettings ::disableAutoGameOptionsProperty ))
742- .setUseNativeGLFW (vs .get (GameSettings ::useNativeGLFWProperty ))
743- .setUseNativeOpenAL (vs .get (GameSettings ::useNativeOpenALProperty ))
748+ .setUseNativeGLFW (vs .getInheritable (GameSettings ::useNativeGLFWProperty ))
749+ .setUseNativeOpenAL (vs .getInheritable (GameSettings ::useNativeOpenALProperty ))
744750 .setDaemon (!makeLaunchScript && vs .getInheritable (GameSettings ::launcherVisibilityProperty ).isDaemon ())
745751 .setJavaAgents (javaAgents )
746752 .setJavaArguments (javaArguments );
@@ -838,22 +844,21 @@ public boolean versionIdConflicts(String id) {
838844 }
839845 }
840846
841- public static long getAllocatedMemory (long minimum , long available , boolean auto ) {
842- if (auto ) {
843- available -= 512 * 1024 * 1024 ; // Reserve 512 MiB memory for off-heap memory and HMCL itself
844- if (available <= 0 ) {
845- return minimum ;
846- }
847+ public static long getAutoAllocatedMemory (long available ) {
848+ long usable = available - 512 * 1024 * 1024 ; // Reserve 512 MiB memory for off-heap memory and HMCL itself
849+ if (usable <= 0 ) {
850+ return available ;
851+ }
847852
848- final long threshold = 8L * 1024 * 1024 * 1024 ; // 8 GiB
849- final long suggested = Math .min (available <= threshold
850- ? (long ) (available * 0.8 )
851- : (long ) (threshold * 0.8 + (available - threshold ) * 0.2 ),
853+ final long threshold = 8L * 1024 * 1024 * 1024 ; // 8 GiB
854+ final long suggested ;
855+ if (usable <= threshold )
856+ suggested = (long ) (usable * 0.8 );
857+ else
858+ suggested = Math .min (
859+ (long ) (threshold * 0.8 + (usable - threshold ) * 0.2 ),
852860 16L * 1024 * 1024 * 1024 );
853- return Math .max (minimum , suggested );
854- } else {
855- return minimum ;
856- }
861+ return suggested ;
857862 }
858863
859864 public static ProxyOption getProxyOption () {
0 commit comments