天天看點

java虛拟機占用記憶體_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=2