java虛擬機使用內存的思考(轉載)

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=2java

相關文章
相關標籤/搜索