JVM - StackSize & ThreadCount

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

猜你喜欢

转载自blog.csdn.net/lewee0215/article/details/111240744
JVM