问题:java.lang.OutOfMemoryError: unable 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是启动的意思,这就是系统启动时候所执行的文件,(一切皆文件的原理,我喜欢这句话)。