如何增加最大数量的JVM线程(Linux 64位)

在15G内存的Linux机器上,我不能创build超过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 ...一样减小堆栈大小。 如果堆栈大小太低,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
    要么
    sys.kernel.threads-max = 999999/etc/sysctl.conf中永久更改。

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

  5. sys.vm.max_map_count

    cat /proc/sys/vm/max_map_count应该至少(2个线程数)。

    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的系统“TasksMax”限制来施加新的限制。

对于登录会话, UserTasksMax默认为内核限制pids_max的33%(通常为12,288),可以在/etc/systemd/logind.conf中覆盖。

对于服务, DefaultTasksMax默认值是内核限制pids_max的15%(通常为4,915)。 您可以通过在“systemctl edit”中设置TasksMax或更新/etc/systemd/system.conf中的DefaultTasksMax来覆盖该服务