实战Java虚拟机之二“虚拟机的工作模式”
今天开始实战Java虚拟机之二:“虚拟机的工作模式”。
总计有5个系列
- 实战Java虚拟机之一“堆溢出处理”
- 实战Java虚拟机之二“虚拟机的工作模式”
- 实战Java虚拟机之三“G1的新生代GC”
- 实战Java虚拟机之四“禁用System.gc()”
- 实战Java虚拟机之五“开启JIT编译”
目前的Java虚拟机支持Client和Server两种运行模式。使用参数-client可以指定使用Client模式,使用参数-server可以指定使用Server模式。默认情况下,虚拟机会根据当前计算机系统环境自动选择运行模式。使用-version参数可以查看当前的模式,如下所示:
- ./java -version
- java version "1.7.0_40"
- Java(TM) SE Runtime Environment (build1.7.0_40-b43)
- Java HotSpot(TM) Client VM (build 24.0-b56, mixed mode, sharing)
使用-server参数后,就可以得到如下输出:
- ./java -server -version
- java version "1.7.0_40"
- Java(TM) SE Runtime Environment (build1.7.0_40-b43)
- Java HotSpot(TM) Server VM (build 24.0-b56, mixed mode)
与Client模式相比,Server模式的启动比较慢,因为Server模式会尝试收集更多的系统性能信息,使用更复杂的优化算法对程序进行优化。因此,当系统完全启动并进入运行稳定期后,Server模式的执行速度会远远快于Client模式。所以,对于后台长期运行的系统,使用-server参数启动对系统的整体性能可以有不小的帮助。但对于用户界面程序,运行时间不长,又追求启动速度,Client模式也是不错的选择。
从发展趋势上看,未来64位系统必然会逐步取代32位系统,而在64位系统中虚拟机更倾向于Server模式运行。
虚拟机在Server模式和Client模式下的各种参数可能会有很大不同,读者如果需要查看给定参数的默认值,可以使用-XX:+PrintFlagsFinal参数。这里以JIT编译阈值和最大堆为例,展示Client模式和Server模式下两者的区别。
对于Client模式,参数如下:
- ./java -XX:+PrintFlagsFinal -client -version |grep -E ' CompileThreshold| MaxHeapSize'
- intx CompileThreshold = 1500 {pd product}
- uintx MaxHeapSize := 268435456 {product}
- java version "1.7.0_40"
- Java(TM) SE Runtime Environment (build1.7.0_40-b43)
- Java HotSpot(TM) Client VM (build 24.0-b56, mixedmode, sharing)
对于Server模式,参数如下:
- ./java -XX:+PrintFlagsFinal -server -version |grep -E ' CompileThreshold| MaxHeapSize'
- intx CompileThreshold = 10000 {pd product}
- uintx MaxHeapSize :=1073741824 {product}
- java version "1.7.0_40"
- Java(TM) SE Runtime Environment (build1.7.0_40-b43)
- Java HotSpot(TM) Server VM (build 24.0-b56, mixedmode)
可以看到,在Client模式下,CompileThreshold默认值为1500,即函数被调用1500次后,会进行JIT编译(有关JIT编译的更多细节请参阅《实战Java虚拟机-jvm故障诊断与性能优化》第11章)。而在Server模式下,这个数值为10000。因此,Server模式下系统更有可能解释执行。而一旦进行编译,Server模式的优化效果会好于Client模式。其次,对于系统最大堆,在Client模式下为约256M,而在Server模式下约为1G。对于其他参数,读者可以使用类似的方式进行查找比较。
- 实战Java虚拟机之一“堆溢出处理”
- 实战Java虚拟机之二“虚拟机的工作模式”
- 实战Java虚拟机之三“G1的新生代GC”
- 实战Java虚拟机之四“禁用System.gc()”
- 实战Java虚拟机之五“开启JIT编译”

《实战Java虚拟机》一书Q交流群:397196583
实战Java虚拟机之二“虚拟机的工作模式”的更多相关文章
- Java设计模式(二) 工厂方法模式
本文介绍了工厂方法模式的概念,优缺点,实现方式,UML类图,并介绍了工厂方法(未)遵循的OOP原则 原创文章.同步自作者个人博客 http://www.jasongj.com/design_patte ...
- VMWare虚拟机网络的三种工作模式
VMWare提供了三种工作模式: 1.bridged(桥接模式) 在这种模式下,VMWare虚拟出来的操作系统就像是局域网中的一台独立的主机,它可以访问网内任何一台机器.在桥接模式下,需要手工为虚拟系 ...
- 深入探索Java设计模式(二)之策略模式
策略设计模式是Java API库中常见的模式之一.这与另一个设计模式(称为状态设计模式)非常相似.本文是在学习完优锐课JAVA架构VIP课程—[框架源码专题]中<学习源码中的优秀设计模式> ...
- Java设计模式(二)抽象工厂模式
一.场景描述 接<Java设计模式(一)工厂模式>https://www.cnblogs.com/mahongbiao/p/8618970.html 工厂模式有一缺点,就是破坏了类的封闭性 ...
- java加解密算法--对称加密工作模式
对称加密又分为分组加密和序列密码.分组密码,也叫块加密(block cyphers),一次加密明文中的一个块.是将明文按一定的位长分组,明文组经过加密运算得到密文组,密文组经过解密运算(加密运算的逆运 ...
- 使用ASP.NET Web Api构建基于REST风格的服务实战系列教程【二】——使用Repository模式构建数据库访问层
系列导航地址http://www.cnblogs.com/fzrain/p/3490137.html 前言 在数据访问层应用Repository模式来隔离对领域对象的细节操作是很有意义的.它位于映射层 ...
- java设计模式(二)单例模式 建造者模式
(三)单例模式 单例模式应该是最常见的设计模式,作用是保证在JVM中,该对象仅仅有一个实例存在. 长处:1.降低某些创建比較频繁的或者比較大型的对象的系统开销. 2.省去了new操作符,减少系统内存使 ...
- 【Java】实战Java虚拟机之五“开启JIT编译”
今天开始实战Java虚拟机之五“开启JIT编译” 总计有5个系列 实战Java虚拟机之一“堆溢出处理” 实战Java虚拟机之二“虚拟机的工作模式” 实战Java虚拟机之三“G1的新生代GC” 实战Ja ...
- 实战Java虚拟机之四:提升性能,禁用System.gc() ?
今天开始实战Java虚拟机之四:"禁用System.gc()". 总计有5个系列 实战Java虚拟机之一“堆溢出处理” 实战Java虚拟机之二“虚拟机的工作模式” 实战Java虚拟 ...
随机推荐
- PHP常量、变量作用域详解(一)
PHP 中的每个变量都有一个针对它的作用域,它是指可以在其中访问变量(从而访问它的值)的一个领域.对于初学者来说,变量的作用域是它们所驻留的页面.因此, 如果你定义了 $var,页面余下部分就可以访问 ...
- Unix/Linux进程间通信(二):匿名管道、有名管道 pipe()、mkfifo()
1. 管道概述及相关API应用 1.1 管道相关的关键概念 管道是Linux支持的最初Unix IPC形式之一,具有以下特点: 管道是半双工的,数据只能向一个方向流动:需要双方通信时,需要建立起两个管 ...
- mount -t nfs 的使用
服务安装:1. 在VMware Ubuntu中安装NFS服务: sudo apt-get install nfs-kernel-server2. 安装成功会出现配置文件/etc/exports. ls ...
- 好代码系列(一):LazyObject
site-packages/django/utils/functional.py def new_method_proxy(func): def inner(self, *args): if self ...
- PYTHON isinstance语法
def obj_len(arg): #isinstance(),判断是否是某一类 if isinstance(arg,str) or (isinstance(arg,list)) or (isinst ...
- MATLAB的SAVE命令动态批量保存TXT文件
1.使用save(): for i=1:6 str=[num2str(i),’.txt’]; m=[1 2; 3 4]; save(str,’m’,’-ascii’);%注意m的单引号,一定记得加上, ...
- RobotFrameWork(四)变量运算与Evaluate
一.特殊变量运算: 执行结果: 二.Evaluate使用 函数释义:Evaluate是执行Python表达式,并返回执行结果 示例1: 执行结果: 示例2: 执行结果:
- Webdriver配合Tesseract-OCR 自动识别简单的验证码
验证码: 如下,在进行自动化测试,遇到验证码的问题,一般有两种方式 1.找开发去掉验证码或者使用万能验证码 2.使用OCR自动识别 使用OCR自动化识别,一般识别率不是太高,处理一般简单验证码还是没问 ...
- C++库(Google Breakpad)
Google Breakpad是什么? 一个开源的多平台崩溃报告系统. Google breakpad是一个非常实用的跨平台的崩溃转储和分析模块,它支持Windows,Linux和Mac和Solari ...
- Odoo9是如何计算预定交付日期的
计算预定日期目的是按计划交付.接收等.根据不同公司习惯,Odoo会通过调度器自动生成预定日期,Odoo调度器计算每一行的每件事情,无论是生产订单.交货单.销售订单等,依据Odoo中配置的不同交付时间( ...