长时间运行应用的优化

对于长时间运行的应用,比如Servlet程序等,一般会使用吞吐量来测试它们的性能。 以下的一组数据表示了一个典型的数据获取程序在使用不同“热身时间”以及不同编译策略时,对吞吐量(OPS)的影响(执行时间为60s):

Warm-up Period

-client

-server

-XX:+TieredCompilation

0s

15.87

23.72

24.23

60s

16.00

23.73

24.26

300s

16.85

24.42

24.43

即使当“热身时间”为0秒,因为执行时间为60秒,所以编译器也有机会在次期间做出优化。

从上面的数据可以发现的几个结论:

对于典型的数据获取程序,编译器对代码编译和优化发生的十分迅速,当“热身时间”显著增加时,如从60秒增加到300秒,最后得到的OPS差异并不明显。

-server JIT编译器和Tiered编译的性能显著优于-client JIT编译器。

总结

对于长时间运行的应用,总是使用-server JIT编译器或者Tiered编译策略。

Java和JIT编译器版本

以上讨论了JIT编译器的Client以及Server版本,但实际上,JIT编译器有三种:

32-bit Client (-client)

32-bit Server (-server)

64-bit Server (-d64)

在32-bit的JVM中,最多可以使用两种JIT编译器。 在64-bit的JVM中,只能使用一种,即-d64。(虽然实际上也含有两种,因为在Tiered编译模式下,Client和Server JIT都会被使用到)

关于32位或者64为JVM的选择

如果你的OS是32位的,那么必须选择32位的JVM;如果你的OS是64位的,那么你可以选择32位或者64为的JVM。

如果你的计算机的内存小于3GB,那么使用32位的JVM性能更优。因为此时JVM中对于内存的引用也是32位的(也就是声明一个指向内存的变量会占用32位的空间),所以操作这些引用的速度也会更快。

使用32位版本的缺点如下:

可用的内存小于4GB,在某些Windows OS中是小于3GB,在某些旧版本的Linux中是小于3.5GB。

对于double和long变量类型的操作速度会慢于64位版本,因为它们不能使用CPU的64位寄存器。

在通常情况下,如果你的程序对于内存的容量要求不那么高,且并不含有很多对于long和double类型的操作,那么选择32位往往更快,和64位相比,性能往往会提高5%-20%不等。

OS和编译器参数之间的关系

JVM版本

-client

-server

-d64

Linux 32-bit

32-bit client compiler

32-bit server compiler

Error

Linux 64-bit

64-bit server compiler

64-bit server compiler

64-bit server compiler

Mac OS X

64-bit server compiler

64-bit server compiler

64-bit server compiler

Solaris 32-bit

32-bit client compiler

32-bit server compiler

Error

Solaris 64-bit

32-bit client compiler

32-bit server compiler

64-bit server compiler

Windows 32-bit

32-bit client compiler

32-bit server compiler

Error

Windows 64-bit

64-bit server compiler

64-bit server compiler

64-bit server compiler

OS和默认编译器的关系

OS

默认JIT编译器

Windows, 32-bit, any number of CPUs

-client

Windows, 64-bit, any number of CPUs

-server

Mac OS X, any number of CPUs

-server

Linux/Solaris, 32-bit, 1 CPU

-client

Linux/Solaris, 32-bit, 2 or more CPUs

-server

Linux, 64-bit, any number of CPUs

-server

Solaris, 32-bit/64-bit overlay, 1 CPU

-client

Solaris, 32-bit/64-bit overlay, 2 or more CPUs

-server (32-bit mode)

OS和默认JIT的关系是建立在以下两个事实之上:

当Java程序运行在Windows 32位的计算机上时,程序的启动速度往往是最重要的,因为它面向的往往是最终用户。

当Java程序运行在Unix/Linux系统上时,程序往往是长时间运行的服务端程序,所以Server JIT编译器的优势更明显。

总结

32位和64位的JVM支持的JIT编译器是不一样的。

在不同的OS和架构(32bit/64bit)对于JIT编译器的支持是不一样的。

即使声明了要使用某种JIT编译器,根据运行时平台的不同,实际使用的也不一定是指定的编译器。

JIT编译器调优进阶

对于绝大部分的场景,只设置使用哪种JIT编译器就足够了:-client, -server或者-XX:+TieredCompilation。 对长时间运行的应用,使用Tiered编译方式更好,即使在短时间运行的引用上使用它,性能也和使用Client编译器类似。

但是在另外一些场合下,还是需要进行另外一些调优。

代码缓存调优(Tuning

the Code Cache)

当JVM对代码进行编译后,被编译的代码以汇编指令的形式存在于代码缓存中(Code Cache),显然这个缓存区域也是有大小限制的,当此区域被填满了之后,编译器就不能够再编译其他Java字节码了。

所以当此区域设置的太小时,会对程序性能造成影响,因为编译器不会对Java字节码进行编译来得到运行速度更快的汇编指令/二进制代码了。

当使用Tiered编译策略,这种影响会更常见。因为该策略在运行之处,编译器的行为类似Client编译器,此时大量的Java字节码会被编译,如果Code Cache设置的太小,那么性能就得不到充分地提升。

当Code Cache区域被填满时,JVM会给出警告:

JavaHotSpot(TM) 64-Bit Server VM warning: CodeCache is full. Compiler has been disabled. Java HotSpot(TM) 64-Bit Server VM warning: Try increasing the code cache size using -XX:ReservedCodeCacheSize=

当然通过查看编译日志也能够知道Code Cache的使用情况。

Java平台和默认Code Cache空间的关系:

Java平台

默认空间

32-bit client, Java 8

32 MB

32-bit server with tiered compilation, Java 8

240 MB

64-bit server with tiered compilation, Java 8

240 MB

32-bit client, Java 7

32 MB

32-bit server, Java 7

32 MB

64-bit server, Java 7

48 MB

64-bit server with tiered compilation, Java 7

96 MB

在Java 7中,这个区域的默认空间经常不够,所以在必要的场景下需要增加它的空间。然而,并没有一个非常好的方法来给出一个应用到底在Code Cache区域的空间为多少时才能够达到最好的性能。你所能做的就是不断地进行尝试,来得到一个最好的结果。

Code Cache的最大空间可以通过:-XX:ReservedCodeCacheSize=N来进行设置。在默认情况下,N就是上表中的默认空间大小。关于Code Cache的空间管理,和JVM中对于其他内存空间的管理方法类似,也提供了一个设置初始值的方法:-XX:InitialCodeCacheSize=N。初始值和选择编译器的类型以及处理器的架构相关,但是一般需要设置的只是最大空间。

代码缓存空间的大小

那么是不是把Code Cache空间设置的越大越好呢?也不尽然。因为设置之后,哪怕实际上没有用到,这块空间也被JVM给“预定”了,不能用作他途。

前文中提到过,如果JVM使用的是32位的,那么内存空间最大为4GB,这个4GB包括了Java堆,JVM自身的代码(包括用到的各种Native库和线程栈),应用程序可分配的内存空间,当然也会包括Code Cache。所以从这个角度出发,也不是把它设置的越大越好。

在程序运行时,可以通过jconsole工具来进行监测。

预定内存和分配内存(Reserved

Memory and Allocation Memory)

它们是JVM中两个很比较重要的概念,在Code Cache,Java堆以及各种JVM使用的内存区域中都会出现。

总结

代码缓存会影响到JVM能够编译的Java字节码数量,它会被设置一个最大的可用空间,当空间完全被占用后,JIT编译器就会停止编译。

使用Tiered编译策略时,代码缓存会很快就被用尽(尤其是Java 7),此时可以通过设置预留空间(也就是最大的可用空间)来进行调整。

java jit 编译器,[Java Performance] JIT编译器简介相关推荐

  1. [Java Performance] JIT编译器简介

    使用JIT(Just-In-Time)编译器 JIT编译器概览 JIT编译器是JVM的核心.它对于程序性能的影响最大. CPU只能执行汇编代码或者二进制代码,所有程序都需要被翻译成它们,然后才能被CP ...

  2. java编译器使用教程_Java编译器API简介

    今天给大家分享的是Java编译器API简介,文章部分内容摘自[优锐课]学习笔记. Java编译器API Java编译器API是Java模块(称为java.compiler)的一部分.该模块包括语言模型 ...

  3. jit 方法内联_JIT编译器,内联和转义分析

    jit 方法内联 即时(JIT) 即时(JIT)编译器是Java虚拟机的大脑. JVM中对JIT编译器的影响最大. 一会儿,让我们退后一步,看看已编译和未编译语言的示例. 诸如Go,C和C ++之类的 ...

  4. java jit技术_JVM之JIT

    JIT(just in time):即时编译编译器,能够加速 Java 程序的执行速度.通常通过 javac 将java代码编译,转换成 java 字节码,JVM将字节码将其翻译成机器指令,逐条读入, ...

  5. 【Java】实战Java虚拟机之五“开启JIT编译”

    今天开始实战Java虚拟机之五"开启JIT编译" 总计有5个系列 实战Java虚拟机之一"堆溢出处理" 实战Java虚拟机之二"虚拟机的工作模式&qu ...

  6. java平台脚本+java编译器API

    [0]README 0.1)本文文字描述转自 core java volume 2, 旨在学习  java平台脚本+java编译器API 的 基础知识: ----------------------- ...

  7. java没有编译器吗_java有编译器吗

    编译器就是将"一种语言(通常为高级语言)"翻译为"另一种语言(通常为低级语言)"的程序.一个现代编译器的主要工作流程:源代码 (source code) → 预 ...

  8. JYM、JAVA解释器和JAVA编译器

    JVM:够运行Java字节码(Java bytecode)的虚拟机 Java编译器:将Java源文件(.java文件)编译成字节码文件(.class文件,是特殊的二进制文件,二进制字节码文件),这种字 ...

  9. 在线Java 动态运行Java源代码-编译器

    1.获取JDK编译器主要有两种方式(当然大神也可以有三种,自己写编译器): 如果运行的环境System.getProperty("java.home")中配置了JDK,则直接通过T ...

  10. idea 设置java栈空间,如何为Intellij编译器提供更多堆空间?

    当我创建一个Intellij项目时,我不断收到以下内存错误. 我已经在idea.vmoptions中增加了我的堆大小: -Xms128m -Xmx2048m -XX:MaxPermSize=1024m ...

最新文章

  1. [Err] 1449 - The user specified as a definer ('admin_isbox'@'localhost') does not exist
  2. SCCM管理 - 更新部署
  3. 忍一时得寸进尺, 退一步变本加厉。
  4. 数学公式编辑器 linux,linux下的公式编辑器
  5. docker添加阿里云专属镜像
  6. 应付账款账龄分析模板_6万字长文剖析宁德时代(三):财务分析
  7. 五大板块(1)—— 数组的定义,赋值与应用
  8. Spring Boot整合MongoDB实现增删改查
  9. MfC基础--绘图基础--win32
  10. vscode 运行 python
  11. c mysql学生管理系统_C++ 简单的学生信息管理系统
  12. Linux系统下安装es中ik分词器详解
  13. FPGA驱动步进电机
  14. java 上传图片 并压缩图片大小
  15. ios swift5 父子控制器
  16. 神经网络视频/图像渲染相关经典论文、项目、数据集等资源整理分享
  17. win7,win10访问Samba的共享目录提示“登录失败:用户名或密码错误”最终解决方法
  18. Elasticsearch 的内存优化
  19. Devcpp新建文件自动添加一定代码
  20. 2022茶艺师(初级)操作证考试题库及在线模拟考试

热门文章

  1. 通过Redash可视化方式监控大数据系统运行
  2. [MySQL]约束(constraint)
  3. charles手机安装证书
  4. dhcp服务器设置自动,路由器DHCP服务器怎样设置
  5. c语言字符串输出函数是,C语言字符串输入与输出函数
  6. lsm tree java_LSM设计一个数据库引擎
  7. 九九乘法表练习_Excel乘法表练习工作簿
  8. python4.0中文下载_pycharm4.0版本下载-pycharm4.0中文版v4.0.7 官方版 - 极光下载站
  9. Ubuntu配置host
  10. 少样本苹果分类机器深度学习