[轉載聲明] 轉載時必須标注:本文來源于鐵木箱子的部落格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中使用線程和避免記憶體溢出或錯誤的問題了。