JVM可生产的最大线程数,详见https://blog.csdn.net/moonpure/article/details/80701878,https://blog.csdn.net/xyls12345/article/details/26482387html
这几天由于本身开发的一个网站在768M内存的机器上撑不起100多个用户的运行,由于每一个用户启用功能后,系统将为每一个用户分配8个左右的独立线程,个人这篇文章http://www.mzone.cc/article/311.html也有介绍的。在内存小的机器上常常出现的问题就是Cann’t allocate memory和OutOfMemoryError错误,这个要从jvm的内存结构来进行分析了。在jvm内存调整过程当中,咱们常常使用的参数就是:java
-Xms 为jvm启动时分配的内存,好比-Xms200m,表示分配200Mbash
-Xmx 为jvm运行过程当中分配的最大内存,好比-Xms500m,表示jvm进程最多只可以占用500M内存jvm
-Xss 为jvm启动的每一个线程分配的内存大小,默认JDK1.4中是256K,JDK1.5+中是1Mide
通常jvm出现Cannt’ allocate memory的错误就是机器的内存不够,致使系统没法为jvm分配给定的内存,这个在启动时犹未突出,因此会在启动参数中设置-Xms来指定;而OutOfMemoryError错误则通常会在系统运行一段状况后出现,绝大部分也是机器内存不够或是JVM自己的内存空间已被用尽,这时就要根据状况进行调整了,若是是JVM自己的内存空间用尽,则须要调整-Xmx参数来分类jvm的可用内存,若是是机器内存不够则要增长内存或是调优程序了。网站
上面两个参数主要是来设置jvm的最小可用内存和最大可用内存,属于进程级别的内存控制。对于java中的线程,我以前的理解一直是在java中new新线程的时候是直接使用jvm的内存,可实际状况却不是这样的。在java中每一个线程须要分配线程内存,用来存储自身的线程变量,在jdk1.4中每一个线程是256K的内存,在jdk1.5中每一个线程是1M的内存,jdk1.6中不太清楚,估计也是1M。在java中每new一个线程,jvm都是向操做系统请求new一个本地线程,此时操做系统会使用剩余的内存空间来为线程分配内存,而不是使用jvm的内存。这样,当操做系统的可用内存越少,则jvm可用建立的新线程也就越少,举个例子以下:spa
Total Memory | -Xms | -Xmx | -Xss | Spare Memory | JDK | Thread Count |
1024M | 256M | 256M | 256K | 768M | 1.4 | 3072 |
1024M | 256M | 256M | 256K | 768M | 1.5 | 768 |
上面的表格只是大体的估计了下在特定内存条件下能够在java中建立的最大线程数。随着-Xmx的加大,空闲的内存数就更少,那么能够建立的线程也就更少,同时在JDK1.4和1.5版本不一样下,可建立的线程数也会根据每一个线程的内存大小不一样而不一样。操作系统
其实只要咱们了解了JVM的内存大小指定以及java中线程的内存模型,基本上咱们就能够很好的控制如何在java中使用线程和避免内存溢出或错误的问题了。.net