歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

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

因為自己開發的一個網站在768M內存的機器上撐不起100多個用戶的運行,因為每個用戶啟用功能後,系統將為每個用戶分配8個左右的獨立線程,我的這篇文章  http://www.linuxidc.com/Linux/2014-06/102719.htm 也有介紹的。在內存小的機器上經常出現的問題就是Cann’t 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 256M 256K 768M 1.4 3072 1024M 256M 256M 256K 768M 1.5 768

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

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

Copyright © Linux教程網 All Rights Reserved