簡體   English   中英

如何增加JVM線程的最大數量(Linux 64位)

[英]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 ,請檢查以下內容:

  1. 在小型記憶機中

    每個Java線程都使用自己的堆棧內存。 默認堆棧大小為1024k(= 1M)。 您可以像java -Xss512k ...那樣減小堆棧大小java -Xss512k ... 如果堆棧大小太小,則無法啟動JVM。

    並注意堆內存配置:(初始) -Xms和(最大) -Xmx 分配給堆的內存越多,堆棧的可用內存就越少。

  2. 系統限制

    ulimit -a某些值可能會影響線程限制。

    • max memory size - 在大多數64位機器上無限制
    • max user processes - linux將線程視為進程
    • virtual memory - 在大多數64位機器上無限制。 -Xss配置增加虛擬內存使用量(默認1024k)

    您可以通過(臨時)運行ulimit命令或(永久)編輯/etc/security/limits.conf來更改這些值。

  3. 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永久更改。

  4. 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

  5. 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM