いくつか対処方法で挙げられるものに提案と補足です。
ガベージコレクション(以下GC)のチューニングを行うのも一つの手かと思いますが、あくまでもマイクラ標準では膨大なMODを処理することを想定して設定されているわけではないと思うので、JVM引数でGC方式を見直すのも良いかと思います。
仰る通り、膨大なメモリを割り当てた後の、GC処理にはアプリケーション停止時間はどうしても膨大な時間が掛かってしまいますが、それを考慮して最大一時停止時間目標(
-XX:MaxGCPauseMillis)が設定されているものの、上手くメモリ開放ができなければ、断続的な一時停止が発生してしまいます。
標準では
-XX:MaxGCPauseMillisは
50msですが、結構体感ではっきりとわかってしまうほどです。
といえど、これを単純に増減させればいいかというとそうでもなく、増やせばそれだけ一時停止を許容してしまうことになるので、さらにラグがひどくなったりもするかと思います。
チューニングにはこの辺を見直す必要があると思いますが、個々のマシンスペックによって最適値は異なるので、一概にこれといったことは言えません。
マイクラ標準設定のJVMでは、GC方式をG1 GC方式(
-XX:+UseG1GC)を採用していますが、Concurrent方式(
-XX:+UseConcMarkSweepGC)に変更するのも良いかと思います。
但し、Concurrent方式はアプリケーションスレッドと並列でGC処理を行う為、かなりのパフォーマンスヒットが考えられるので、それ相応のマシンスペックが必要(割り当てメモリ量が多ければ、さらに必要)で、以下設定が自動割り当てとなってしまうのに注意が必要です。
コード: 全て選択
-XX:SurvivorRatio=1024
-XX:MaxTenuringThreshold=0
アプリケーションスレッドと並列でGC処理を行うので、正しく処理が行えていればさらに停止時間は短縮化できますが、パフォーマンスヒットによってマシン側が処理しきれない場合は、もっと悪化する可能性はあります。
その場合は、Concurrent方式をインクリメンタルモード(
-XX:+UseConcMarkSweepGC -XX:+CMSIncrementalMode)で動作させれば、改善されるかもしれません。
但し、これも完全に有能というわけではなく、マシンスペック次第では非常に断続的なラグを発生させる要因にもなるので、チューニングしながら最適設定を探すしかないのかもしれません。
あくまでも一つ提案かつ、動作テストしていないはご愛嬌…
私の認識が間違っていたらご指摘ください。