再谈 Unlix (Linux, AIX, HPUX) 上 Java 的 java.lang.OutOfMemoryError: unable to create new native thread

  • 首先很容易排除是 程序问题
    • 内存用了很少,64 位 Java也没有内存限制,线程也不多,-Xss 堆栈也没人会配置很大。
    • 那么肯定是 limit 不足引起

       

  • 配置 ulimit 就可以了,问题看起来很简单,但是问题为什么有时候难以解决,因为涉及 Uinux 下面因素
    • 到底那一个 limit 控制
    • 到底 soft 还是 hard
    • 设置在 /etc/security/limits.conf, 还是用户 Profile
    • 如果是 crontab 启动又如何配置

       

  • 澄清概念
    • Java 线程数多少是受 max user processes 控制
    • max user processes 是什么
      • 也就是 /etc/security/limits.conf 下面:

* soft nproc 4096
* hard nproc 16384

或者是下面

bash-3.2$ ulimit -a
max user processes              (-u) 4096

    • hard / soft 区别
      • hard 只能 root 设置,允许的最大值。
      • soft 意味着用户的默认值。用户自己用户可以通过  ulimit -u  重新配置成为小于 hard 的值。

    • 怎么修改
        • hard 只能 root 设置 - 修改文件/etc/security/limits.conf,并重启 OS
        • Soft - ulimit -u 10240 , 比如这个命令就改成 10240 了,没超过 hard 的 16384 。

    • crontab 环境变量
      • 注意和用户登录到 OS shell 得到的是不一样的,它不读任何的用户 profile
        所以要特别使用 source xxxx/profile  或者  . xxxx/profile 来引入环境变量 (务必不能 sh xxxx/profile, 这是设置到新启动的 shell 里面了)。

  • 如何配置
    • 如下配置,并重启 OS 是最最简单的方法,也就是 /etc/security/limits.conf 下面:

* soft nproc 16384
* hard nproc 16384

    • 如果是其它不同的配置,要理解上面的概念并相应操作

       

  • 附一段最简单代码来测试能启动的线程数:
public class ThreadsTest extends Thread {

	  public ThreadsTest() {
	    start();
	  }
	  
	  public void run()  {
	    while(true) {
		try {
			Thread.sleep(120000);
		}catch (Exception e)
          {System.out.print(e);}
	  }
  }

	  public static void main(String[] args) {
	    for(int i = 0;; i++){
	      new ThreadsTest();
	      System.out.println("Thread ...: " + i);}
	  }
	}

 

你可能感兴趣的:(再谈 Unlix (Linux, AIX, HPUX) 上 Java 的 java.lang.OutOfMemoryError: unable to create new native thread)