https://www.cnblogs.com/leeego-123/p/12124939.html
JVM 内存参数设置: java -Xmx3550m -Xms3550m -Xmn2g -Xss128k
-Xmx3550m:设置JVM最大可用内存为3550M.
-Xms3550m:设置JVM促使内存为3550m.此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存.
-Xmn2g:设置年轻代大小为2G.整个堆大小=年轻代大小 + 年老代大小 + 持久代大小.持久代一般固定大小为64m,所以增大年轻代后,将会减小年老代大小.此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8.
-Xss 128k : 设置每个线程的堆栈大小. JDK5.0以后每个线程堆栈大小为1M
JVM最大线程数影响因素
JVM最大创建线程数量 由JVM堆内存大小、线程的Stack内存大小、系统最大可创建线程数(Java线程的实现是基于底层系统的线程机制来实现的,Windows下_beginthreadex,Linux下pthread_create)三个方面
1.操作系统因素
操作系统最大线程数限制
https://blog.csdn.net/jayzym/article/details/78819130
操作系统限制 系统最大可开线程数,主要受以下几个参数影响
- /proc/sys/kernel/pid_max default: 32768
- /proc/sys/kernel/threads-max default: 14645
- max_user_process(ulimit -u) 在64位Linux系统(CentOS 6, 3G内存)下测试,发现还有一个参数是会限制线程数量:max user process(可通过ulimit –a查看,默认值1024,通过ulimit –u可以修改此值),这个值在上面的32位Ubuntu测试环境下并无限制
- /proc/sys/vm/max_map_count default: 65536
pid_max
32位Linux系统可创建的最大pid数是32678,这个数值可以通过/proc/sys/kernel/pid_max来做修改(修改其值为10000:echo 10000 > /proc/sys/kernel/pid_max),但是在32系统下这个值只能改小,无法改大
max_map_count
“This file contains the maximum number of memory map areas a process may have. Memory map areas are used as a side-effect of calling malloc, directly by mmap and mprotect, and also when loading shared libraries.
While most applications need less than a thousand maps, certain programs, particularly malloc debuggers, may consume lots of them, e.g., up to one or two maps per allocation.
The default value is 65536.”
2.内存因素
https://www.iteye.com/blog/sesame-622670
(MaxProcessMemory - JVMMemory - ReservedOsMemory) / (ThreadStackSize) = Number of threads
MaxProcessMemory 指的是一个进程的最大内存,在32位的 windows下是 2G,在 64位下无限制
JVMMemory JVM内存
ReservedOsMemory 保留的操作系统内存,一般是130M左右
ThreadStackSize 线程栈的大小
以32位windows操作系统为例,系统最大内存 2G,
eclipse默认启动的程序内存是64M
32位 JDK 1.6默认的stacksize 325K左右
公式如下:Number of threads = (2*1024*1024-64*1024-130*1024)/325 = 5841
公式计算所得5841,和实践5602基本一致(有偏差是因为ReservedOsMemory不能很精确)
线程数量限制异常 :java.lang.OutOfMemoryError: unable to create new native thread