意外とJVM引数の話が上がってなかったので、個人的に理解している部分の備忘録みたいにJVM引数の事書いておきます。
大雑把かつ抽象的に書いているので、分かりにくい所が多いと思いますが僕もまだ理解できていない部分があるので許してください。
間違っていたら引用で無知な僕をぶん殴ってください(´・ω・`)
-JVM引数の大雑把な説明-
Javaやプログラミングについてよくご存じの方は見なくても問題ありません。
そもそもJVM引数ってなんぞやって人向けに簡単に説明すると「Minecraftを動かしているJavaを動かす時のオプション」だと考えてもらえればと思います。このオプションを変更することで、Javaが使用できるメモリの量や割り当て・GCの挙動を変更することが出来る様になります。
このオプション自体はバニラやMOD関係なく機能するため、ベストな状態に設定しておく事が好ましい状態です。
しかし、引数の設定を行う時にはある程度プログラムに関する知識を持っていなければいけません。面倒ですね。
なのでここではある程度噛み砕きながら引数の設定について書いておきますが、一部用語が登場します。よければ、Minecraftの理解を深めるために調べながら見てもらえればと思います。
前提として、Minecraftのバージョンは1.18・Java17の使用を想定しています。
環境やバージョンによっては引数が変わる場合があるので気を付けてください。
-JVM引数一覧-
ここでは雑多にJVM引数を書いています。よく使う引数のみ色をつけてあります。
赤はFPS、水色はラグなどの品質向上に役立ちます。
- -Xmx ...使用できるメモリの最大値
数値を上げることでFPSの向上が期待出来る。
しかし、そもそも設定されていたメモリで十分な動作をしているなら上げても変わりはない。
- -Xms ...Minecraftが使用できるメモリの最低値で、実際に使用するメモリの最低値ではない。
メモリの最大値に到達するまで、割り当てられたメモリの何割を使用しながら基本的に動くかを大体決めている所。
この部分を-Xmxと一致させることで「100%メモリを使っていいんだ!」と認識して頑張ってくれるようになる。
- -XX:NewSize ...次の動作に移行する時、割り当てられたメモリからどれぐらい新しくメモリを使用していいかの設定。
この数値が大きければ次の動作への準備が容易になり、パフォーマンスが向上しやすくなる。
でも、この下にある引数をMinecraftではよく見かけるので、目的がない限り使わなくていい。
- -XX:MaxnewSize ...次の動作に移行する時、割り当てられたメモリから最大どこまで新しくメモリを使用していいかの設定。
この数値が大きければ次の動作への準備が容易になり、パフォーマンスが向上しやすくなる。
上との違いは最大値で設定しているため、最小限のメモリで動作する事が少なくなる。(なくなるわけでは無い)
- -XX:MetaspaceSize ...Metaspace領域(スタック領域)をガベージコレクションする基準値。
メモリがずっと持っているデータが基準値に留まり続けていると削除するようになる。動いている場合は削除しない。
基準値が大きいとメモリの使用率は大きくなるが、チャンク読み込み等の更新時にラグが発生しにくくなる。
古いサイトだとPermanent, New, Oldと書かれていたりして、その内のPermanentに該当する。
- -XX:MaxMetaspaceSize ...Metaspace領域(スタック領域)をガベージコレクションする最大値。
メモリがずっと持っているデータが基準値を超えた場合に削除するようになる。
最大値が大きいとメモリの使用率は大きくなるが、チャンク読み込み等の更新時にラグが発生しにくくなる。
しかし、更新する時割り当てているメモリが大きいほど、発生するラグは比例して大きくなる。
この部分を-XX:MetaspaceSizeと同じにすることで、基準値を超えたらGCするようになってくれる。
- -XX:+UseG1GC ...ガベージコレクションをG1 GCに変更する。
マインクラフトの標準GCですが、G1GCの別オプションを使う時に指定しておくと良い時があります。
- -XX:+UseConcMarkSweepGC ...ガベージコレクションをコンカレント方式に変更する。
GCをMinecraftとは別の場所で動かす様にするため、ラグは少なくなりやすいがスペックがまぁまぁ必要になってくる。
- -XX:+UseShenandoahGC ...ガベージコレクションをShenandoah GCに変更する。
凄いやつらしいんですが、詳細に検証したわけではないので分からないです(´・ω・`)
- -XX:ParallelGCThreads ...ガベージコレクションに使用するスレッド数の設定。
CPUにGC処理させる時の使用スレッド数を指定させるオプションで、多いほどFPSが向上しやすい...はずです。
基本的に8が最大なのですが、8以上を指定する際は8+(論理プロセッサ数−8)×(5÷8)で計算してください。
- -XX:ConcGCThreads ...コンカレント・マーク・スイープコレクタに使用するスレッド数の設定。
-XX:ParallelGCThreadsで指定した数以上の数値は設定することが出来ない。
これ以外にもGC関係やそれ以外の引数が大量にありますが....ムズカシイ(´・ω・`)
-JVM引数の設定例-
え、くっそながい不確定な情報よりここ書くだけの方が良くない?
それでは最後に自分のクライアント側で使用している設定だったり、サーバーで使っている設定、一部変えればいい感じになりそうな引数を書いておきます。
まずは自分の設定で、やっていることは
- 12GB分Minecraftに割り当て
- New領域・Metaspace領域を3GBづつ割り当て
- ガベージコレクションにG1 GCを使用し、100msを超えないようにGC
- 12スレッド分をMinecraftに割り当て
コード: 全て選択
-Xmx12G -Xms12G -XX:MaxNewSize=3G -XX:MetaspaceSize=3G -XX:MaxMetaspaceSize=3G
-XX:+UseG1GC -XX:MaxGCPauseMillis=100 -XX:ParallelGCThreads=12 -XX:ConcGCThreads=12
-XX:+DisableExplicitGC
12GBもMinecraftに突っ込んでいるのでFPSが出てくれないと困るのですが、初めの2つの引数を8GBなどに変えてもある程度動きます。また、-XX:MaxNewSize, -XX:MetaspaceSize, -XX:MaxMetaspaceSizeは、割り当てているメモリの1/4位を目安に設定すると上手く動作しやすいです。半分ぐらいのメモリを役割指定して、残り半分は普通に動作させるといった感覚です。
次は、サーバーでのJVM引数
こちらは、自分がサーバー設定する際に参考にさせて頂いたサイトのJVM引数を一部自環境に合わせたモノになります。
- 12GB分サーバーに割り当て
- New領域・Metaspace領域を3GBづつ割り当て
- 12スレッド分をMinecraftに割り当て
- ガベージコレクションをG1 GCを使用し、メモリが占める割合を20%~60%内に留める様指定(試験的オプション)
- 圧縮oopを使い、Metaspace領域内に512Mで専用の領域を生成
コード: 全て選択
-Xmx12G -Xms12G -XX:MetaspaceSize=3G -XX:MaxMetaspaceSize=3G
-XX:ParallelGCThreads=12 -XX:ConcGCThreads=8
-XX:+UnlockExperimentalVMOptions
-XX:+UseG1GC -XX:MaxGCPauseMillis=50 -XX:G1NewSizePercent=20 -XX:G1MaxNewSizePercent=60 -XX:G1HeapRegionSize=32M
-XX:+UseCompressedOops -XX:CompressedClassSpaceSize=512M
最後に個人的オススメなJVM引数
コード: 全て選択
-Xms8G -Xmx8G -XX:MaxNewSize=2G -XX:MetaspaceSize=2G -XX:MaxMetaspaceSize=2G
-XX:+UseG1GC -XX:MaxGCPauseMillis=100 -XX:ParallelGCThreads=12 -XX:ConcGCThreads=12
-XX:+DisableExplicitGC
自分のPCスペックと割り当てたいメモリの量で相談して替えてもらえればある程度動くようになると思います。
CPUのスレッド数が異なる場合はスペックの通りに入力してもらうか、タスクマネージャのパフォーマンス→CPUにある論理プロセッサ数を入力しておけばある程度なんとかなると思います。
最後に、このJVM引数は初めの最大使用可能メモリと最低メモリの設定が一番メインの内容で、それ以外は細かいラグの修正だと思ってください。
Minecraftのアルゴリズムそのものを変更しているわけでは無いので、
劇的にFPSやラグが少なくなる設定ではありません。
ご利用は計画的に。あなたのMinecraftでの生活がより快適になるよう願っております...。
頭半分空っぽにしながら書いたので半分説明間違ってると思います。設定例の所だけ見て使えば大体OKです。
めちゃめちゃに長い事書いてログ流してすみません。