在linux環境下配置項目運行環境時,部署的人員都會分配一下內存,以保證程序正常的運行。其實在開發的時候(window系統),就已經涉及到內存分配了,只是這些參數有默認值,因此一直沒有去重視它。
以Myeclipse為例,在Preferences->Java->Installed JREs下面,就有設置jvm內存分配。
這里我們就可以配置內存,一般我們見到的都是
-Xms128m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=512m
linux中一般為:
-vmargs -Xms128m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=512m
但是這一串究竟是什么意思,這里就給大家講解一下。
按照官方的說法:Java 虛擬機具有一個堆(Heap),堆是運行時數據區域,所有類實例和數組的內存均從此處分配。堆是在 Java 虛擬機啟動時創建的,在JVM中堆之外的內存稱為非堆內存(Non-heap memory)。
簡單的說就是:堆是java代碼可及的內存,開發人員寫的東西都是堆分配的內存(底層實現除外)。而非堆內存則是JVM自己用的,比如JVM內部處理或優化,垃圾處理,常數池等。
堆的內存分配用-Xms和-Xmx
-Xms分配堆最小內存,默認為物理內存的1/64;-Xmx分配最大內存,默認為物理內存的1/4。
非堆內存分配用-XX:PermSize和-XX:MaxPermSize
-XX:PermSize分配非堆最小內存,默認為物理內存的1/64;-XX:MaxPermSize分配最大內存,默認為物理內存的1/4。
因此,合理的內存分配是程序正常穩定的運行的基礎。不然內存溢出可就麻煩了。