您是否曾經在運行Java應用程序時想知道-client或-server開關是什么? 例如:
javaw.exe -client com.blogspot.sdoulger.LoopTest
也顯示在java.exe的“幫助”中,例如,其中的選項包括:
-client選擇“客戶端” VM
-server選擇“服務器” VM

-client和-server系統之間有什么區別?
這兩個系統是不同的二進制文件。 它們本質上是與同一運行時系統接口的兩個不同的編譯器(JIT)。 對于需要快速啟動時間或較小占用空間的應用程序,客戶端系統是最佳選擇;對于整體性能最為重要的應用程序,服務器系統是最佳選擇。 通常,客戶端系統更適合于交互式應用程序,例如GUI。 其他一些差異包括編譯策略,堆默認設置和內聯策略。

根據“ Java HotSpot性能引擎架構 ”:
JDK包括兩種VM:客戶端產品和為服務器應用程序調整的VM。 這兩個解決方案共享Java HotSpot運行時環境代碼庫,但是使用不同的編譯器,這些編譯器適合于客戶端和服務器的獨特性能特性。 這些差異包括編譯內聯策略和堆默認值。
JDK在發行版中同時包含這兩個系統,因此開發人員可以通過指定-client或-server來選擇所需的系統。
盡管服務器VM和客戶端VM相似,但已經對服務器VM進行了特殊調整,以最大程度地提高峰值運行速度。 它用于執行長時間運行的服務器應用程序,這些應用程序需要比快速啟動時間或較小的運行時內存占用更多??的最快的運行速度。
客戶端VM編譯器可作為經典VM和早期JDK版本使用的即時(JIT)編譯器的升級。 客戶端VM為應用程序和小程序提供了改進的運行時性能。 Java HotSpot客戶端VM經過特別調整,以減少應用程序啟動時間和內存占用,使其特別適合客戶端環境。 通常,客戶端系統更適合GUI。
客戶端VM編譯器不會嘗試執行服務器VM中由編譯器執行的許多更復雜的優化,但是作為交換,它需要較少的時間來分析和編譯一段代碼。 這意味著客戶端VM可以更快地啟動,并且需要較小的內存空間。
注意:似乎性能差異的主要原因是優化的數量。
Server VM包含一個高級自適應編譯器,該編譯器支持通過優化C ++編譯器執行的許多相同類型的優化,以及一些傳統編譯器無法完成的優化,例如跨虛擬方法調用的主動內聯。 與靜態編譯器相比,這是一個競爭優勢和性能優勢。 自適應優化技術的方法非常靈活,通常甚至優于高級靜態分析和編譯技術。
兩種解決方案都提供了極其可靠,安全和可維護的環境,可以滿足當今企業客戶的需求。
默認選項:
- 對于熱點是客戶端
- 對于JRockit是服務器
JRockit的客戶端和服務器VM選項
JRockit也有這兩個選項,默認為服務器選項(熱點是客戶端)。
JRockit客戶端選項為-client,服務器為-jrockit。
關于性能差異的動手實例
摘自Onkar Joshi博客的示例證明了性能差異。
我們使用兩個開關運行以下代碼:
package com.blogspot.sdoulger;public class LoopTest {public LoopTest() {super();}public static void main(String[] args) {long start = System.currentTimeMillis();spendTime();long end = System.currentTimeMillis();System.out.println("Time spent: "+ (end-start));LoopTest loopTest = new LoopTest();}private static void spendTime() {for (int i =500000000;i>0;i--) {}}
}
注意:該代碼僅被編譯一次! 兩次運行中的類都相同!
使用-client:
java.exe -client -classpath C:\ JDeveloper \ mywork \ Test_java_client-server_switches \ Project1 \ classes com.blogspot.sdoulger.LoopTest
花費時間:766
使用-server:
java.exe -server -classpath C:\ JDeveloper \ mywork \ Test_java_client-server_switches \ Project1 \ classes com.blogspot.sdoulger.LoopTest
花費時間:0
似乎是對服務器系統進行了更為積極的優化,因此刪除了循環,因為它知道它不執行任何操作!
挖掘更多/來源:
- -client和-server系統之間有什么區別?
- http://java.sun.com/products/hotspot/whitepaper.html#1
- http://www.velocityreviews.com/forums/t130082-difference-between-client-server-classic-and-hotspot-jvms.html
- http://www.onkarjoshi.com/blog/174/hotspot-jvm-client-server-vm-optimization/
- http://stackoverflow.com/questions/198577/real-differences-between-java-server-and-java-client
參考:在Spyro的Log blog上, JCG合作伙伴 Spyros Doulgeridis提供的-client和-server JVM命令行選項之間的差異 。
- Java中的低GC:使用原語而不是包裝器
- Java泛型快速教程
- JVM如何處理鎖
- 使用迭代器時如何避免ConcurrentModificationException
翻譯自: https://www.javacodegeeks.com/2011/07/jvm-options-client-vs-server.html