サンプル プログラムを使用して、現在のスレッド制限を調べることができます。
Exception in thread "main" java.lang.OutOfMemoryError: unable to create new native thread
に遭遇した場合 、これらを確認してください:
小さなメモリマシンで
すべての Java スレッドは、独自のスタック メモリを消費します。デフォルトのスタック サイズは 1024k (=1M) です。 java -Xss512k ...
のようにスタックサイズを減らすことができます .スタック サイズが小さすぎると、JVM を開始できません。
また、ヒープ メモリ構成に注意してください:(初期) -Xms
および (最大) -Xmx
.ヒープに割り当てられるメモリが多いほど、スタックに使用できるメモリが少なくなります。
システム制限
ulimit -a
のいくつかの値 スレッド制限に影響を与える可能性があります。
max memory size
- ほとんどの 64 ビット マシンで無制限max user processes
- Linux はスレッドをプロセスのように扱いますvirtual memory
- ほとんどの 64 ビット マシンで無制限。仮想メモリの使用量は -Xss 構成によって増加します (デフォルトは 1024k)
ulimit
を (一時的に) 実行することで、これらの値を変更できます。 コマンドまたは (永続的な) 編集 /etc/security/limits.conf
.
sys.kernel.threads-max
この値は、システム グローバル (非 JVM プロセスを含む) スレッドの最大数です。 cat /proc/sys/kernel/threads-max
をチェック 、必要に応じて増やしてください。
echo 999999 > /proc/sys/kernel/threads-max
また
sys.kernel.threads-max = 999999
/etc/sysctl.conf
で 永続的に変更します。
sys.kernel.pid_max
cat /proc/sys/kernel/pid_max
の場合 電流制限に似ているので、これを増やします。 Linux はスレッドをプロセスのように扱います。
echo 999999 > /proc/sys/kernel/pid_max
また
sys.kernel.pid_max = 999999
/etc/sysctl.conf
で
sys.vm.max_map_count
を増やす必要があるかもしれません
sys.vm.max_map_count
cat /proc/sys/vm/max_map_count
少なくとも (2 x スレッド数) である必要があります。
Attempt to protect stack guard pages failed.
と OpenJDK 64-Bit Server VM warning: Attempt to deallocate stack guard pages failed.
エラー メッセージは JavaThread::create_stack_guard_pages() によって発行され、os::guard_memory() を呼び出します。 Linux では、この関数は mprotect() です。
echo 1999999 > /proc/sys/vm/max_map_count
また
sys.vm.max_map_count = 1999999
/etc/sysctl.conf
で
最新の (systemd) Linux システムに関する追加情報。
これについては、微調整が必要な可能性のある多くのリソースがあります (他の回答は、それらのほとんどの優れた情報源です)。ただし、cgroup に pids.max を設定する systemd の「TasksMax」制限によって、新しい制限が課されます。
ログイン セッションの場合、UserTasksMax のデフォルトはカーネル制限 pids_max (通常は 12,288) の 33% であり、/etc/systemd/logind.conf でオーバーライドできます。
サービスの場合、DefaultTasksMax のデフォルトは、カーネル制限 pids_max (通常は 4,915) の 15% です。 "systemctl edit" で TasksMax を設定するか、/etc/systemd/system.conf で DefaultTasksMax を更新することで、サービスに対してそれをオーバーライドできます
私はPythonプログラムで同様の問題に遭遇し、以下がうまくいきました。これは、上記の maczniak の回答と https://superuser.com/questions/1219960/cannot-edit-proc-sys-kernel-threads-max に基づいています。
echo kernel.threads-max = 1073741823 >> /etc/sysctl.conf && echo 1073741823 > /proc/sys/kernel/threads-max
echo kernel.pid_max = 999999 >> /etc/sysctl.conf && echo 999999 > /proc/sys/kernel/pid_max
echo vm.max_map_count = 2147483646 >> /etc/sysctl.conf && echo 2147483646 > /proc/sys/vm/max_map_count
echo vm.overcommit_memory = 1 >> /etc/sysctl.conf && echo 1 > /proc/sys/vm/overcommit_memory
echo fs.inotify.max_user_instances = 256 >> /etc/sysctl.conf && echo 256 > /proc/sys/fs/inotify/max_user_instances
sysctl -p
DefaultTasksMax
も設定する必要がありました /etc/systemd/system.conf
で (または /etc/systemd/user.conf
ユーザーが実行するサービスの場合) DefaultTasksMax=unlimited
に .
Systemd は、ログイン シェルから実行されるプログラムにも制限を適用します。これらのデフォルトはユーザーあたり 4096 (12288 に増える予定) であり、/etc/systemd/logind.conf
の [Login] セクションで UserTasksMax として構成されています。 .
これは、この StackExchange の質問からのものです。 UserTasksMax
の設定 UserTasksMax=999999
へ