java最大线程数

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/asdfgggggggg/article/details/52253922

问题:java.lang.OutOfMemoryErrorunable to create new native thread

一切都是因为这个问题造成的,当运行hbase程序的时候,出现了这个问题(内存溢出),不能去创建本地线程,第一次遇到,又开始学习新知识了。

首先判断内存的剩余量,打开终端,运行程序,内存还有一些,报错!!

百度:说是系统线程的限定。好,尝试一下,Thread.activeCount(),到了2040左右就崩溃了,知道了错误就开始修改。

影响创建最大线程数的因素:

-Xms  intial java heap size

-Xmx  maximum java heap size

-Xss   the Stack size for each thread

系统的限制   系统可以设置的最大线程数

其计算公式如下所示:

(MaxProcessMemory - JVMMemory - ReservedOsMemory) / (ThreadStackSize) = Number of threads 
MaxProcessMemory 指的是一个进程的最大内存
JVMMemory         JVM内存
ReservedOsMemory  保留的操作系统内存
ThreadStackSize      线程栈的大小

但是发现关掉那些消耗内存的应用程序,但是还是没有什么提高,此时只有系统的限制:

/proc/sys/kernel/pid_max,
/proc/sys/kernel/thread-max,
max_user_process(ulimit -u),
/proc/sys/vm/max_map_count。

终端下输入:ulimit -a方法:

<span style="line-height: 20.02px; font-family: arial;">core file size          (blocks, -c) 0</span>
<p class="p1"><span class="s1">data seg size           (kbytes, -d) unlimited</span></p><p class="p1"><span class="s1">file size               (blocks, -f) unlimited</span></p><p class="p1"><span class="s1">max locked memory       (kbytes, -l) unlimited</span></p><p class="p1"><span class="s1">max memory size         (kbytes, -m) unlimited</span></p><p class="p1"><span class="s1">open files                      (-n) 524288</span></p><p class="p1"><span class="s1">pipe size            (512 bytes, -p) 1</span></p><p class="p1"><span class="s1">stack size              (kbytes, -s) 8192</span></p><p class="p1"><span class="s1">cpu time               (seconds, -t) unlimited</span></p><p class="p1"><span class="s1">max user processes              (-u) 2048</span></p><p class="p1"><span class="s1">virtual memory          (kbytes, -v) unlimited</span></p>

这是我修改之后的数据,可以发现open files与max user processes数目都增大了(与以前的数据相比),这里因为修改成功了,以前的数据都没有了。这里主要讲解一下在mac OSX captain下面的修改方式。

进入/Library/LaunchDaemons目录,创建以下两个文件:

limit.maxfiles.plist

limit.maxproc.plist

分别在每个文件下面添加以下文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
        "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
  <dict>
    <key>Label</key>
    <string>limit.maxfiles</string>
    <key>ProgramArguments</key>
    <array>
      <string>launchctl</string>
      <string>limit</string>
      <string>maxfiles</string>
      <string>524288</string>
      <string>524288</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>ServiceIPC</key>
    <false/>
  </dict>
</plist>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple/DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
  <plist version="1.0">
    <dict>
      <key>Label</key>
        <string>limit.maxproc</string>
      <key>ProgramArguments</key>
        <array>
          <string>launchctl</string>
          <string>limit</string>
          <string>maxproc</string>
          <string>2048</string>
          <string>2048</string>
        </array>
      <key>RunAtLoad</key>
        <true />
      <key>ServiceIPC</key>
        <false />
    </dict>
  </plist>

重启之后,执行ulimit -a 会发现和我上面的结果一样了。

至于原理:launch是启动的意思,这就是系统启动时候所执行的文件,(一切皆文件的原理,我喜欢这句话)。

猜你喜欢

转载自blog.csdn.net/asdfgggggggg/article/details/52253922