本文來源於鐵木箱子的博客http://www.mzone.cchtml
這幾天由於本身開發的一個網站在768M內存的機器上撐不起100多個用戶的運行,由於每一個用戶啓用功能後,系統將爲每一個用戶分配8個左右的獨立線程,個人這篇文章http://www.mzone.cc/article/311.html也有介紹的。在內存小的機器上常常出現的問題就是Cann’t allocate memory和OutOfMemoryError錯誤,這個要從jvm的內存結構來進行分析了。在jvm內存調整過程當中,咱們常常使用的參數就是:java
通常jvm出現Cannt’ allocate memory的錯誤就是機器的內存不夠,致使系統沒法爲jvm分配給定的內存,這個在啓動時猶未突出,因此會在啓動參數中設置-Xms來指定;而 OutOfMemoryError錯誤則通常會在系統運行一段狀況後出現,絕大部分也是機器內存不夠或是JVM自己的內存空間已被用盡,這時就要根據狀況 進行調整了,若是是JVM自己的內存空間用盡,則須要調整-Xmx參數來分類jvm的可用內存,若是是機器內存不夠則要增長內存或是調優程序了。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 | 256M | 256K | 768M | 1.4 | 3072 |
1024M | 256M | 256M | 256K | 768M | 1.5 | 768 |
上面的表格只是大體的估計了下在特定內存條件下能夠在java中建立的最大線程數。隨着-Xmx的加大,空閒的內存數就更少,那麼能夠建立的線程也就更少,同時在JDK1.4和1.5版本不一樣下,可建立的線程數也會根據每一個線程的內存大小不一樣而不一樣。spa
其實只要咱們瞭解了JVM的內存大小指定以及java中線程的內存模型,基本上咱們就能夠很好的控制如何在java中使用線程和避免內存溢出或錯誤的問題了。操作系統