文章來源: http://www.cnblogs.com/guozp/p/7845605.html
1、雖然你jvm參數設置了-Xms6g -Xmx6g,但操作系統不並會馬上分配6G的物理內存,而是確實要使用了才分配。所以就內存使用率在應用啟動的時候,就相對較低,后續會出現攀爬現象。
2、為什么我們系統進程占用的物理內存(Res/Rss)會遠遠大於設置的Xmx值,比如Xmx設置1.7G,但是top看到的Res的值卻達到了3.0G?
-Xms :初始堆大小 此值可以設置與-Xmx相同,以避免每次垃圾回收完成后JVM重新分配內存。
-Xmx :最大堆大小
以上配置只用於指定Java heap的大小,不包括持久代,也不包括CodeCache和堆外內存,JVM本身,還有一些其他內存也不會算在內等,你看的“占用內存量”是進程的private working set,這包括該進程所有獨占(不與其它進程共享)的內存,不只是Java heap,因此理論上我們看到物理內存大於Xmx也是可能的,不過超過太多估計就可能有問題了。
或者這么理解:
JVM的內存分為兩部分,本地內存+Heap內存(Java程序在運行過程中的對象是保存在JVM的堆內存中的) ,首先JVM本身是一個應用程序,一般是通過C、C++實現的,這個程序要運行,是一定要向操作系統申請內存的,維持這個進程正常運行的內存,即可以理解成本地內存。
JVM本身要對堆內存進行維護和管理,還負責垃圾回收,這些也同時會消耗本地內存,JVM在啟動過程中,會依賴一些動態庫,這同樣也消耗本地內存。
-Xmx 這個只是用於設置堆內存的大小,而JVM運行過程中到底會向操作系統申請多少內存,這個是由JVM在運行過程中動態決定的,我們無法設置
文章來源: http://www.cnblogs.com/guozp/p/7845605.html