内存计算
操作系统中的最大可用内存除去操作系统本身使用的部分,剩下的都可以为某一个进程服务,在JVM进程中,内存又被分为堆、本地内存和栈等三大块,Java堆是JVM自动管理的内存,应用的对象的创建和销毁、类的装载等都发生在这里,本地内存是Java应用使用的一种特殊内存,JVM并不直接管理其生命周期,每个线程也会有一个栈,是用来存储线程工作过程中产生的方法局部变量、方法参数和返回值的,每个线程对应的栈的默认大小为1M。
从内存角度来看创建线程需要内存空间,如果JVM进程正当一个应用创建线程,而操作系统没有剩余的内存分配给此JVM进程,则会抛出问题中的OOM异常:unable to create new native thread。
如下公式可以用来从内存角度计算允许创建的最大线程数:
最大线程数 = (操作系统最大可用内存 - JVM内存 - 操作系统预留内存)/ 线程栈大小
根据这个公式,我们可以通过剩余内存计算可以创建线程的数量。
使用free -m查看剩余内存
使用ulimit -a来显示当前的各种系统对用户使用资源的限制:
max user processes (-u) 1024
机器设置的允许使用的最大用户进程数为1024。
使用jstack命令查看Java线程情况。