閉じる
閉じる
前の放送でマイクラのメモリーが足りないとか言っていたのでメモ代わりも含めて紹介
起動しないとかエラーログ的にメモリかどうか聞きたい場合はコメントにでも
2018/03/26:一部修正と加筆
2018/06/04:加筆
2018/07/04:加筆と修正
2019/01/10:OpenJDKとJava8のサポート終了について加筆
この記事はJava8及びOpenJDK8の最新版、もしくは非公式最新版を目標として書いてます(Java9はまだMODとかで使えないからね・・・)Javaは脆弱性が多いのでマイクラの古いバージョンでMODを使用しない限り最新版利用を推奨します。
2019年1月OracleのJava8(公式)の商用サポートが終了します。JDKを使っている方はセキュリティ的に非常に危険のためOpenJDKに乗り換えることを推奨します
わからないことが有ったらコメントで聞いてください
JDK 8(商用)は2019年1月のパッチ配布後サポートが終了する予定です。(OpenJDK8も同じくらいにサポート終了、個人向けのJavaは2025年までらしい)
1.7.10のMODとかは基本的にJava8を使ってるので深刻な問題です。なので非公式のOpenJDKに乗り換えることを推奨します
「OpenJDKって何?」と思う方も多いと思うのですが詳しい説明は省いて、ざっくり説明するとOracle社のJavaをフリーかつオープンに実装したものです。サン・マイクロシステムズが保守しています(OpenJDK8(Java8のOpenJDK)のサポート終わるんですが)。その中でサポートが終了するOpenJDK8(OpenJDK7とか6も)を別の大企業が個別にサポートすると発表しています。古いバージョンのMinecraftを使ってMODを入れるとかなら、今後はそれを使うことを推奨します。(以下に例を示します、無料でWindowsも使えるやつを選んでます)
・Amazon Corretto(サポート:Amazon 2023年6月まで) ※まだベータ版?
・OpenJDK(Red Hat)(サポート:Red Hat 2023年6月まで) ※Windowsで使うにはユーザー登録が必要、そのかわり新しいGCが使える
互換性は一部を除いて(Java FXとか)あるみたいです。私が運営しているMod入りクリエワールドサーバーを12月からOpenJDK(Red Hat)で動かしてますが特に問題等は無いため大丈夫だと信じたい(私のサーバーも来週OpenJDK(Red Hat)へ全面移行します)
1.Minecraftの処理について
MinecraftはJavaの仮想マシン(JVM)を作ってその上でゲームを動かします
なのでJVMのオプション(以下JVMオプション)を指定することにより、ある程度性能向上が見込めます
基本的にメモリーの設定です、よくメモリーの割当を増やすとかもこれですね
2.「起動オプション」をクリックします
3.その中の「高度な設定を有効にする」にオンにします
4.JVMオプションを指定したいプロファイルを選択
5.JVMの引数を有効にし、右の空白にオプションを入力して保存
6.Minecraftが無事起動すれば指定成功
次からオプションについて説明していきます
3.JVMのオプションについて(一部)
専門用語は各自ググってください 数字の後のMはメガバイト、Gはギガバイトです
メモリーは自身の環境に合わせて変更してください、わからなければコメントをください
・JVMのメイン処理領域(ヒープ領域※New領域+Old領域)の設定
指定方法:-Xmx -Xms
Xmsで初期値、Xmxで最大値指定します。初期値と最大値は一致推奨です。
例:-Xmx4G -Xms4G
・MODのクラスなどの情報を格納する領域(Metaspace領域)の設定(Java8以降)
指定方法:-XX:MetaspaceSize -XX:MaxMetaspaceSize
MODを大量導入、もしくは重量級のMODを導入する際にはこの値を変更しないと
重たくなったりします
-XX:MetaspaceSizeで初期値、-XX:MaxMetaspaceSizeで最大値を指定します。
初期値と最大値は一致推奨です。多くても1Gくらいしか消費しません
例:-XX:MetaspaceSize=512M -XX:MaxMetaspaceSize=512M
・メモリー管理方法の指定
上記のXmxやXmsで確保できるメモリーの量に合わせてください
両方書いてあると両方共無効になったり起動しなくなるので片方は消しておいてください
・Forgeインストール時と推奨設定はConcurrent Mark-Sweep Collector方式です
大量のメモリを消費する設定の場合、こっちの方がG1GCよりちょっと早かった
指定方法:XX:+UseConcMarkSweepGC -XX:+CMSIncrementalMode
一度に全てのメモリを掃除せず、細かい単位でメモリーを掃除しJVM内のメモリー
空き領域を増やす設定です。
・ある程度メモリーが確保できる場合や細かいメモリ設定が面倒くさい場合は
G1 GC方式を使いましょう
指定方法:-XX:+UseG1GC
JVM内のメモリーを細かく細分化し各種領域を割り当てて、JVM起動中に足りなかった
りした場合、各種領域の割当を自動で変更してくれる方式です
・G1GCで設定するといい項目
・GC時に停止する最大ミリ秒を指定する(デフォルト値は200)
指定方法:-XX:MaxGCPauseMillis 例:-XX:MaxGCPauseMillis=15
・G1GCによるメモリの最適化を行うJavaのヒープ領域の占有率のしきい値を設定
(デフォルト値は45)
指定方法:-XX:InitiatingHeapOccupancyPercent
例:-XX:InitiatingHeapOccupancyPercent=40
・OpenJDK8(Red Hat)なら使えるShenandoahGC、OpenJDK12から正式採用もされる
最新型のメモリ管理方式、100GBと2GB使用したときの停止時間が変わらないらしい
指定方法:-XX:+UseShenandoahGC
・大量のMODを導入して大量のメモリを消費する際に設定しておくといいオプション(G1GCだとNew領域の初期値の設定とスタックサイズの指定のみ行うこと)
・ヒープ領域のNew領域の初期値を決定するオプション
マイクラの場合Old領域とNew領域のEden領域の比率を同じにするといい感じ
指定方法:-Xmn 例:-Xmn2G
・New領域のEden領域の比率を設定する残りは2つのSurvivor領域に均等配分されます
Survivor領域に入り切らなかった物がOld領域に入ってしまうのでVisualJVMなどで
JVMを監視して、明らかにSurvivor領域が足らずNew領域やピープ領域を確保できない
ようなら設定する
指定方法:-XX:SurvivorRatio 例:-XX:SurvivorRatio=8
・スタックサイズを指定する(64Bit版だとデフォルトで1G)
メモリ使ってる設定なのに突然マイクラが落ちるとかあったら大体これが足りなくて
メモリ不足で落ちてます(主はそうでした)
指定方法:-Xss 例-Xss2G
・GCに使用する並列化スレッド数を指定する(論理CPU数が8以下の場合は論理CPU数、
論理CPU数が9以上の場合は8+(論理CPU数−8)×(5÷8)がデフォルトの値になります)
指定方法:-XX:ParallelGCThreads 例:-XX:ParallelGCThreads=10
・Concurrent Markingの処理を並列実行するスレッド数を指定する
((上で指定しているParallelGCThreads数+2)/4がデフォルトの数値となります)
指定方法:-XX:ConcGCThreads 例:-XX:ConcGCThreads=2
・オブジェクト上に持つポインタのビット数を減らし、オーバーヘッドを減らすことでJVMの動作を高速化するための作業領域のサイズ設定
ヒープ領域を大量に確保できる場合(32GB以上)は「-XX:-CompressedClassPointers」で無効を推奨します
指定方法:-XX:CompressedClassSpaceSize
1M~3GBの間で設定します。
例:-XX:CompressedClassSpaceSize=32M
・その他使用するといいオプション
サーバー向けの仕様でJVMを起動させる
指定方法:-server
将来のアップデートでデフォルトになりそうな最適化フラグを有効にする
指定方法:-XX:+AggressiveOpts
変な命令でメモリーを開放することが無いようにする。
指定方法:-XX:+DisableExplicitGC
衝突が起こらない同期のパフォーマンスを向上させる。
指定方法:-XX:+UseBiasedLocking
Get<Primitive>Fieldの最適化版を使う
指定方法:-XX:+UseFastAccessorMethods
スレッドローカルのオブジェクト割り当てブロックを使用する
指定方法:-XX:+UseTLAB
ラージメモリページをリクエストできるようにする
指定方法:-XX:+UseLargePages
メモリー処理時に多発するエラー「GC overhead limit exceeded」を無効化する。
指定方法:-XX:-UseGCOverheadLimit
おまけ
起動しないとかエラーログ的にメモリかどうか聞きたい場合はコメントにでも
2018/03/26:一部修正と加筆
2018/06/04:加筆
2018/07/04:加筆と修正
2019/01/10:OpenJDKとJava8のサポート終了について加筆
この記事はJava8及びOpenJDK8の最新版、もしくは非公式最新版を目標として書いてます(Java9はまだMODとかで使えないからね・・・)Javaは脆弱性が多いのでマイクラの古いバージョンでMODを使用しない限り最新版利用を推奨します。
2019年1月OracleのJava8(公式)の商用サポートが終了します。JDKを使っている方はセキュリティ的に非常に危険のためOpenJDKに乗り換えることを推奨します
わからないことが有ったらコメントで聞いてください
0.JavaのサポートとOpenJDK
「サポート終了って何?WindowsXPと同じになるって事?」って思う方もいると思うのですが大体あってます。Javaのサポートが終了するとJavaの脆弱性が修正されず、攻撃を受ける可能性があります。JDK 8(商用)は2019年1月のパッチ配布後サポートが終了する予定です。(OpenJDK8も同じくらいにサポート終了、個人向けのJavaは2025年までらしい)
1.7.10のMODとかは基本的にJava8を使ってるので深刻な問題です。なので非公式のOpenJDKに乗り換えることを推奨します
「OpenJDKって何?」と思う方も多いと思うのですが詳しい説明は省いて、ざっくり説明するとOracle社のJavaをフリーかつオープンに実装したものです。サン・マイクロシステムズが保守しています(OpenJDK8(Java8のOpenJDK)のサポート終わるんですが)。その中でサポートが終了するOpenJDK8(OpenJDK7とか6も)を別の大企業が個別にサポートすると発表しています。古いバージョンのMinecraftを使ってMODを入れるとかなら、今後はそれを使うことを推奨します。(以下に例を示します、無料でWindowsも使えるやつを選んでます)
・Amazon Corretto(サポート:Amazon 2023年6月まで) ※まだベータ版?
・OpenJDK(Red Hat)(サポート:Red Hat 2023年6月まで) ※Windowsで使うにはユーザー登録が必要、そのかわり新しいGCが使える
互換性は一部を除いて(Java FXとか)あるみたいです。私が運営しているMod入りクリエワールドサーバーを12月からOpenJDK(Red Hat)で動かしてますが特に問題等は無いため大丈夫だと信じたい(私のサーバーも来週OpenJDK(Red Hat)へ全面移行します)
1.Minecraftの処理について
MinecraftはJavaの仮想マシン(JVM)を作ってその上でゲームを動かします
なのでJVMのオプション(以下JVMオプション)を指定することにより、ある程度性能向上が見込めます
基本的にメモリーの設定です、よくメモリーの割当を増やすとかもこれですね
2.MinecraftのJVMオプションの指定方法
1.Minecraftのランチャーを起動し2.「起動オプション」をクリックします
3.その中の「高度な設定を有効にする」にオンにします
4.JVMオプションを指定したいプロファイルを選択
5.JVMの引数を有効にし、右の空白にオプションを入力して保存
6.Minecraftが無事起動すれば指定成功
次からオプションについて説明していきます
3.JVMのオプションについて(一部)
専門用語は各自ググってください 数字の後のMはメガバイト、Gはギガバイトですメモリーは自身の環境に合わせて変更してください、わからなければコメントをください
・JVMのメイン処理領域(ヒープ領域※New領域+Old領域)の設定
指定方法:-Xmx -Xms
Xmsで初期値、Xmxで最大値指定します。初期値と最大値は一致推奨です。
例:-Xmx4G -Xms4G
・MODのクラスなどの情報を格納する領域(Metaspace領域)の設定(Java8以降)
指定方法:-XX:MetaspaceSize -XX:MaxMetaspaceSize
MODを大量導入、もしくは重量級のMODを導入する際にはこの値を変更しないと
重たくなったりします
-XX:MetaspaceSizeで初期値、-XX:MaxMetaspaceSizeで最大値を指定します。
初期値と最大値は一致推奨です。多くても1Gくらいしか消費しません
例:-XX:MetaspaceSize=512M -XX:MaxMetaspaceSize=512M
・メモリー管理方法の指定
上記のXmxやXmsで確保できるメモリーの量に合わせてください
両方書いてあると両方共無効になったり起動しなくなるので片方は消しておいてください
・Forgeインストール時と推奨設定はConcurrent Mark-Sweep Collector方式です
大量のメモリを消費する設定の場合、こっちの方がG1GCよりちょっと早かった
指定方法:XX:+UseConcMarkSweepGC -XX:+CMSIncrementalMode
一度に全てのメモリを掃除せず、細かい単位でメモリーを掃除しJVM内のメモリー
空き領域を増やす設定です。
・ある程度メモリーが確保できる場合や細かいメモリ設定が面倒くさい場合は
G1 GC方式を使いましょう
指定方法:-XX:+UseG1GC
JVM内のメモリーを細かく細分化し各種領域を割り当てて、JVM起動中に足りなかった
りした場合、各種領域の割当を自動で変更してくれる方式です
・G1GCで設定するといい項目
・GC時に停止する最大ミリ秒を指定する(デフォルト値は200)
指定方法:-XX:MaxGCPauseMillis 例:-XX:MaxGCPauseMillis=15
・G1GCによるメモリの最適化を行うJavaのヒープ領域の占有率のしきい値を設定
(デフォルト値は45)
指定方法:-XX:InitiatingHeapOccupancyPercent
例:-XX:InitiatingHeapOccupancyPercent=40
・OpenJDK8(Red Hat)なら使えるShenandoahGC、OpenJDK12から正式採用もされる
最新型のメモリ管理方式、100GBと2GB使用したときの停止時間が変わらないらしい
指定方法:-XX:+UseShenandoahGC
・大量のMODを導入して大量のメモリを消費する際に設定しておくといいオプション(G1GCだとNew領域の初期値の設定とスタックサイズの指定のみ行うこと)
・ヒープ領域のNew領域の初期値を決定するオプション
マイクラの場合Old領域とNew領域のEden領域の比率を同じにするといい感じ
指定方法:-Xmn 例:-Xmn2G
・New領域のEden領域の比率を設定する残りは2つのSurvivor領域に均等配分されます
Survivor領域に入り切らなかった物がOld領域に入ってしまうのでVisualJVMなどで
JVMを監視して、明らかにSurvivor領域が足らずNew領域やピープ領域を確保できない
ようなら設定する
指定方法:-XX:SurvivorRatio 例:-XX:SurvivorRatio=8
・スタックサイズを指定する(64Bit版だとデフォルトで1G)
メモリ使ってる設定なのに突然マイクラが落ちるとかあったら大体これが足りなくて
メモリ不足で落ちてます(主はそうでした)
指定方法:-Xss 例-Xss2G
・GCに使用する並列化スレッド数を指定する(論理CPU数が8以下の場合は論理CPU数、
論理CPU数が9以上の場合は8+(論理CPU数−8)×(5÷8)がデフォルトの値になります)
指定方法:-XX:ParallelGCThreads 例:-XX:ParallelGCThreads=10
・Concurrent Markingの処理を並列実行するスレッド数を指定する
((上で指定しているParallelGCThreads数+2)/4がデフォルトの数値となります)
指定方法:-XX:ConcGCThreads 例:-XX:ConcGCThreads=2
・オブジェクト上に持つポインタのビット数を減らし、オーバーヘッドを減らすことでJVMの動作を高速化するための作業領域のサイズ設定
ヒープ領域を大量に確保できる場合(32GB以上)は「-XX:-CompressedClassPointers」で無効を推奨します
指定方法:-XX:CompressedClassSpaceSize
1M~3GBの間で設定します。
例:-XX:CompressedClassSpaceSize=32M
・その他使用するといいオプション
サーバー向けの仕様でJVMを起動させる
指定方法:-server
将来のアップデートでデフォルトになりそうな最適化フラグを有効にする
指定方法:-XX:+AggressiveOpts
変な命令でメモリーを開放することが無いようにする。
指定方法:-XX:+DisableExplicitGC
衝突が起こらない同期のパフォーマンスを向上させる。
指定方法:-XX:+UseBiasedLocking
Get<Primitive>Fieldの最適化版を使う
指定方法:-XX:+UseFastAccessorMethods
スレッドローカルのオブジェクト割り当てブロックを使用する
指定方法:-XX:+UseTLAB
ラージメモリページをリクエストできるようにする
指定方法:-XX:+UseLargePages
メモリー処理時に多発するエラー「GC overhead limit exceeded」を無効化する。
指定方法:-XX:-UseGCOverheadLimit
おまけ
放送で使ってるオプションは以下のとおり(2018/07/04更新)
-server -XX:+UseConcMarkSweepGC -XX:+CMSIncrementalMode -XX:+UseLargePages -XX:+UseTLAB -XX:+UseFastAccessorMethods -XX:+AggressiveOpts -XX:+UseBiasedLocking -Xmx58G -Xms58G -Xmn45G -XX:SurvivorRatio=7 -XX:MetaspaceSize=512M -XX:MaxMetaspaceSize=512M -XX:CompressedClassSpaceSize=1G -Xss5G -XX:ParallelGCThreads=16 -XX:ConcGCThreads=4
広告