Anda dapat menggunakan contoh program untuk mengetahui batas utas saat ini.
Jika Anda menemukan Exception in thread "main" java.lang.OutOfMemoryError: unable to create new native thread
, periksa ini:
-
Di mesin memori kecil
Setiap utas Java menggunakan memori tumpukannya sendiri. Ukuran tumpukan default adalah 1024k (=1M). Anda dapat mengurangi ukuran stack seperti
java -Xss512k ...
. JVM tidak dapat dijalankan jika ukuran tumpukan terlalu rendah.Dan berhati-hatilah dengan konfigurasi memori heap:(awal)
-Xms
dan (maksimum)-Xmx
. Semakin banyak memori yang dialokasikan ke heap, semakin sedikit memori yang tersedia untuk stack. -
Batasan sistem
Beberapa nilai di
ulimit -a
dapat memengaruhi batas utas.max memory size
- tidak terbatas pada sebagian besar mesin 64bitmax user processes
- linux memperlakukan utas seperti prosesvirtual memory
- tidak terbatas pada kebanyakan mesin 64bit. penggunaan memori virtual ditingkatkan dengan konfigurasi -Xss (default 1024k)
Anda dapat mengubah nilai ini dengan (sementara) menjalankan
ulimit
perintah atau pengeditan (permanen)/etc/security/limits.conf
. -
sys.kernel.threads-max
Nilai ini adalah jumlah utas maksimum sistem-global (termasuk proses non-JVM). Periksa
cat /proc/sys/kernel/threads-max
, dan tingkatkan jika perlu.echo 999999 > /proc/sys/kernel/threads-max
atau
sys.kernel.threads-max = 999999
di/etc/sysctl.conf
untuk berubah secara permanen. -
sys.kernel.pid_max
Jika
cat /proc/sys/kernel/pid_max
mirip dengan batas saat ini, tingkatkan ini. Linux memperlakukan utas seperti proses.echo 999999 > /proc/sys/kernel/pid_max
atau
sys.kernel.pid_max = 999999
di/etc/sysctl.conf
untuk berubah secara permanen.Dan Anda mungkin perlu meningkatkan
sys.vm.max_map_count
, juga. -
sys.vm.max_map_count
cat /proc/sys/vm/max_map_count
minimal harus (2 x jumlah utas).Attempt to protect stack guard pages failed.
danOpenJDK 64-Bit Server VM warning: Attempt to deallocate stack guard pages failed.
pesan kesalahan dikeluarkan oleh JavaThread::create_stack_guard_pages(), dan memanggil os::guard_memory(). Di Linux, fungsi ini adalah mprotect().echo 1999999 > /proc/sys/vm/max_map_count
atau
sys.vm.max_map_count = 1999999
di/etc/sysctl.conf
untuk berubah secara permanen.
Informasi tambahan untuk sistem linux modern (systemd).
Ada banyak sumber tentang nilai-nilai ini yang mungkin perlu diubah (jawaban lainnya adalah sumber yang bagus untuk sebagian besar dari mereka); namun batas baru diberlakukan melalui batas "TasksMax" systemd yang menetapkan pids.max pada cgroup.
Untuk sesi login, default UserTasksMax adalah 33% dari batas kernel pids_max (biasanya 12.288) dan dapat diganti di /etc/systemd/logind.conf.
Untuk layanan, standar DefaultTasksMax adalah 15% dari batas kernel pids_max (biasanya 4.915). Anda dapat menimpanya untuk layanan dengan menyetel TasksMax di "systemctl edit" atau memperbarui DefaultTasksMax di /etc/systemd/system.conf
Saya mengalami masalah serupa dalam program Python dan berikut ini berhasil untuk saya. Ini didasarkan pada jawaban maczniak di atas dan 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
Saya juga harus menyetel DefaultTasksMax
di /etc/systemd/system.conf
(atau /etc/systemd/user.conf
untuk layanan yang dijalankan pengguna) ke DefaultTasksMax=unlimited
.
Systemd juga menerapkan batasan untuk program yang dijalankan dari login-shell. Standar ini menjadi 4096 per pengguna (akan ditingkatkan menjadi 12288) dan dikonfigurasi sebagai UserTasksMax di bagian [Login] dari
/etc/systemd/logind.conf
.
Itu dari pertanyaan StackExchange ini. Menyetel UserTasksMax
saya ke UserTasksMax=999999
bekerja untuk saya.