[英]How to increase maximum number of JVM threads (Linux 64bit)
我不能在具有15G內存的Linux機器上創建超過32k的Java線程。
您可以使用示例程序找出當前線程限制。
如果您Exception in thread "main" java.lang.OutOfMemoryError: unable to create new native thread
遇到Exception in thread "main" java.lang.OutOfMemoryError: unable to create new native thread
,請檢查以下內容:
在小型記憶機中
每個Java線程都使用自己的堆棧內存。 默認堆棧大小為1024k(= 1M)。 您可以像java -Xss512k ...
那樣減小堆棧大小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
要么
/etc/sysctl.conf
sys.kernel.threads-max = 999999
永久更改。
sys.kernel.pid_max
如果cat /proc/sys/kernel/pid_max
與當前限制類似,請增加此值。 Linux將線程視為進程。
echo 999999 > /proc/sys/kernel/pid_max
要么
/etc/sysctl.conf
sys.kernel.pid_max = 999999
永久更改。
而且您可能還需要增加sys.vm.max_map_count
。
sys.vm.max_map_count
cat /proc/sys/vm/max_map_count
應至少為(2 x thread-count)。
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
要么
在/etc/sysctl.conf
sys.vm.max_map_count = 1999999
永久更改。
現代(systemd)linux系統的附加信息。
關於這些可能需要調整的值的資源很多(另一個答案是大多數的好的來源); 但是,通過系統化的“TasksMax”限制,在cgroup上設置pids.max,會產生新的限制。
對於登錄會話, UserTasksMax默認為內核限制pids_max的33%(通常為12,288),可以在/etc/systemd/logind.conf中覆蓋。
對於服務, DefaultTasksMax默認值是內核限制pids_max的15%(通常為4,915)。 您可以通過在“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
我還必須在/etc/systemd/system.conf
(或用戶運行的服務的/etc/systemd/user.conf
中將DefaultTasksMax
設置為DefaultTasksMax=unlimited
。
Systemd還對從login-shell運行的程序應用限制。 這些默認為每個用戶4096(將增加到12288),並在
/etc/systemd/logind.conf
的[Login]部分中配置為UserTasksMax。
這是來自StackExchange的問題 。 將UserTasksMax
設置為UserTasksMax=999999
對我UserTasksMax=999999
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.