5、JVM可以创建多少线程

2020-08-11  本文已影响0人  霸体

线上java程序有事会遇到下面的问题:

OutOfMemoryError: unable to create new native thread

显然,创建java线程也是受到内存限制的,下面具体分析一下原因。

操作系统内存限制

32位操作系统的最大寻址空间是2^32个字节≈4G,一个32位进程最大可使用内存一般为2G(操作系统预留2G);
64位操作系统的寻址空间大大增加,但不是简单的2^64,寻址的位数实际还受限于CPU支持的最大物理地址宽度以及操作系统具体实现的限制,64位操作系统通常使用内存分页(每页一般为4KB)管理内存,内存分页管理有很大优势:

x86_64 平台上的 Linux 理论上最多支持64TB的物理内存,单个进程理论上可用128TB的地址空间(高128TB被操作系统占用了),但受限于物理内存的限制,其中最多有64TB是物理内存,其余的理论上还可以用虚拟内存(swap分区)顶包.

下图是微软官网windows系统给的内存限制:


image.png

jvm进程的内存限制

对于32位操作系统,jvm进程的最大可用内存为2G;
对于64位操作系统,jvm进程理论可以获得跟物理内存一样大的内存,但是一般linux操作系统都会对进程进行资源限制, 如使用 ulimit -S xx 命令;

jvm可创建线程数量

公式: (MaxProcessMemory - JVMMemory - ReservedOsMemory) / (ThreadStackSize) = 线程数

参考资料


64位系统内存管理

linux下ulimit使用限制进程资源

上一篇 下一篇

猜你喜欢

热点阅读