04_jvm_10_tuning

第五十六章 Java虚拟机调优(JVM Tuning)

1 概述

我们在前面的几个章节中介绍了Java虚拟机是一个复杂的系统。随着版本的演变,Java虚拟机推出了不同的内存管理方法和垃圾回收方法。在不同的环境下,这些方法的效果和运行效率也不尽相同。那么,为了最大提升Java虚拟机的运行效率,我们在本章中介绍一些Java虚拟机调优方面相关的内容。

Java虚拟机调优过程是通过向Java虚拟机传递不同的参数,选择不同的方法或者策略,以达到Java虚拟机最优的运行效率。一般来说,Java虚拟机调优可以从以下几个方面考虑入手。

2 Java虚拟机调优方法

2.1 Java虚拟机版本选择

Java虚拟机版本选择涉及两个方面:虚拟机实现版本(Vendor)和Java版本(Version)。

  1. 虚拟机实现版本(Vendor)的选择。OpenJDK是最为流行的,开源的Java虚拟机的一个实现版本。商用的Oracle JDK的绝大部分实现是基于OpenJDK的。因此,OpenJDK和Oracle JDK是目前最为流行的两个实现版本。然而,在云平台上,亚马逊(Amazon)推出了Corretto 11优化版本, 阿里巴巴也推出了Dragonwell 11优化版本等。所以,Java虚拟机的各个实现版本之间,在性能上是有区别的。开发人员需根据运行环境选择合适的实现版本。
  2. Java版本(Version)的选择。一般来说,建议开发人员使用最新的Java版本。然而,在实际项目开发中,升级版本并不一定是一件容易的事情。有时需要考虑到平台的兼容性,第三方代码库的兼容性等问题。而且,新的Java版本可能采用了新的内存管理方法和垃圾回收算法。这些新的方法不一定能很好的适应当前的项目运行环境。因此,Java版本的选择也是一个非常重要的调优因素。

2.2 堆的大小的选择

堆大小的选择也是一个重要的Java虚拟机优化的指标。堆栈越大、Java虚拟机的性能就越好吗?这是一个复杂的问题,并不能简单的回答“是的”或者“不是”。堆大小的选择需要考虑两个问题:应用程序需要多少内存和运行环境能提供多少内存。

  1. 应用程序需要多少内存?堆的大小应能满足应用程序的需求。如果堆的大小过大时,会降低垃圾回收过程运行的次数。因为,内存使用比率常常被用于判断是否需要运行垃圾回收过程。如果可被释放的对象累计过多的话,该应用程序使用的内存也会随之增加,因此,增加了整个运行环境的内存使用负担。
  2. 运行环境提供多少内存?Java虚拟机是一个进程,它运行在操作系统之上。当Java虚拟机使用了过大的内存时,会增加触发操作系统的swapping操作的概率,即操作系统会将内存中的数据交换出内存,暂时存放在硬盘中。这样的swapping操作会极大的降低Java虚拟机的运行效率。因此,Java虚拟机的堆大小应不大于运行环境所能承受的内存大小。

2.3 垃圾回收算法的选择

在第三十八章中我们介绍了五种垃圾回收算法。在Java 9以后,G1垃圾回收算法被设置为默认使用的方法。在Java 8版本中,Parallel GC是默认的算法。而且,在不同的Java虚拟机实现版本中,也可能还存在其他的算法。G1算法的优势是它是增量释放对象的,每次只扫描和释放某一区域内的对象,所以,它每次运行时扫描和释放对象所需要的时间非常短。因此,垃圾回收算法也是一个重要的Java虚拟机优化选项。

3 Java虚拟机优化建议

因为运行环境的不同,Java虚拟机调优的方式和选择也不同。我们在下面罗列一些通常的建议,供开发人员参考。

  1. 建议选择最新版本的Java虚拟机。
  2. 建议堆的大小不超过运行环境物理内存的大小。
  3. 建议预留一些物理内存给其他应用程序。
  4. 建议将堆的最大大小(-Xms)和堆的初始大小(-Xmx)设置为相同大小,以获得最佳性能。
  5. 在使用Java虚拟机参数之前,建议阅读相关的手册,并确定能够完全理解。
  6. 建议观察垃圾回收器输出的日志,进一步优化垃圾回收过程。

4 总结

Java虚拟机是一个非常复杂的系统,Java开发人员有时会通过调整Java虚拟机运行参数来优化Java虚拟机运行的性能。本章介绍了Java虚拟机调优应考虑的三个重要方面,并给了开发人员实战项目中可采取的优化建议和策略。

上一章
下一章

注册用户登陆后可留言

Copyright  2019 Little Waterdrop, LLC. All Rights Reserved.