1. 程式人生 > >Weblogic 10.3.6.0 叢集搭建

Weblogic 10.3.6.0 叢集搭建

Weblogic 叢集搭建

Oracle的Weblogic分開發者版本和生產版本,有32位和64位。一般生產版本的weblogic是64位的,安裝檔案是一個大小為1G多的jar包。去oracle官網上下載64版weblogic。這裡使用的版本是weblogic11g,版本號是10.3.6,檔名為“wls1036_generic.jar”。安裝weblogic前要確認已安裝好jdk(如果安裝的是64位weblogic則需要64位版本的jdk)。目前,weblogic可免費使用,需要oracle的weblogic服務時才需要向Oracle付費買服務,即產品免費服務收費。

安裝weblogic(windows和

Linux操作步驟相同) 
1、在命令列,進入安裝檔案wls1036_generic.jar所在資料夾 
然後輸入命令: Java -jar wls1036_generic.jar 
點選回車後程序會啟動weblogic安裝檔案的圖形安裝介面。 

按下來的安裝和在windows中安裝普通檔案一樣了。 
2、點選“下一步”,到下圖介面,然後輸入weblogic的安裝目錄。(路徑中最好不要有空格)

3、點選“下一步”。到下圖介面,由於我們沒有購買oracle的服務所以去掉下圖中的勾。(目前weblogic可免費使用,需要oracle技術支援的話才需要付費) 

4、點選“下一步”,到下圖介面,會因為我們沒有填寫上圖的的支援資訊而彈出兩個警告框,直接“YES”通過即可。進入下圖,勾選下面的框(不需要使用驗證) 

5、然後點選“繼續”。到下圖介面,選擇“典型”和“定製”都可以,根據自己喜好設定 

6、選擇後點擊“下一步”,進入下圖介面,如果沒有顯示jdk資訊,則手動點選“瀏覽”選擇自己機器上安裝的jdk,一般預設顯示出來的就已經是自己機口上安裝的了(貌似是根據環境變數裡的JAVA_HOME獲取的)

7、點選“下一步”進入下圖介面,不用修改,直接點選“下一步”即可 

8、然後會顯示出我們準備安裝的元件資訊,直接點選“下一步” 

9、然後就開始安裝了

10、安裝完成了,這裡有勾選“執行 Quickstart”表示安裝完成後開啟域建立和配置介面。點選“完成”按鈕完成weblogic主程式的安裝 

域建立及配置(這裡只建立叢集管理端,節點稍後在控制檯的頁面上建立) 
如果步驟一中完成安裝時有勾選“執行Quickstart”則接著會直接開啟域建立和配置介面。如果沒有勾“執行Quickstart”,則我們在資料夾(根據自己的安裝路徑找到對應的位置) 
D:\Program_Files\Oracle\Middleware\wlserver_10.3\common\bin 
下面,雙擊config.cmd檔案啟動域建立和配置介面(linux系統則是雙擊執行config.sh檔案) 
這裡寫圖片描述 
1、如上圖所示,選擇“建立新的WebLogic域”,然後點選“下一步” 
這裡寫圖片描述

2、如上圖所示,預設即可,點選“下一步” 
這裡寫圖片描述 
3、如上圖所示,填寫要建立的域的名字,這裡名字取為portal_domain;和選擇域檔案要儲存的位置(位置一般預設即可),然後點選“下一步” 
這裡寫圖片描述 
4、如上圖所示,設定要建立的域的使用者名稱和密碼(注意:要記住該使用者名稱和密碼,啟動域和登入控制檯時都會用到)。然後點選“下一步” 
這裡寫圖片描述 
5、如上圖所示。生產環境要選擇“生產模式”,選擇JDK(“可用JDK”下面的框中一般會顯示自己安裝的JDK並預設使用這個。貌似是從系統環境變數JAVA_HOME取的值,但沒有試驗過還不確定。生產環境使用weblogic Jrockit的JDK會獲得比較好的效能,根據論壇裡的說法,weblogic Jrockit的JDK會比sun的jdk快20%。 不太懂Jrockit Jdk配置,所以這裡我們還是用sun的jdk了)。然後點選“下一步” 
這裡寫圖片描述 
6、建立管理端。如上圖所示。勾選“管理伺服器”,然後點選“下一步”(勾選“管理伺服器”表示建立的域為管理伺服器,勾選“受管伺服器、叢集和計算機”表示該域是受管伺服器。如果前面兩個都勾選上則表示建立的域即含有管理伺服器又含有受管伺服器。所以這裡我們只勾選了“管理伺服器”,表示我們要建立的該域僅僅做為管理端使用。建立叢集時管理端最好獨立出來,因為如果一個域同時包含管理端和受管理端的話,當我們需要重啟服務時就會同時重啟管理端,這樣我們無法在頁面的節點管理器裡直接啟動包含管理端的節點,而管理端獨立出來則可以避免這種情況的發生,維護時直接在控制檯對節點進行重啟就可以了) 
這裡寫圖片描述 
7、如上圖所示。為域的管理端填入名稱(我們這裡使用了預設的AdminServer),“Listen address”預設為監聽本機上所有的IP(這裡預設即可,一般表示localhost,127.0.0.1或者IPv6中的0:0:0:0:0:0:0:1),“Listen port”表示監聽本機的埠,一般大家喜歡把管理埠設定為9001。我們這裡不需要SSL加密所以沒有勾選該項。然後點選“下一步”(如上圖設定,我們本機訪問域的控制檯的url就是http://localhost:9001/console ,其它機器就訪問http://IP地址:9001/console),然後進入到最後的安裝確認頁面 
這裡寫圖片描述 
8、如上圖。點選“建立”開始建立域 
這裡寫圖片描述 
9、如上圖所示,點選“完成”完成域管理端的建立。

啟動weblogic叢集管理端,建立叢集,併為叢集建立和新增節點。

如果步驟二最後一步中勾選了“啟動管理服務端”,則點選完成後會直接啟動叢集的服務端。如果沒有勾選“啟動管理服務端”,則我們需要進入路徑 
D:\Program_Files\Oracle\Middleware\user_projects\domains\portal_domain\bin 
雙擊startWebLogic.cmd啟動服務(linux系統則是雙擊執行startWebLogic.sh),啟動時需要輸入我們前面(步驟二 4中)設定的域的的使用者名稱和密碼。 
注:上面路徑中portal_domain是我們上面步驟二 3中設定的“域名”,根據自己設定的域名進入對應的路徑 
1、如下圖所示,啟動時會提示輸入域的使用者名稱和密碼 
這裡寫圖片描述 
2、啟動後,開啟瀏覽器,輸入http://localhost:7001/console (其中9001是我們步驟二 7中配置的叢集管理端的埠號),如下圖所示,輸入剛才啟動時輸入的使用者名稱和密碼,點選“登入” 
這裡寫圖片描述 
3、進入控制檯頁面。如下圖,點左側導航樹的“環境”-“叢集”;然後點選左上角的“鎖定伺服器”按鈕(生產模式需要點選這個按鈕才可以對其下的功能進行更新) 

這裡寫圖片描述 
4、如下圖所示,點選“新建”按鈕來建立一個叢集。如下圖所示,給叢集取個名稱,其它的保持預設即可。點選“確定”完成叢集的建立。(下面建立節點,並新增到叢集中) 
這裡寫圖片描述 
5、如下圖,點選“啟用更改”按鈕把剛才建立的叢集儲存到weblogic中。 
這裡寫圖片描述 
6、如下圖所示。點選左側樹的“環境”- “伺服器”。並點選左上角的“鎖定並編輯”按鈕。點選“新建”按鈕建立一個新的節點 
這裡寫圖片描述

7、進入節點建立介面,如下圖所示。如下圖所示,為節點取個名字,配置節點的埠為7001,單選框選擇“應屬於, 使此伺服器成為某個現有叢集的成員”把該節點加入剛才我們建立的叢集。然後點選“下一步”進入完成確認頁面。 
注:埠7001表示,該節點上服務我們通過7001來訪問,對應的URL類似於http://localhost:7001服務路徑….。該埠一般是遞增的,比如第一個節點配置的埠是7001,那麼第二個節點埠一般配置為7002,第三個節點埠配置為7003… 
這裡寫圖片描述 
8、如下圖所示。點選“完成”按鈕完成節點的建立。 
這裡寫圖片描述 
9、如下圖所示。節點建立完成,頁面中顯示了節點的名稱、所屬的叢集、節點監聽的埠號資訊。 生產模式中一定不要忘記點選“啟用更改”按鈕使配置生效 
這裡寫圖片描述 
10、按照上面的方法我們再建立兩個節點,並加入叢集中。如下圖所示,我們建立了一個管理端,和三個節點的叢集 
這裡寫圖片描述

啟動叢集 
到這裡叢集主要的配置已經完成,叢集已經可以正常的啟動並工作了。 
(但是這樣維護起來會比較麻煩,比如重啟節點每次都要登入伺服器在命令列中手動啟動。配置節點管理器之後,就可以直接在頁面控制檯上對節點進行停止和啟動,詳細設定檢視“配置節點管理器”小節) 
1、啟動叢集必需首先啟動域的管理端 
(由於我們上面已經啟動管理端,所以這裡就不再啟動了,只把方法列出來)

進入命令列,並進入如下路徑(根據自己的安裝目錄進入對應位置), 
cd D:\Program_Files\Oracle\Middleware\user_projects\domains\portal_domain\bin 
輸入如下命令啟動weblogic管理端 
startWeblogic.cmd (linux中使用 ./startWeblogic.sh來啟動)

2、啟動各節點。注:節點的啟動必需在管理端啟動完成後才能啟動。 
進入命令列,並進入如下路徑(根據自己的安裝目錄進入對應位置), 
cd D:\Program_Files\Oracle\Middleware\user_projects\domains\portal_domain\bin 
輸入如下 
startManagerWeblogic server_7001 t3://localhost:9001 
(linux中使用 ./startManagerWeblogic server_7001 t3://localhost:9001)

說明:上面的命令中,startManagerWeblogic.cmd 是啟動節點的指令碼 
(linux中為startManagerWeblogic.sh);server_7001是我們上面建立的節點名稱; 
t3://localhost:9001這個表示節點server_7001指向本機(localhost)的管理端,其中的t3是weblogic的協議類似於http。如果管理端不在本機上則這裡的localhost換成目標機器IP,埠換成目標機器管理端埠即可。

注意啟動節點時會提示輸入使用者名稱和密碼

3、依次啟動各節點。當我們啟動完成後再次點選頁面控制檯左側樹“環境”- “伺服器”可以檢視到三個節點的狀態已經改變為RUNNING, 
這裡寫圖片描述

4、點選左側導航樹的“部署”進入工程部署頁面。在這裡就可以部署我們的war包或者工程原始碼了。

配置啟動時免輸入密碼 
當我們第一次啟動每一個節點時,weblogic會在 
D:\Program_Files\Oracle\Middleware\user_projects\domains\portal_domain\servers 
目錄下建立各節點對應的資料夾(資料夾的名字和節點名相同),如下圖。AdminServer是管理端的資料夾,server_7001,server_7002,server_7003分別對應我們建立的三個節點。 
這裡寫圖片描述

1、設定管理端啟動時(startWeblogic.cmd啟動時)免輸入密碼 
進入管理端的資料夾 
Cd D:\Program_Files\Oracle\Middleware\user_projects\domains\portal_domain\servers\AdminServer 
在該目錄下新建一個名為security的資料夾,進入該資料夾,新建一個名為boot.properties的檔案 
即檔案boot.properties檔案在路徑 
D:\Program_Files\Oracle\Middleware\user_projects\domains\portal_domain\servers\AdminServer\security 
下面。檔案boot.properties中寫入兩行 
username=建立域時設定的使用者名稱 
password=建立域時設定的密碼 
儲存。完成。 
注:再次啟動該管理端時boot.properties檔案中的使用者名稱和密碼會被加密。所以不用擔心密碼洩露的情況發生 
2、設定節點啟動時(startManageWeblogic.cmd server_7001 t3://localhost:9001),免輸入密碼,這裡首先設定名為server_7001節點 
進入管理端的資料夾 
Cd D:\Program_Files\Oracle\Middleware\user_projects\domains\portal_domain\servers\server_7001 
在該目錄下新建一個名為security的資料夾,進入該資料夾,新建一個名為boot.properties的檔案 
即檔案boot.properties檔案在路徑 
D:\Program_Files\Oracle\Middleware\user_projects\domains\portal_domain\servers\server_7001\security 
下面。檔案boot.properties中寫入兩行 
username=建立域時設定的使用者名稱 
password=建立域時設定的密碼 
儲存。完成。 
注:再次啟動該管理端時boot.properties檔案中的使用者名稱和密碼會被加密。所以不用擔心密碼洩露的情況發 
3、按照上面步驟2的方法把節點server_7002、和節點server_7003都設定一下。 
再次啟動伺服器端或者各節點的時候就不再需要輸入使用者名稱和密碼了。

配置節點管理器 
節點管理器可以在控制檯中對各節點進行關閉和重啟,所以需要各節點是免輸入密碼的,所以進行該步驟配置時需要確定各節點是免輸入密碼的。具體方法參考“五、配置啟動時免輸入密碼” 
首先關閉各節點。點選左側導航樹“環境”-“伺服器”- 主頁面“控制”,然後勾選三個節點server_7001、server_7002、server_7003,點選“關閉”-點選“立即強制重啟”關閉節點 
這裡寫圖片描述

1、建立計算機 (計算機中有節點管理器)。 
如下圖所示點選左側導航樹中的“計算機”,並點選左上角的“鎖定並編輯”按鈕,並點選中間主頁面的“建立”按鈕來建立一個計算機 
這裡寫圖片描述 
2、如下圖所示。給計算機取個名稱(根據自己喜好取,即好容易辨認,比如machine_56)。計算機作業系統選擇預設的“其它”。(因為我們的作業系統一般都是linux或者windows,如果是UNIX作業系統則選擇UNIX)然後點選“下一步”繼續 
這裡寫圖片描述 
3、如下圖所示型別選擇“普通”,(因為我們沒有開戶預設的SSL所以這裡選擇了普通)點選“完成” 
這裡寫圖片描述 
4、如下圖所示。先不要點選“啟用更改”。在中間的主頁面點選剛才建立的計算機名稱“machine_localhost” 
這裡寫圖片描述 
5、如下圖所示,點選“伺服器”選單,然後再點選下面的“新增”按鈕為計算機新增節點(也叫伺服器) 
這裡寫圖片描述 
6、如下圖所示。單選框選擇第一個“選擇現有的伺服器, 並將它與此計算機關聯”,選擇伺服器一行,先選擇管理端“AdminServer”,然後點選“下一步”或者“完成”按鈕完成管理端的新增 
這裡寫圖片描述 
7、如下圖所示。再次點選“新增”按鈕,新增server_7001節點,然後重複該操作把剩下的節點都新增到該計算機中來。 
這裡寫圖片描述 
8、如下圖所示。點選“啟用更改”完成計算機的建立及配置。 
這裡寫圖片描述 
9、如下圖所示。點選左上角“鎖定並編輯”按鈕進入編輯模式。然後點選左側導航樹“環境”-“伺服器”-中間主頁面中點選“server_7001” 
這裡寫圖片描述 
10、如下圖所示。點選“伺服器啟動”選單項。各項引數配置為(根據自己的機器設定對應的路徑) 
Java主目錄: D:/Program_Files/java/jdk1.6.0_45 
Java供應商: sun 
BEA 主目錄: D:/Program_Files/Oracle/Middleware 
根目錄: D:/Program_Files/Oracle/Middleware/user_projects/domains/portal_domain 
類路徑: D:/Program_Files/Oracle/Middleware/wlserver_10.3/server/lib/weblogic.jar 
引數: (注:引數一欄設定為空) 
安全策略檔案: D:/Program_Files/Oracle/Middleware/wlserver_10.3/server/lib/weblogic.policy 
下面的使用者名稱,密碼,確認密碼,輸入建立域時的設定的使用者名稱和密碼。然後點選“儲存” 
這裡寫圖片描述 
11、如下圖所示。點選“啟用更改”按鈕啟用剛才的設定 
這裡寫圖片描述 
12、重複上述操作,完成其它結點的設定。 
13、修改weblogic 節點管理器引數 
首先啟動節點管理器,在命令列中進入目錄 
D:\Program_Files\Oracle\Middleware\wlserver_10.3\server\bin 
執行指令碼startNodeManager.cmd (linux伺服器使用指令碼startNodeManager.sh),命令為 
startNodeManager.cmd (linux伺服器中為 ./startNodeManager.sh) 
啟動完成後。關閉它。(啟動的目的是讓節點管理器生成自己的配置檔案,第一次啟動時會生成) 
進入資料夾D:\Program_Files\Oracle\Middleware\wlserver_10.3\common\nodemanager 
開啟節點管理器配置檔案nodemanager.properties, 
把StartScriptEnabled=false這一行修改為StartScriptEnabled=true,(個人理解,意思是weblogic允許通過指令碼啟動節點)。 
然後再次啟動節點管理器 
14、下面我們就可以在控制檯的頁面上關閉和啟動各節點了。如下圖所示,點選左側導航樹的“環境”- “伺服器”,然後點選中間主頁面的“控制”,然後勾選需要啟動的節點,然後點選“啟動” 
這裡寫圖片描述 
15、如下圖所示。點選“是”開始啟動節點。 
這裡寫圖片描述 
16、之後我們可以點選左側導航樹的“環境”- “伺服器”重新整理頁面,檢視各節點的狀態,檢視各節點是否完成啟動。如下圖所示表示各節點完成了啟動。 
這裡寫圖片描述 
17、關閉節點。 
點選上圖的控制,勾選需要關閉的節點,然後點選“關閉”- “立即強制關閉”可以關閉節點。注意:不要關閉控制端(AdminServer),如果把AdminServer也關閉了,那我們需要登入伺服器,手動啟動管理端。

另外需要注意的是:我們使用節點管理器全新啟動weblogic的時候正確順序是,先啟動管理端(startWeblogic.sh),然後再啟動節點管理器(startNodeManager.sh),然後登入控制檯啟動各節點。

Weblogic的優化

根據weblogic論壇查詢到的資料,整理如下。 
1、記憶體優化 
首先確定JDK支援的記憶體大小。各個jdk版本在不同作業系統中支援的最大記憶體是不一樣的,但是可以通過以下方法來進行測試。 
java -XmxXXXm(g) -version 
其中,XXX為最大記憶體數值, m(g)是記憶體的計量單位,如果命令能夠正確顯示出jdk的版本等資訊,說明當前jdk支援測試的最大記憶體數量,否則說明測試的記憶體超出了jdk支援的最大值。 
例如 java -Xmx1024m -version 或者 java -Xmx2g -version 
測試發現一般在32位機器上,windows作業系統該最大值位於1.5G-2G之間,linux作業系統該最大值為2G-3G之間;在64位機器上面應該沒啥限制,經測試寫64G也能正常得出版本資訊

修改方法: 
修改D:/Program_Files/Oracle/Middleware/user_projects/domains/base_domain/bin下的setDomainEnv.cmd檔案(linux上修改setDomainEnv.sh): 
修改前:(如下所示,預設的大小為512m) 
if”%JAVA_VENDOR%”==”Sun” ( 
set WLS_MEM_ARGS_64BIT=-Xms256m -Xmx512m 
set WLS_MEM_ARGS_32BIT=-Xms256m -Xmx512m 
) else ( 
set WLS_MEM_ARGS_64BIT=-Xms512m -Xmx512m 
set WLS_MEM_ARGS_32BIT=-Xms512m -Xmx512m 

setMEM_PERM_SIZE_32BIT=-XX:PermSize=48m 
setMEM_MAX_PERM_SIZE_32BIT=-XX:MaxPermSize=128m

修改後:(這裡給了它最大4G記憶體)

if”%JAVA_VENDOR%”==”Sun” ( 
set WLS_MEM_ARGS_64BIT=-Xms3072m –Xmx4096m 
set WLS_MEM_ARGS_32BIT=-Xms1024m –Xmx1536m 
) else ( 
set WLS_MEM_ARGS_64BIT=-Xms3072m –Xmx4096m 
set WLS_MEM_ARGS_32BIT=-Xms1024m –Xmx1536m 

setMEM_PERM_SIZE_32BIT=-XX:PermSize=288m 
setMEM_MAX_PERM_SIZE_32BIT=-XX:MaxPermSize=768m 
說明:具體修改值根據實際實體記憶體確定 
· -Xmx3550m:設定JVM最大堆記憶體為3550M。 
· -Xms3550m:設定JVM初始堆記憶體為3550M。此值可以設定與-Xmx相同,以避免每次JVM動態分配記憶體所浪費的時間。 
· -XX:PermSize=256M:設定堆記憶體持久化初始值為256M。(貌似是Eclipse等IDE的初始化引數) 
· -XX:MaxPermSize=512M:設定持久化最大值為512M。 
32位操作JDK記憶體系統:最大可設定1.5G,如果設定過大,會導致服務無法啟動 
64位操作JDK記憶體系統:最大設定為實體記憶體的60~80%

關於於JVM記憶體的一些詳細地知識,檢視“附錄I”

2、設定執行緒數

修改weblogic\user_projects\domains\base_domain\bin下的setDomainEnv.cmd中 
在JAVA_OPTIONS中新增如下: 
set JAVA_OPTIONS=%JAVA_OPTIONS%-Dweblogic.threadpool.MinPoolSize=2000 
set JAVA_OPTIONS=%JAVA_OPTIONS%-Dweblogic.threadpool.MaxPoolSize=4000 
說明: 
JDK5.0以後每個執行緒棧大小為1M,但是作業系統對一個程序內的執行緒數還是有限制的,不能無限生成。32位作業系統根據JVM最大堆記憶體設定;64位作業系統經驗值在3000~5000左右。

3、weblogic檔案連線數 
D:\Program_Files\Oracle\Middleware\wlserver_10.3\common\bin(根據自己的機器情況進入對應的路徑)路徑下的commEnv.cmd (linux伺服器為commEnv.sh),檔案中的方法resetFd限制了weblogic開啟的檔案連線數不大於1024,我們把這方法註釋掉以去掉這個限制。在檔案的最後一行由resetFd修改為#resetFd (#號表示註釋)

4、修改linux作業系統的檔案控制代碼數限制(這個未做測試,僅供參考) 
因為linux系統裡都是以檔案來表示的,所以在做高併發的web系統時,修改檔案控制代碼限制那是必須的。 
檢視某個程序使用了的檔案控制代碼數 
# sudo ps -ef | grep java 
root 1663 1 0 02:37 ? 00:00:43 /opt/bitnami/java/bin/java 
從結果中可得知程序的pid,然後根據pid檢視該程序當前使用的檔案控制代碼數 
#sudo ls /proc/1663/fd | wc -l 
1022 
發現控制代碼數一直就停留在1022,同時top檢視發現load持續增高。於是先查看了下當前程序的控制代碼數限制。 
#sudo cat /proc/1663/limits | grep “files” 
Max open files 1024 1024 files 
發現限制卡在這了,於是修改/etc/sysctl.conf檔案,新增一行如下: 
fs.file-max=30720 
儲存。並執行 
#sudo sysctl -p 
然後再檢視就發現已經改過來了。 
Google發現linux系統裡有兩種檔案控制代碼限制,一種是系統級的,一種是使用者級的。 
修改系統級的: www.2cto.com 
#echo “30720” > /proc/sys/fs/file-max 
修改使用者級的: 
#sudo vi /etc/security/limits.conf 
增加如下行: 
* soft nofile 2048 
* hard nofile 32768 
星號表示任何使用者,soft/hard表示軟限制、硬限制。修改/etc/pam.d/login檔案指定使用PAM 
session required /lib/security/pam_limits.so 
不過需要注意的是系統是32位還是64位,若是64位的那就是/lib64/security/pam_limits.so 
上面的修改後,reboot,再次檢視 
#ulimit -n 
30720 
修改成功。

附錄I:關於JVM記憶體的一些知識

Xms Xmx PermSize MaxPermSize 區別

有時我們會遇到Eclipse崩潰的情況,錯誤提示像下面這樣: 
MyEclipse has detected that less than 5% of the 64MB of Perm 
Gen (Non-heap memory) space remains. It is strongly recommended 
that you exit and restart MyEclipse with new virtual machine memory 
paramters to increase this memory. Failure to do so can result in 
data loss. The recommended Eclipse memory parameters are: 
eclipse.exe -vmargs -Xms128M -Xmx512M -XX:PermSize=64M -XX:MaxPermSize=128M

1.引數的含義 
-vmargs -Xms128M -Xmx512M -XX:PermSize=64M -XX:MaxPermSize=128M 
-vmargs 說明後面是VM的引數,所以後面的其實都是JVM的引數了 
-Xms128m JVM初始分配的堆記憶體 
-Xmx512m JVM最大允許分配的堆記憶體,按需分配 
-XX:PermSize=64M JVM初始分配的非堆記憶體 
-XX:MaxPermSize=128M JVM最大允許分配的非堆記憶體,按需分配

我們首先了解一下JVM記憶體管理的機制,然後再解釋每個引數代表的含義。

1)堆(Heap)和非堆(Non-heap)記憶體

按照官方的說法:“Java 虛擬機器具有一個堆,堆是執行時資料區域,所有類例項和陣列的記憶體均從此處分配。堆是在 Java 虛擬機器啟動時建立的。”“在JVM中堆之外的記憶體稱為非堆記憶體(Non-heap memory)”。 
可以看出JVM主要管理兩種型別的記憶體:堆和非堆。簡單來說堆就是Java程式碼可及的記憶體,是留給開發人員使用的;非堆就是JVM留給自己用的, 
所以方法區、JVM內部處理或優化所需的記憶體(如JIT編譯後的程式碼快取)、每個類結構(如執行時常數池、欄位和方法資料)以及方法和構造方法的程式碼都在非堆記憶體中。

堆記憶體分配

JVM初始分配的堆記憶體由-Xms指定,預設是實體記憶體的1/64;JVM最大分配的堆記憶體由-Xmx指定,預設是實體記憶體的1/4。預設空餘堆記憶體小於40%時,JVM就會增大堆直到-Xmx的最大限制; 
空餘堆記憶體大於70%時,JVM會減少堆直到-Xms的最小限制。因此伺服器一般設定-Xms、-Xmx 相等以避免在每次GC 後調整堆的大小。 
說明:如果-Xmx 不指定或者指定偏小,應用可能會導致java.lang.OutOfMemory錯誤,此錯誤來自JVM,不是Throwable的,無法用try…catch捕捉。

非堆記憶體分配

JVM使用-XX:PermSize設定非堆記憶體初始值,預設是實體記憶體的1/64;由XX:MaxPermSize設定最大非堆記憶體的大小,預設是實體記憶體的1/4。(還有一說:MaxPermSize預設值和-server -client選項相關, 
-server選項下預設MaxPermSize為64m,-client選項下預設MaxPermSize為32m。這個我沒有實驗。) 
上面錯誤資訊中的PermGen space的全稱是Permanent Generation space,是指記憶體的永久儲存區域。還沒有弄明白PermGen space是屬於非堆記憶體,還是就是非堆記憶體,但至少是屬於了。 
XX:MaxPermSize設定過小會導致java.lang.OutOfMemoryError: PermGen space 就是記憶體益出。 
說說為什麼會記憶體益出: 
(1)這一部分記憶體用於存放Class和Meta的資訊,Class在被 Load的時候被放入PermGen space區域,它和存放Instance的Heap區域不同。 
(2)GC(Garbage Collection)不會在主程式執行期對PermGen space進行清理,所以如果你的APP會LOAD很多CLASS 的話,就很可能出現PermGen space錯誤。 
這種錯誤常見在web伺服器對JSP進行pre compile的時候。

2)JVM記憶體限制(最大值)

首先JVM記憶體限制於實際的最大實體記憶體,假設實體記憶體無限大的話,JVM記憶體的最大值跟作業系統有很大的關係。簡單的說就32位處理器雖然可控記憶體空間有4GB,但是具體的作業系統會給一個限制, 
這個限制一般是2GB-3GB(一般來說Windows系統下為1.5G-2G,Linux系統下為2G-3G),而64bit以上的處理器就不會有限制了。

  1. 為什麼有的機器我將-Xmx和-XX:MaxPermSize都設定為512M之後Eclipse可以啟動,而有些機器無法啟動? 
    通過上面對JVM記憶體管理的介紹我們已經瞭解到JVM記憶體包含兩種:堆記憶體和非堆記憶體,另外JVM最大記憶體首先取決於實際的實體記憶體和作業系統。所以說設定VM引數導致程式無法啟動主要有以下幾種原因: 
    1) 引數中-Xms的值大於-Xmx,或者-XX:PermSize的值大於-XX:MaxPermSize; 
    2) -Xmx的值和-XX:MaxPermSize的總和超過了JVM記憶體的最大限制,比如當前作業系統最大記憶體限制,或者實際的實體記憶體等等。說到實際實體記憶體這裡需要說明一點的是, 
    如果你的記憶體是1024MB,但實際系統中用到的並不可能是1024MB,因為有一部分被硬體佔用了。

  2. 為何將上面的引數寫入到eclipse.ini檔案Eclipse沒有執行對應的設定? 
    那為什麼同樣的引數在快捷方式或者命令列中有效而在eclipse.ini檔案中是無效的呢?這是因為我們沒有遵守eclipse.ini檔案的設定規則: 
    引數形如“項 值”這種形式,中間有空格的需要換行書寫,如果值中有空格的需要用雙引號包括起來。比如我們使用-vm C:/Java/jre1.6.0/bin/javaw.exe引數設定虛擬機器, 
    在eclipse.ini檔案中要寫成這樣: 
    -vm 
    C:/Java/jre1.6.0/bin/javaw.exe 
    -vmargs 
    -Xms128M 
    -Xmx512M 
    -XX:PermSize=64M 
    -XX:MaxPermSize=128M 
    實際執行的結果可以通過Eclipse中“Help”-“About Eclipse SDK”窗口裡面的“Configuration Details”按鈕進行檢視。 
    另外需要說明的是,Eclipse壓縮包中自帶的eclipse.ini檔案內容是這樣的: 
    -showsplash 
    org.eclipse.platform 
    –launcher.XXMaxPermSize 
    256m 
    -vmargs 
    -Xms40m 
    -Xmx256m 
    其中–launcher.XXMaxPermSize(注意最前面是兩個連線線)跟-XX:MaxPermSize引數的含義基本是一樣的,我覺得唯一的區別就是前者是eclipse.exe啟動的時候設定的引數, 
    而後者是eclipse所使用的JVM中的引數。其實二者設定一個就可以了,所以這裡可以把–launcher.XXMaxPermSize和下一行使用#註釋掉。

  3. 其他的啟動引數。 如果你有一個雙核的CPU,也許可以嘗試這個引數: 
    -XX:+UseParallelGC 
    讓GC可以更快的執行。(只是JDK 5裡對GC新增加的引數)

補充: 
  如果你的WEB APP下都用了大量的第三方jar,其大小超過了伺服器jvm預設的大小,那麼就會產生記憶體益出問題了。 
解決方法: 設定MaxPermSize大小 
可以在myelipse裡選中相應的伺服器比如tomcat5,展開裡面的JDK子項頁面,來增加伺服器啟動的JVM引數設定: 
-Xms128m 
-Xmx256m 
-XX:PermSize=128M 
-XX:MaxNewSize=256m 
-XX:MaxPermSize=256m 
或者手動設定MaxPermSize大小,比如tomcat, 
修改TOMCAT_HOME/bin/catalina.bat,在echo “Using CATALINA_BASE: $CATALINA_BASE”上面加入以下行: 
JAVA_OPTS=”-server -XX:PermSize=64M -XX:MaxPermSize=128m