JVM(java虛擬機)其實就是操作系統(如windows)上的一個普通程序(進程名叫java,這個程序可以解釋執行class文件)。
當java進程啟動時會首先分配一塊堆內存(最小內存),以后每當class字節碼程序要求JVM(java進程)分配內存時,JVM
就會在預先分配的那塊內存上面為class字節碼程序分配內存,當預先分配的那塊內存用沒時,JVM會再向操作系統要內存
(物理內存), 但是JVM不會無限制的向操作系統要內存,當它占用的實際堆內存達到一個預定值(最大可用內存)時,
如果class字節碼程序還向JVM要內存,并且JVM無法通過回收當前堆中的內存來為class字節碼程序服務時,它就會給程
序拋出java.lang.OutOfMemoryError。其中內存回收時機并不是再用掉內存達到最大可用內存時才進行,他的運行時機是
不確定的,可見JVM的最大可用內存就是你的java程序(class字節碼程序)能夠使用的最大內存。
例如:你把jvm最大可用內存設為200M,而你的物理內存1G.在這種程序下你的class程序最多能使用200M內存,雖然你可能
還有800M內存可用,但是當你的程序用掉200M后如果再要內存,JVM不會因為你還有800M內存而為你分配內存,他會向你拋
出java.lang.OutOfMemoryError .
所以JVM最大可用內存參數比較重要。
一般建議堆的最大值設置為可用內存的最大值的80%。
(以下為轉網絡)
Tomcat默認可以使用的內存為64MB,在較大型的應用項目中,這點內存是不夠的,需要調大。
Windows下,在文件{tomcat_home}/bin/catalina.bat,Unix下,在文件{tomcat_home}/bin/catalina.sh的前面,
增加如下設置:
set JAVA_OPTS=-Xms【初始化內存大小】 -Xmx【可以使用的最大內存】
需要把這個兩個參數值調大。例如: set JAVA_OPTS=-Xms64m -Xmx256m
表示初始化內存為256MB,可以使用的最大內存為512MB。
另外需要考慮的是Java提供的垃圾回收機制。虛擬機的堆大小決定了虛擬機花費在收集垃圾上的時間和頻度。收集垃圾可
以接受的速度與應用有關,應該通過分析實際的垃圾收集的時間和頻率來調整。如果堆的大小很大,那么完全垃圾收集就
會很慢,但是頻度會降低。如果你把堆的大小和內存的需要一致,完全收集就很快,但是會更加頻繁。調整堆大小的的目
的是最小化垃圾收集的時間,以在特定的時間內最大化處理客戶的請求。在基準測試的時候,為保證最好的性能,要把堆
的大小設大,保證垃圾收集不在整個基準測試的過程中出現。
如果系統花費很多的時間收集垃圾,請減小堆大小。一次完全的垃圾收集應該不超過 3-5 秒。如果垃圾收集成為瓶頸,那
么需要指定代的大小,檢查垃圾收集的詳細輸出,研究 垃圾收集參數對性能的影響。一般說來,你應該使用物理內存
的 80% 作為堆大小。當增加處理器時,記得增加內存,因為分配可以并行進行,而垃圾收集不是并行的。
-Xms : 應用程序初始化內存大寫,注意是你的某一個應用程序,多個應用程序將生成多個JVM實例
-Xmx: 應用程序占用內存的最大值,將不能超過這個值,否則可能導致OutOfMemory.
-XX:NewRatio old generation/new generation 的比例
推薦的-Xms -Xmx設置成一樣,,為系統內存的80%.這樣,不用每次GC清理完再重新分配.
而-XX:NewRatio為2 比如: -Xms384m -Xmx384m -XX:NewRatio=2