问题: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方法:
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
file size (blocks, -f) unlimited
max locked memory (kbytes, -l) unlimited
max memory size (kbytes, -m) unlimited
open files (-n) 524288
pipe size (512 bytes, -p) 1
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 2048
virtual memory (kbytes, -v) unlimited
这是我修改之后的数据,可以发现open files与max user processes数目都增大了(与以前的数据相比),这里因为修改成功了,以前的数据都没有了。这里主要讲解一下在mac OSX captain下面的修改方式。
进入/Library/LaunchDaemons目录,创建以下两个文件:
limit.maxfiles.plist
limit.maxproc.plist
分别在每个文件下面添加以下文件:
Label
limit.maxfiles
ProgramArguments
launchctl
limit
maxfiles
524288
524288
RunAtLoad
ServiceIPC
Label
limit.maxproc
ProgramArguments
launchctl
limit
maxproc
2048
2048
RunAtLoad
ServiceIPC
至于原理:launch是启动的意思,这就是系统启动时候所执行的文件,(一切皆文件的原理,我喜欢这句话)。