JVM在啟動時,會依據作業系統及處理器核心數量、記憶體容量判別 Client 或 Server 兩種機器類型。
從Oracle提供的「Server-Class Machine Detection」文件來看,Java SE6對伺服器等級機器(server-class machine)的定義為:「至少擁有2個核心以上的處理器、2個Gigabyte以上的實體記憶體。」
實際啟動JVM時,也會根據作業系統的不同而有預設的差異。
- 在AMD64平台上,不管Solaris/Windows/Linux預設都是server vm,並且不提供client vm。
- 在x86(i586)平台,除Windows是預設client vm,其他Solaris/Linux則是依照伺服器等級,若條件符合就預設server vm,否則還是會使用client vm。
並非每一種情況用server vm執行都會比較好,依照Oracle提供的文件所述,server vm在啟動時可能會比較慢,但長時間運作來看則會較好的效能。
要判別java預設用哪一種vm,可以用 java -version 查詢。
例如這是一個server vm的輸出。
java version "1.6.0_21"
Java(TM) SE Runtime Environment (build 1.6.0_21-b06)
Java HotSpot(TM) 64-Bit Server VM (build 17.0-b16, mixed mode)
以下則是client vm的輸出。
java version "1.6.0_21"
Java(TM) SE Runtime Environment (build 1.6.0_21-b07)
Java HotSpot(TM) Client VM (build 17.0-b17, mixed mode, sharing)
在java後面添加 -server 或 -client 參數,可以建議java使用指定的 client或server vm。
- java -server
- java -client
- java -server -version
- java -client -version
Error: no `server' JVM at `C:\Program Files\Java\jre6\bin\server\jvm.dll'.
這種情況是因為安裝的Java Runtime並未包含server vm需要的支援,我們需要將環境變數的PATH設定,重新指定為JDK的bin路徑,例如「c:\Program Files\Java\jdk1.6.0_21」。
"c:\Program Files\Java\jdk1.6.0_21\bin\java.exe" -server -version
要設置 -server 最好不要直接寫在 JAVA_OPTS ,因為對於一些GUI應用程式或Applet來說,用server vm執行並不見得比較好;因此設定在 CATALINA_OPTS (tomcat) 或
![]() |
圖片來源:The Java HotSpot Performance Engine Architecture |
The Client VM compiler does not try to execute many of the more complex optimizations performed by the compiler in the Server VM, but in exchange, it requires less time to analyze and compile a piece of code. This means the Client VM can start up faster and requires a smaller memory footprint.
延伸閱讀:
- java - the Java application launcher (windows) (solaris and linux)
- Server-Class Machine Detection
- The Java HotSpot Performance Engine Architecture
Excellent tutorial! It is really helpful for me, as a java beginner. I want to use java to write a java barcode generator, which I saw from “http://www.onbarcode.com/tutorial/java-barcode-generation.html ”. It is easy-use, I want to write one like it.
回覆刪除Take a look at Groovy + Java2D.
回覆刪除http://groovy.dzone.com/articles/java2d-groovy-way
http://groovy.codehaus.org/GraphicsBuilder