HMCL-dev / HMCL

A Minecraft Launcher which is multi-functional, cross-platform and popular
https://hmcl.huangyuhui.net
GNU General Public License v3.0
6.89k stars 675 forks source link

JVM 参数对于 HMCL 内存占用有极其巨大的影响 #1897

Closed Glavo closed 1 week ago

Glavo commented 1 year ago

仅打开 HMCL 的情况下,使用 -client 启用 Client VM,相比默认的 Server VM 可以解决约 40MiB 的内存占用:

image

差异更为巨大的是,Client VM 在使用过程中对内存的控制要远远好于 Server VM。比如,HMCL 在下载页浏览相同的内容后,Server VM 很容易就超过 600MiB 的内存占用,而 Client VM 的内存占用非常平缓,基本能控制在 160MiB 上下:

image

这对于内存较小的设备来说,无疑能为其他程序让出更大的内存空间。

但是,Client VM 使用 Serial GC,不进行分层编译等特性,会导致 VM 性能下降,可能会影响 HMCL 的流畅度。

而且很多 Java 分发都不提供 Client VM,目前我看到默认提供 Client VM 分发的只有 LibericaJDK,大部分分发都直接忽略 -client 参数。

但无论如何,Client VM 与 Server VM 的差异说明了 HMCL 资源占用问题很大一部分并不是出在 HMCL 本身,通过调整 JVM 参数或许能够大幅降低 HMCL 的资源占用。

Glavo commented 1 year ago

我给 HMCL 打了 GC 日志进行分析。

这是使用 G1 时的 young gen 占用情况:

image

可以看出来,G1 习惯于将内存占用拉到很高的水平(350MiB+)后再将内存占用压下来,导致 HMCL 内存占用长期处于较高的水平。

从上到下,分别是使用 Shenandoah GC、G1 GC 和 ZGC 的 HMCL,在同样场景下的内存占用:

image

gcnyin commented 1 year ago

用zgc的话,把-XX:ZUncommitDelay设短点比较好,默认5分钟太长了,感觉是给服务器用的。

gcnyin commented 1 year ago
1

jdk: Corretto-19.0.1.10.1

device: MacBook m1 pro

测试方式就是你在群里说的在下载页面上下拖动。

我已经给zgc开了-XX:ZUncommitDelay=10

附上两个gc log

g1gc.log.zip

zgc.log.zip

Anivie commented 1 year ago

能否尝试为G1GC提供参数以提高它的回收阈值?