Java調優之jvm和線程的內存分析

 本文轉載自:http://www.mzone.cc/article/321.html

這幾天因爲自己開發的一個網站在768M內存的機器上撐不起100多個用戶的運行,因爲每個用戶啓用功能後,系統將爲每個用戶分配8個左右的獨立線程,我的這篇文章http://www.mzone.cc/article/311.html也有介紹的。在內存小的機器上經常出現的問題就是Cann’t allocate memory和OutOfMemoryError錯誤,這個要從jvm的內存結構來進行分析了。在jvm內存調整過程中,我們經常使用的參數就是:

  1. -Xms 爲jvm啓動時分配的內存,比如-Xms200m,表示分配200M
  2. -Xmx 爲jvm運行過程中分配的最大內存,比如-Xms500m,表示jvm進程最多隻能夠佔用500M內存
  3. -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 256M 256K 768M 1.4 3072
1024M 256M 256M 256K 768M 1.5 768

      上面的表格只是大致的估計了下在特定內存條件下可以在java中創建的最大線程數。隨着-Xmx的加大,空閒的內存數就更少,那麼可以創建的線程也就更少,同時在JDK1.4和1.5版本不同下,可創建的線程數也會根據每個線程的內存大小不同而不同。

      其實只要我們瞭解了JVM的內存大小指定以及java中線程的內存模型,基本上我們就可以很好的控制如何在java中使用線程和避免內存溢出或錯誤的問題了。

發佈了5 篇原創文章 · 獲贊 6 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章