本文向大家簡單介紹一下進行JVM內存設置幾種方法
安裝Java開發軟件時
默認安裝包含兩個文件夾
一個JDK(Java開發工具箱)
一個JRE(Java運行環境
內含JVM)
其中JDK內另含一個JRE
如果只是運行Java程序
則JRE已足夠
而JDK則只有開發人員才用到
這裡將為大家介紹設置JVM內存分配的幾招
Eclipse中JVM內存設置
eclipse
ini內存設置
vmargs
Xms
M
Xmx
M
XX:PermSize=
M
XX:MaxPermSize=
M
這裡有幾個問題
各個參數的含義什麼?
為什麼有的機器我將
Xmx和
XX:MaxPermSize都設置為
M之後Eclipse可以啟動
而有些機器無法啟動?
為何將上面的參數寫入到eclipse
ini文件Eclipse沒有執行對應的設置?
下面我們對這些問題一一進行回答
相信通過對這些問題的解釋你對JVM內存設置也就有了一定的認識
各個參數的含義什麼?
參數中
vmargs的意思是設置JVM參數
所以後面的其實都是JVM的參數了
我們首先了解一下JVM內存管理的機制
然後再解釋每個參數代表的含義
堆(Heap)和非堆(Non
heap)內存
按照官方的說法
Java虛擬機具有一個堆
堆是運行時數據區域
所有類實例和數組的內存均從此處分配
堆是在Java虛擬機啟動時創建的
在JVM中堆之外的內存稱為非堆內存(Non
heapmemory)
可以看出JVM主要管理兩種類型的內存
堆和非堆
簡單來說堆就是Java代碼可及的內存
是留給開發人員使用的
非堆就是JVM留給自己用的
所以方法區
JVM內部處理或優化所需的內存(如JIT編譯後的代碼緩存)
每個類結構(如運行時常數池
字段和方法數據)以及方法和構造方法的代碼都在非堆內存中
堆內存分配
JVM初始分配的內存由
Xms指定
默認是物理內存的
/
;JVM最大分配的內存由
Xmx指定
默認是物理內存的
/
默認空余堆內存小於
%時
JVM就會增大堆直到
Xmx的最大限制
空余堆內存大於
%時
JVM會減少堆直到
Xms的最小限制
因此服務器一般設置
Xms
Xmx相等以避免在每次GC後調整堆的大小
非堆內存分配
JVM使用
XX:PermSize設置非堆內存初始值
默認是物理內存的
/
;由XX:MaxPermSize設置最大非堆內存的大小
默認是物理內存的
/
JVM內存限制(最大值)
首先JVM內存限制於實際的最大物理內存(廢話!呵呵)
假設物理內存無限大的話
JVM內存的最大值跟操作系統有很大的關系
簡單的說就
位處理器雖然可控內存空間有
GB
但是具體的操作系統會給一個限制
這個限制一般是
GB
GB(一般來說Windows系統下為
G
G
Linux系統下為
G
G)
而
bit以上的處理器就不會有限制了
為什麼有的機器我將
Xmx和
XX:MaxPermSize都設置為
M之後Eclipse可以啟動
而有些機器無法啟動?
通過上面對JVM內存管理的介紹我們已經了解到JVM內存包含兩種
堆內存和非堆內存
另外JVM最大內存首先取決於實際的物理內存和操作系統
所以說設置VM參數導致程序無法啟動主要有以下幾種原因
)參數中
Xms的值大於
Xmx
或者
XX:PermSize的值大於
XX:MaxPermSize;
)
Xmx的值和
XX:MaxPermSize的總和超過了JVM內存的最大限制
比如當前操作系統最大內存限制
或者實際的物理內存等等
說到實際物理內存這裡需要說明一點的是
如果你的內存是
MB
但實際系統中用到的並不可能是
MB
因為有一部分被硬件占用了
為何將上面的參數寫入到eclipse
ini文件Eclipse沒有執行對應的設置?
那為什麼同樣的參數在快捷方式或者命令行中有效而在eclipse
ini文件中是無效的呢?這是因為我們沒有遵守eclipse
ini文件的設置規則
參數形如
項值
這種形式
中間有空格的需要換行書寫
如果值中有空格的需要用雙引號包括起來
比如我們使用
vmC:\Java\jre
\bin\javaw
exe參數設置虛擬機
在eclipse
ini文件中要寫成這樣
vm
C:\Java\jre
\bin\javaw
exe
按照上面所說的
最後參數在eclipse
ini中可以寫成這個樣子
vmargs
Xms
M
Xmx
M
XX:PermSize=
M
XX:MaxPermSize=
M
實際運行的結果可以通過Eclipse中
Help
AboutEclipseSDK
窗口裡面的
ConfigurationDetails
按鈕進行查看
另外需要說明的是
Eclipse壓縮包中自帶的eclipse
ini文件內容是這樣的
showsplash
org
eclipse
platform
launcher
XXMaxPermSize
m
vmargs
Xms
m
Xmx
m
其中–launcher
XXMaxPermSize(注意最前面是兩個連接線)跟
XX:MaxPermSize參數的含義基本是一樣的
我覺得唯一的區別就是前者是eclipse
exe啟動的時候設置的參數
而後者是eclipse所使用的JVM中的參數
其實二者設置一個就可以了
所以這裡可以把–launcher
XXMaxPermSize和下一行使用#注釋掉
其他的啟動參數
如果你有一個雙核的CPU
也許可以嘗試這個參數
XX:+UseParallelGC
讓GC可以更快的執行
(只是JDK
裡對GC新增加的參數)
From:http://tw.wingwit.com/Article/program/Java/hx/201311/26837.html