[转载声明] 转载时必须标注:本文来源于铁木箱子的博客http://www.mzone.cc
allocate memory和outofmemoryerror错误,这个要从jvm的内存结构来进行分析了。在jvm内存调整过程中,我们经常使用的参数就是:
-xms 为jvm启动时分配的内存,比如-xms200m,表示分配200m
-xmx 为jvm运行过程中分配的最大内存,比如-xms500m,表示jvm进程最多只能够占用500m内存
-xss 为jvm启动的每个线程分配的内存大小,默认jdk1.4中是256k,jdk1.5+中是1m
一般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可用创建的新线程也就越少,举个例子如下:
total memory
-xms
-xmx
-xss
spare memory
jdk
thread count
1024m
256m
256k
768m
1.4
3072
1.5
768
上面的表格只是大致的估计了下在特定内存条件下可以在java中创建的最大线程数。随着-xmx的加大,空闲的内存数就更少,那么可以创建的线程也就更少,同时在jdk1.4和1.5版本不同下,可创建的线程数也会根据每个线程的内存大小不同而不同。
其实只要我们了解了jvm的内存大小指定以及java中线程的内存模型,基本上我们就可以很好的控制如何在java中使用线程和避免内存溢出或错误的问题了。