【轉】Java虛擬機(JVM)中的內存設置詳解

        在一些規模稍大的應用中,Java虛擬機(JVM)的內存設置尤其重要,想在項目中取得好的效率,GC(垃圾回收)的設置是第一步。java

        PermGen space:全稱是Permanent Generation space.就是說是永久保存的區域,用於存放Class和Meta信息,Class在被Load的時候被放入該區域Heap space:存放Instance。web

        GC(Garbage Collection)應該不會對PermGen space進行清理,因此若是你的APP會LOAD不少CLASS的話,就極可能出現PermGen space錯誤windows

Java Heap分爲3個區
1.Young
2.Old
3.Permanenttomcat

        Young區保存剛實例化的對象。當該區被填滿時,GC會將對象移到Old區。Permanent區則負責保存反射對象,本文不討論該區。服務器

JVM的Heap分配可使用-X參數設定,多線程

-Xms 
初始Heap大小

-Xmx 
java heap最大值 dom

-Xmn 
young generation的heap大小eclipse

JVM有2個GC線程
第一個線程負責回收Heap的Young區
第二個線程在Heap不足時,遍歷Heap,將Young 區升級爲Older區

Old區的大小等於-Xmx減去-Xmn,不能將-Xms的值設的過大,由於第二個線程被迫運行會下降JVM的性能。
爲何一些程序頻繁發生GC?jvm

有以下緣由:
1.程序內調用了System.gc()或Runtime.gc()。
2.一些中間件軟件調用本身的GC方法,此時須要設置參數禁止這些GC。
3.Java的Heap過小,通常默認的Heap值都很小。
4.頻繁實例化對象,Release對象 此時儘可能保存並重用對象,例如使用StringBuffer()和String()。性能

若是你發現每次GC後,Heap的剩餘空間會是總空間的50%,這表示你的Heap處於健康狀態,許多Server端的Java程序每次GC後最好能有65%的剩餘空間

經驗之談:

1.Server端JVM最好將-Xms和-Xmx設爲相同值。爲了優化GC,最好讓-Xmn值約等於-Xmx的1/3。
2.一個GUI程序最好是每10到20秒間運行一次GC,每次在半秒以內完成。

注意:

1.增長Heap的大小雖然會下降GC的頻率,但也增長了每次GC的時間。而且GC運行時,全部的用戶線程將暫停,也就是GC期間,Java應用程序不作任何工做。
2.Heap大小並不決定進程的內存使用量。 

Stack的設定
每一個線程都有他本身的Stack。

-Xss 
每一個線程的Stack大小

Stack的大小限制着線程的數量。若是Stack過大就好致使內存溢漏。-Xss參數決定Stack大小,例如-Xss1024K。若是Stack過小,也會致使Stack溢漏。

硬件環境

硬件環境也影響GC的效率,例如機器的種類,內存,swap空間,和CPU的數量。
若是你的程序須要頻繁建立不少transient對象,會致使JVM頻繁GC。這種狀況你能夠增長機器的內存,來減小Swap空間的使用。

4種GC

一、第一種爲單線程GC,也是默認的GC,該GC適用於單CPU機器。
二、第二種爲Throughput GC,是多線程的GC,適用於多CPU,使用大量線程的程序。第二種GC與第一種GC類似,不一樣在於GC在收集Young區是多線程的,但在Old區和第一種同樣,仍然採用單線程。-XX:+UseParallelGC參數啓動該GC。
三、第三種爲Concurrent Low Pause GC,相似於第一種,適用於多CPU,並要求縮短因GC形成程序停滯的時間。這種GC能夠在Old區的回收同時,運行應用程序。-XX:+UseConcMarkSweepGC參數啓動該GC。
四、第四種爲Incremental Low Pause GC,適用於要求縮短因GC形成程序停滯的時間。這種GC能夠在Young區回收的同時,回收一部分Old區對象。-Xincgc參數啓動該GC。

單文件的JVM內存進行設置

默認的java虛擬機的大小比較小,在對大數據進行處理時java就會報錯:java.lang.OutOfMemoryError。
設置jvm內存的方法,對於單獨的.class,能夠用下面的方法對Test運行時的jvm內存進行設置。
java -Xms64m -Xmx256m Test
-Xms是設置堆空間的初始化大小
-Xmx是設置堆空間的最大內存使用量(最好不要超過物理內存大小)

tomcat啓動jvm內存設置

Linux:

在Linux下,修改$CATALINA_HOME/bin目錄下的腳本catalina.sh:  JAVA_OPTS='-Xms512m -Xmx1024m'要加「m」說明是MB,不然就是KB了,在啓動tomcat時會報內存不足。

 Windows下修改catalina.bat腳本:  set JAVA_OPTS=-Xms128m -Xmx350m。 若是用startup.bat啓動tomcat, 設置生效——夠成功的分配200M左右的內存;可是若是不是執行startup.bat啓動tomcat, 而是利用windows的系統服務啓動tomcat服務, 那麼上面的設置就不生效了, 就是說set JAVA_OPTS=-Xms128m -Xmx350m 沒起做用.由於windows服務執行的是$CATALINA_HOME\bin\tomcat.exe,它讀取註冊表中的值,而不是catalina.bat的設置. 解決辦法是修改註冊表

HKEY_LOCAL_MACHINE\SOFTWARE\Apache Software Foundation\Tomcat Service Manager\Tomcat5\Parameters\JavaOptions

原值爲

-Dcatalina.home="C:\ApacheGroup\Tomcat 5.0" -Djava.endorsed.dirs="C:\ApacheGroup\Tomcat 5.0\common\endorsed" -Xrs加入 -Xms300m -Xmx350m

重起tomcat服務,設置生效.

weblogic啓動jvm內存設置

在weblogic中,能夠在startweblogic.cmd中對每一個domain虛擬內存的大小進行設置,默認的設置是在commEnv.cmd裏面。

JBoss

默承認以使用的內存爲64MB 
$JBOSSDIR$/bin/run.config 
JAVA_OPTS = "-server -Xms128 -Xmx512"

Eclipse

在所在目錄下,鍵入 
eclipse.exe -vmargs -Xms256m -Xmx512m 
256m表示JVM堆內存最小值 
512m表示JVM堆內存最大

Websphere

進入控制檯去設置:應用程序服務器 > server1 > 進程定義 > Java 虛擬機

相關文章
相關標籤/搜索