JVM有兩種運行模式Server與Client。兩種模式的區別在於,Client模式啟動速度較快,Server模式啟動較慢;但是啟動進入穩定期長期運行之后Server模式的程序運行速度比Client要快很多。這是因為Server模式啟動的JVM采用的是重量級的虛擬機,對程序采用了更多的優化;而Client模式啟動的JVM采用的是輕量級的虛擬機。所以Server啟動慢,但穩定后速度比Client遠遠要快。
1. 當前是Client or Server?
使用Java -version命令就能顯示出當前虛擬機處於哪種模式。
Client:
如下圖所示,可以看到HotSpot虛擬機采用Client模式啟動的。
Server:
如下圖所示,可以看到HotSpot虛擬機采用Server模式啟動的。另外我們也能看到該虛擬機是64位的。如果像上面的Client圖中那樣不顯示位數,則是32位虛擬機。所以使用java -version也能查看虛擬機是32位還是64位。
2. Client與Server切換
2.1 模式配置文件
JVM啟動時采用何種模式是在名為jvm.cfg的配置文件中配置的。
在32位JDK中,jvm.cfg位置為:JAVA_HOME/jre/lib/i386/jvm.cfg;
jvm.cfg中配置:(此時為client模式)
-client KNOWN-server KNOWN-hotspot ALIASED_TO -client
-classic WARN-native ERROR-green ERROR
1
2
3
4
5
6
1
2
3
4
5
6
在64位JDK中,jvm.cfg位置為:JAVA_HOME/jre/lib/amd64/jvm.cfg。
jvm.cfg中配置:(此時為server模式)
-server KNOWN-client IGNORE-hotspot ALIASED_TO -server
-classic WARN-native ERROR-green ERROR
1
2
3
4
5
6
1
2
3
4
5
6
2.2 模式切換
如果要切換啟動模式,首先要確認JDK支持哪一種或兩種模式。查看JAVA_HOME/jre/bin目錄下是否存在client或server目錄。32位的JDK一般都支持server和client兩種模式。64位的虛擬機好像只支持server模式,沒有client目錄。如下為32位JDK模式支持目錄:
切換模式只需要將client和server的聲明語句互換位置即可。如下圖所示,
紅框中為32位虛擬機中默認配置的client啟動(已被注釋掉)。藍框中為修改之后的server模式啟動。需要注意的是:在配置文件中最好不要出現空行,空行會報warning。
64位因為只支持server模式,如果我們修改了配置,啟動JVM時會報錯,無法啟動。
性能對比
曾經有人把java與c++性能做了個對比,如圖:
圖中最顯著的就是JVM client模式和Server模式關於method call的對比,那個差別不是一般的大,在后來的測試中發現,相差至少有10倍。
下面是另外兩個對比圖:
JVM工作在Server模式可以大大提高性能,但應用的啟動會比client模式慢大概10%。當JVM用於啟動GUI界面的交互應用時適合於使用client模式,當JVM用於運行服務器后台程序時建議用Server模式。
JVM在client模式默認-Xms是1M,-Xmx是64M;JVM在Server模式默認-Xms是128M,-Xmx是1024M。