Javaを使用して、改造したMinecraftサーバーを起動すると、次のエラーが表示されます。
Java.lang.OutOfMemoryError: unable to create new native thread
私の最初の推測では、多分何かが制限を超えて多くのスレッドを作成しているかもしれませんが、サーバーは約50スレッドしか作成せず、マシン上のスレッドの合計数を420から470に増やします。また、サーバーに8 GBを割り当てたので、メモリが問題になるとは思いません。
以下はJavaコマンドです。サーバーを起動するために使用します。
Java -server -XX:PermSize=512M -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled -XX:ParallelGCThreads=2 -XX:+AggressiveOpts -jar forge.jar -Xms8G -Xmx8G nogui -Dfml.queryResult=confirm
次のコマンドを使用して、スレッドの合計数をカウントしました
ps -eo nlwp | tail -n +2 | awk '{ num_threads += $1 } END { print num_threads }'
説明したとおり here 。
そのコマンドを手動で複数回実行しましたが、サーバーがクラッシュする直前にカウントは470でした。したがって、サーバーが1秒未満で70万以上のスレッドを作成していない限り、制限を超えてはなりません。
サーバーがクラッシュする前に、私のbashは私にこれらのエラーを与えていました:
-bash: fork: retry: Resource temporarily unavailable
実際に何らかの限界に達し、問題はvm内だけではないことを信じさせてくれます。
私のサーバーには32 GBのRAMがあり、トップによると、Javaプロセスのメモリ使用量は6%未満であり、2 GB未満であるため、vmは十分なメモリが残っています。
このトラブルシューティング によると、OutOfMemoryErrorの他の意味は、新しいスレッドを作成するのに十分なメモリが残っていないことかもしれませんが、合計32GBのうち6つしか使用されていないため、これは問題になりませんどちらか。
スレッド数が制限を十分に下回っており、十分なメモリが残っているため(vmおよびシステムの残りの部分に)、他に何が問題になる可能性がありますか?
現在設定されている制限は次のとおりです。
mc@h*******:~$ ulimit -a
core file size (blocks, -c) unlimited
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 772691
max locked memory (kbytes, -l) 16384
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 772691
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
私のJavaバージョン:
mc@h*******:~$ Java -version
Java version "1.8.0_181"
Java(TM) SE Runtime Environment (build 1.8.0_181-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.181-b13, mixed mode)
私のUbuntuバージョン:
mc@h*******:~$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 18.04.1 LTS
Release: 18.04
Codename: bionic
jstack -l <PID> >> threaddump.log
を使用してスレッドダンプを作成してみました。サーバーが起動し、すべてが正常に機能する間、ログファイルは次のようになります。
Error occurred during initialization of VM
Java.lang.OutOfMemoryError: unable to create new native thread
サーバーの起動がほぼ終了すると(サーバーがOutOfMemoryErrorでクラッシュする少し前)、ログは次のようになります。
# There is insufficient memory for the Java Runtime Environment to continue.
# Cannot create GC thread. Out of system resources.
# An error report file with more information is saved as:
# /home/mc/hs_err_pid24081.log
エラーログをアップロードしました here 。
Oracle JDKの再インストールは役に立たなかったので、OpenJDKを試してみましたが、うまくいきました。 OutOfMemoryErrorsはなくなり、すべてが期待どおりに機能するようになりました。
JDKの切り替えは一時的にしか役に立たなかったようです。しかし、私は問題の本当の起源を見つけました。私が試したのは、OutOfMemoryErrorが両方のmodpackに含まれていた特定のmodによって引き起こされたようです。スレッド数を増やしたりメモリをいっぱいにしたりせずにOOMEがどのように発生したかはまだわかりませんが、とにかくです。
問題を引き起こしたmodはAstral Sorcery(バージョン1.12.2-1.9.4)でした。そのため、modded minecraftサーバーで同じ問題が発生した場合は、そのmodを削除してみてください。