6g3y 发表于 2023-5-5 18:46:30

如何通过java1.8及其以上设置大内存的同时减少GC所带来的卡顿



众所周知由于java的特性,如果给内存内存一大就很卡,但是我又想开大内存放一堆mod
其次是如果内存小,也会经常gc导致卡顿,那么有什么办法可以接近卡顿问题的情况下进行优化呢?

vmparams:

-XX:+UseG1GC -XX:MaxGCPauseMillis=30-Xms12g -Xmx12g



-XX:+UseG1GC #使用G1 gc
-XX:MaxGCPauseMillis=30#期望卡顿时间为30ms

-Xms12g -Xmx12g#开12g内存

特别注意的是开启G1后 电脑会从单核转向多核运行,并行的清理垃圾
从耗电角度来说会多一点,但是从游戏角度来说,将单核引向多核,可感知的卡顿会提升很多



以下是GPT的介绍


Java中的G1垃圾回收器是一种面向服务端应用程序的垃圾回收器,它的主要优点包括:

1. 分代收集:G1垃圾回收器采用分代收集的方式,在保证应用程序吞吐量的同时,有效地降低了回收器的停顿时间。

2. 内存占用:G1垃圾回收器可以有效地控制内存占用,避免应用程序因为占用过多的内存而出现问题。

3. 可预测性:G1垃圾回收器可以通过控制最大垃圾回收停顿时间,提高应用程序的可预测性和稳定性。

MaxGCPauseMillis是G1垃圾回收器中一个重要的参数,它的具体含义是最大垃圾回收停顿时间,即G1垃圾回收器在执行垃圾回收操作时,可以允许的最大停顿时间,单位是毫秒。该参数的默认值是200毫秒。

MaxGCPauseMillis参数的背后原理是G1垃圾回收器使用一种叫做“Region”的内存布局方式,将整个堆内存分成多个大小相等的区域,每个区域都有一个特定的垃圾回收目标,并且在执行垃圾回收时,只回收那些不再使用的区域,从而避免了全局性的垃圾回收,减少了垃圾回收的停顿时间。MaxGCPauseMillis参数的设置可以帮助开发人员控制垃圾回收器的停顿时间,从而提高应用程序的性能和稳定性。但需要注意的是,设置过小的最大垃圾回收停顿时间可能会导致频繁的垃圾回收,从而降低应用程序的性能。





topgamer 发表于 2023-5-5 20:42:49

分12G这么大?
等大佬试过再说了

6g3y 发表于 2023-5-5 23:46:12

topgamer 发表于 2023-5-5 20:42
分12G这么大?
等大佬试过再说了

我都玩3天了,根本没有卡顿

6g3y 发表于 2023-5-5 23:49:47

特别注意要java1.8 及其以上 不是1.8的不会起作用

rarara 发表于 2023-5-6 03:13:00

这样设置后我调的是6g内存,但是进游戏会占用8g不知道为什么

ALSSS 发表于 2023-5-6 14:53:35

那么应该怎样把这两个参数添加上去呢,我试着直接添加,但是打不开程序了

宫水秋月 发表于 2023-5-6 16:51:00

请问一下有具体的使用方法吗?

蕾丝圣斗士 发表于 2023-5-6 19:49:03

细说怎么搞?要不把你的vmparams文件发一下{:5_121:}

6g3y 发表于 2023-5-6 20:47:10

蕾丝圣斗士 发表于 2023-5-6 19:49
细说怎么搞?要不把你的vmparams文件发一下

java.exe -XX:CompilerThreadPriority=1 -XX:+UseG1GC -XX:MaxGCPauseMillis=30 -XX:+CompilerThreadHintNoPreempt -Djava.library.path=native\\windows -Xms12g -Xmx12g -Xss2048k -classpath janino.jar;commons-compiler.jar;commons-compiler-jdk.jar;starfarer.api.jar;starfarer_obf.jar;jogg-0.0.7.jar;jorbis-0.0.15.jar;json.jar;lwjgl.jar;jinput.jar;log4j-1.2.9.jar;lwjgl_util.jar;fs.sound_obf.jar;fs.common_obf.jar;xstream-1.4.10.jar -Dcom.fs.starfarer.settings.paths.saves=..\\saves -Dcom.fs.starfarer.settings.paths.screenshots=..\\screenshots -Dcom.fs.starfarer.settings.paths.mods=..\\mods -Dcom.fs.starfarer.settings.paths.logs=. com.fs.starfarer.StarfarerLauncher

6g3y 发表于 2023-5-6 20:48:01

ALSSS 发表于 2023-5-6 14:53
那么应该怎样把这两个参数添加上去呢,我试着直接添加,但是打不开程序了 ...

你是java1.8吗 没遇到过打不开的情况

6g3y 发表于 2023-5-6 20:49:50

PS D:\games\Starsector0951\jre\bin> ./java.exe -version
openjdk version "1.8.0_275"
OpenJDK Runtime Environment (AdoptOpenJDK)(build 1.8.0_275-b01)
OpenJDK 64-Bit Server VM (AdoptOpenJDK)(build 25.275-b01, mixed mode)

宫水秋月 发表于 2023-5-6 21:08:57

6g3y 发表于 2023-5-6 20:47
java.exe -XX:CompilerThreadPriority=1 -XX:+UseG1GC -XX:MaxGCPauseMillis=30 -XX:+CompilerThreadHint ...

感谢告知,现已实测可以运行。

翔子 发表于 2023-5-9 08:17:36

这个和指南贴更新java8会有冲突吗?
和指南贴修改vmparams的方法也不一样,那个用了其他代码?好像是存档不卡顿的方法,可以一起用吗?

将军战列舰 发表于 2023-5-9 09:43:07

6g3y 发表于 2023-5-5 23:46
我都玩3天了,根本没有卡顿

大佬!发个教程或者视频!大佬,我想学!

hywht 发表于 2023-5-9 21:49:56

6g3y 发表于 2023-5-6 20:49
PS D:\games\Starsector0951\jre\bin> ./java.exe -version
openjdk version "1.8.0_275"
OpenJDK Runtime...

大佬可以加你qq详细问你嘛?

雪夜晴岚 发表于 2023-5-14 10:07:35

大佬你好,请问一下除开修改vmparams文件以外,是否需要更换游戏自带的jre

比那名居天子 发表于 2023-6-9 15:42:54

大佬nb,终于不用被内存溢出折磨了,感谢万分!{:tieba_43:}

kinshin007 发表于 2023-6-11 19:24:34

6g3y 发表于 2023-5-6 20:47
java.exe -XX:CompilerThreadPriority=1 -XX:+UseG1GC -XX:MaxGCPauseMillis=30 -XX:+CompilerThreadHint ...

感谢大佬!!!!!
战斗完全不卡顿了,满60帧运行,不过我看了下内存占用一直都只有400多m,大概不需要开到8g以上的内存

kinshin007 发表于 2023-6-13 00:44:45

呃,运行一段时间后反而比原来的设置更卡了,原来的卡是帧数低但稳定,现在的方案是一顿一顿,更难受
而且还出现过闪退报错,space gem什么的

黑梦777 发表于 2023-6-24 23:30:04

本帖最后由 黑梦777 于 2023-6-25 00:14 编辑

@wuyi 大佬给出了另外一个vmparams解决方案,那个方法体感卡顿比该方法还小,但好像还是单核?您这个方法明显降低了我的电脑负担,大规模战斗时完全不卡顿了,不过在保存等操作时还会明显卡死一瞬,请问能否结合一下两方之长?{:5_124:}

大威天龙z 发表于 2023-7-12 08:21:03

试试~谢谢

stylkkk 发表于 2023-7-19 04:38:21

我的是1.8 282版本 用不了这个-XX:+UseG1GC吗?我的是1.8 282版本 用了这个参数就启动不了游戏 打开没反应

Cirno 发表于 2023-8-6 16:53:40

太感谢了,帧数直接翻倍稳定60

cai2928 发表于 2023-8-6 18:24:49

nb{:tieba_43:}

0.91 发表于 2023-8-16 17:25:52

打不开游戏的 加一行-Xverify:none 代码,这个是限制指定JRE版本解除的我加了就能打开了 0.96 RC10

死怨终莺言怨歌 发表于 2023-8-19 22:24:08

66666 之前游戏打开一会就内存爆炸 现在 不会了 大佬666

GTM99 发表于 2023-8-20 23:22:39

1.8.0_382用这个参数会直接打不开启动器

GTM99 发表于 2023-8-20 23:24:51

0.91 发表于 2023-8-16 17:25
打不开游戏的 加一行-Xverify:none 代码,这个是限制指定JRE版本解除的我加了就能打开了 0.96 RC10 ...

顶一下打不开的看这楼!!

102HLZ 发表于 2023-8-21 12:33:30

1.8.0_192添加参数后打不开启动器,不知道是不是用了之前wuyi佬的方法的原因

magnus 发表于 2023-9-3 20:23:06

275一样,加了也用不了

lengye1012 发表于 2023-9-13 22:06:14

我算是看出来了,玩这游戏 不懂个代码啥的玩不了,我硬是没看懂上面说了个啥,意思是复制楼主那一段代码加进vmparams里?各种闪退的想说“***,退钱”{:tieba_12:}

农工育三业 发表于 2023-9-14 11:32:53

这个配置需要更强的中央处理器cpu{:tieba_12:}






week77 发表于 2023-9-26 18:43:28

翔子 发表于 2023-5-9 08:17
这个和指南贴更新java8会有冲突吗?
和指南贴修改vmparams的方法也不一样,那个用了其他代码?好像是存档不 ...

垃圾处理方式不同,指南贴用的是CMS GC,这个用的是G1 GC

opopooc 发表于 2023-10-19 17:09:20

6g3y 发表于 2023-5-6 20:47
java.exe -XX:CompilerThreadPriority=1 -XX:+UseG1GC -XX:MaxGCPauseMillis=30 -XX:+CompilerThreadHint ...

大佬强啊,好用的一批{:5_134:}

疑似良民丿张 发表于 2023-11-10 23:40:35

大地图卡顿有办法解决不,战斗稳定60帧,但是大地图只有15帧,emmm

q71445357 发表于 2023-11-14 11:06:34

本帖最后由 q71445357 于 2023-11-14 11:08 编辑

GTM99 发表于 2023-8-20 23:24
顶一下打不开的看这楼!!
能帮忙看下加的位置对吗,不懂代码,换了电脑卡的不要不要的,战斗大地图15-20帧,还不时卡顿
java.exe -XX:CompilerThreadPriority=1 -XX:+UseG1GC -XX:MaxGCPauseMillis=30 -XX:+CompilerThreadHintNoPreempt -Djava.library.path=native\\windows -Xverify:none -Xms12g -Xmx12g -Xss2048k -classpath janino.jar;commons-compiler.jar;commons-compiler-jdk.jar;starfarer.api.jar;starfarer_obf.jar;jogg-0.0.7.jar;jorbis-0.0.15.jar;json.jar;lwjgl.jar;jinput.jar;log4j-1.2.9.jar;lwjgl_util.jar;fs.sound_obf.jar;fs.common_obf.jar;xstream-1.4.10.jar -Dcom.fs.starfarer.settings.paths.saves=..\\saves -Dcom.fs.starfarer.settings.paths.screenshots=..\\screenshots -Dcom.fs.starfarer.settings.paths.mods=..\\mods -Dcom.fs.starfarer.settings.paths.logs=. com.fs.starfarer.StarfarerLauncher

远山 发表于 2024-1-8 11:20:28

6g3y 发表于 2023-5-6 20:49
PS D:\games\Starsector0951\jre\bin> ./java.exe -version
openjdk version "1.8.0_275"
OpenJDK Runtime...

请问这段是什么意思啊?
java8是不是就是jdk1.8.0?
我换了vmparams内容直接打不开了。。。

狂热牛皮癣 发表于 2024-1-8 19:10:25

本帖最后由 狂热牛皮癣 于 2024-1-8 19:12 编辑

远山 发表于 2024-1-8 11:20
请问这段是什么意思啊?
java8是不是就是jdk1.8.0?
我换了vmparams内容直接打不开了。。。 ...
这是275版本的,像楼上说的添加-Xverify:none可以解除版本限制
java.exe -Xverify:none -XX:CompilerThreadPriority=1 -XX:+UseG1GC -XX:MaxGCPauseMillis=30 -XX:+CompilerThreadHintNoPreempt -Djava.library.path=native\\windows -Xms12g -Xmx12g -Xss2048k -classpath janino.jar;commons-compiler.jar;commons-compiler-jdk.jar;starfarer.api.jar;starfarer_obf.jar;jogg-0.0.7.jar;jorbis-0.0.15.jar;json.jar;lwjgl.jar;jinput.jar;log4j-1.2.9.jar;lwjgl_util.jar;fs.sound_obf.jar;fs.common_obf.jar;xstream-1.4.10.jar -Dcom.fs.starfarer.settings.paths.saves=..\\saves -Dcom.fs.starfarer.settings.paths.screenshots=..\\screenshots -Dcom.fs.starfarer.settings.paths.mods=..\\mods -Dcom.fs.starfarer.settings.paths.logs=. com.fs.starfarer.StarfarerLauncher
页: [1]
查看完整版本: 如何通过java1.8及其以上设置大内存的同时减少GC所带来的卡顿