JVM选项:-client vs -server

您是否曾经在运行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

似乎是对服务器系统进行了更为积极的优化,因此删除了循环,因为它知道它不执行任何操作!

挖掘更多/来源:

参考:Spyro的Log blog上, JCG合作伙伴 Spyros Doulgeridis提供的-client和-server JVM命令行选项之间的差异

相关文章 :

翻译自: https://www.javacodegeeks.com/2011/07/jvm-options-client-vs-server.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值