JVM性能调优——运行时参数

news2025/6/22 14:59:21

文章目录

  • 1、JVM参数选项类型
    • 1.1、标准参数选项
    • 1.2、非标准参数选项
    • 1.3、非稳定参数选项
  • 2、添加JVM参数的方式
  • 3、常用JVM参数选项
  • 4、通过Java代码获取JVM参数
  • 5、小结

熟悉JVM参数对于系统调优是非常重要的。比如一个高流量的延迟的电子交易平台,它要求的响应时间都是毫秒级的。要获得适合的参数组合需要大量的分析和不断地尝试,更依赖交易系统的特性。

本帖将主要讲解JVM的运行时参数的分类及其使用方式。

1、JVM参数选项类型

JVM参数总体上来说分为三大类,分别是标准参数选项、非标准参数选项和非稳定参数选项,下面分别详细介绍三大参数类型。

1.1、标准参数选项

所有的JVM都必须实现标准参数的功能,而且向后兼容。标准参数是相对比较稳定的参数,后续版本基本不会发生变化,参数以“-”开头,例如大家常见的“-version”参数就是标准参数。获取标准参数的命令是在终端输入“java”或者“java -help”命令即可,获取结果如下表所示:
在这里插入图片描述
需要注意的是HotSpot虚拟机的两种模式,分别是Server和Client,分别通过-server和-client模式设置。

在32位Windows系统上,默认使用Client类型的JVM。要想使用Server模式,则机器配置至少有2个以上的CPU和2GB以上的物理内存。Client模式适用于对内存要求较小的桌面应用程序,默认使用Serial串行垃圾收集器。

64位机器上只支持Server模式的JVM,适用于需要大内存的应用程序,默认使用并行垃圾收集器。

1.2、非标准参数选项

我们知道JVM可以有不同的生产厂商,非标准参数的意思是并不保证所有JVM都对非标准参数进行实现,即只能被部分JVM识别且不保证向后兼容,功能相对来说也是比较稳定的,但是后续版本有可能会变更,参数以“-X”开头。可以用java -X来检索非标准参数,不能保证所有参数都可以被检索出来,例如其中就没有-Xcomp。下表列出了常见的非标准参数。
在这里插入图片描述
特别注意的是-Xint参数表示禁用JIT,所有的字节码都被解释执行,这个模式下系统启动最快,但是执行效率最低。-Xcomp表示JVM采用编译模式,代码执行很快,但是启动会比较慢。-Xmixed表示JVM采用混合模式,启动速度较快,让JIT根据程序运行的情况,对热点代码实行检测和编译。

虽然-Xms、-Xmx和-Xss三个参数归属于-X参数选项,但是这三个参数的执行效果分别等同于非稳定参数中的-XX:InitialHeapSize、-XX:MaxHeapSize和-XX:ThreadStackSize。

1.3、非稳定参数选项

非稳定参数选项以-XX开头,也属于非标准参数,相对不稳定,在JVM中是不健壮的,也可能会突然直接取消某项参数,主要用于JVM调优和调试。但是这些参数中有很多参数对于JVM调优很有用处,所以也是使用最多的参数选项。

-XX参数又分为布尔类型参数和非布尔类型参数。布尔类型的格式为-XX:+/-,-XX:+表示启用option,-XX:-表示禁用option。例如-XX:+UseParallelGC表示开启ParallelGC垃圾收集器,-XX:-UseParallelGC表示关闭ParallelGC垃圾收集器,有些参数是默认开启的,调优的时候可以考虑关闭某些参数。

非布尔类型的参数也可以理解为Key-Value型的参数,可以分为数值类型和非数值类型。数值类型格式为-XX:=,number可以带上单位(k、K表示千字节,m、M表示兆,或者使用更大的内存单位g、G),例如-XX:NewSize=1024m表示设置新生代初始大小为1024MB。非数值类型格式为-XX:=,例如-XX:HeapDumpPath=/usr/local/heapdump.hprof用来指定heap转存文件的存储路径。

通过“java -XX:+PrintFlagsFinal”命令可以查看所有的-XX参数,如下图所示,篇幅原因截取部分截图。
在这里插入图片描述
上图最后一列参数的取值有多种,如下所示:

  • (1)product表示该类型参数是官方支持的,属于JVM内部选项。
  • (2)rw表示可动态写入。
  • (3)C1表示Client JIT编译器。
  • (4)C2表示Server JIT编译器。
  • (5)pd表示平台独立。
  • (6)lp64表示仅支持64位JVM。
  • (7)manageable表示可以运行时修改。
  • (8)diagnostic表示用于JVM调试。
  • (9)experimental表示非官方支持的参数。

默认不包含diagnostic和experimental两种类型,想要包含该类型的参数可以配合参数-XX:+UnlockDiagnosticVMOptions和-XX:+UnlockExperimentalVMOptions使用,例如java-XX:+PrintFlagsFinal -XX:+UnlockDiagnosticVMOptions命令结果如下(部分结果),包含了diagnostic类型的参数。同理可以添加-XX:+UnlockExperimentalVMOptions参数用于包含experimental类型的参数,不再演示。
在这里插入图片描述

2、添加JVM参数的方式

在工作中经常需要配置JVM参数,一般有以下几种方式:

1、IDEA界面配置
鼠标右键选中目标工程,选择“Run”→“Edit Configurations”选项,选中要添加JVM参数的Application,然后在Configuration里面的VM options中输入想要添加的JVM参数即可,如下图所示,例如填入-Xmx256m,这样就可以设置运行时最大内存为256MB。
在这里插入图片描述

2、通过java命令配置
通过java命令运行class或者jar包的时候也可以添加JVM参数,一般多用于工程测试,如下所示:

     //运行jar包时添加JVM参数
     java -Xms128m -Xmx256m -jar demo.jar
     //运行类的字节码文件时添加JVM参数
     java -Xms128m -Xmx256m 类名

3、通过web服务器配置
Linux系统下可以在tomcat/bin/catalina.sh中添加如下JVM配置。

     JAVA_OPTS="-Xms512M -Xmx1024M"

Windows系统下可以在catalina.bat中添加如下配置。

     set"JAVA_OPTS=-Xms512M -Xmx1024M"

4、通过jinfo命令配置

3、常用JVM参数选项

JVM参数选项那么多,在工作中有很多参数是很少用到的,这里汇总了几大常用的参数分类,如下所示:

(1)输出设置的-XX参数以及参数值的参数选项如下表所示:
在这里插入图片描述
(2)堆、栈、方法区等内存大小设置的参数选项如下表所示:
在这里插入图片描述
(3)OutOfMemory相关的参数选项如下表所示:
在这里插入图片描述
-XX:OnOutOfMemoryError表示当发生内存溢出的时候,还可以让JVM调用任一个shell脚本。大多数时候,内存溢出并不会导致整个应用都挂掉,但是最好还是把应用重启一下,因为一旦发生了内存溢出,可能会让应用处于一种不稳定的状态,一个不稳定的应用可能会提供错误的响应。例如使用以下命令:

     -XX:OnOutOfMemoryError=/opt/Server/restart.sh

当给JVM传递上述参数的时候,如果发生了内存溢出,JVM会调用/opt/Server/restart.sh这个脚本,在这个脚本中可以去用优雅的办法来重启应用。restart.sh脚本如下所示。
在这里插入图片描述
(4)垃圾收集器相关的参数选项因垃圾收集器的不同而不同,关于垃圾收集器的分类以及配合使用。使用-XX:+PrintCommandLineFlags查看命令行相关参数,从中可以查看到当前系统使用的垃圾收集器,也可以使用命令行指令jinfo查看。

Serial收集器作为HotSpot中Client模式下的默认新生代垃圾收集器。Serial Old收集器是运行在Client模式下默认的老年代的垃圾收集器。-XX:+UseSerialGC参数可以指定新生代和老年代都使用串行收集器,表示新生代用Serial GC,且老年代用Serial Old收集器。可以获得最高的单线程收集效率。现在已经很少使用Serial收集器了。

ParNew收集器可以使用-XX:+UseParNewGC参数指定。它表示新生代使用并行收集器,不影响老年代。Parallel收集器的相关JVM参数选项如下表:
在这里插入图片描述
CMS收集器的相关JVM参数选项如下表所示:
在这里插入图片描述
需要注意的是JDK 9新特性中CMS被标记为Deprecate了,如果对JDK 9及以上版本的HotSpot虚拟机使用参数-XX:+UseConcMarkSweepGC来开启CMS收集器的话,用户会收到一个警告信息,提示CMS未来将会被废弃。JDK 14新特性中删除了CMS垃圾收集器,如果在JDK 14中使用-XX:+UseConcMarkSweepGC的话,JVM不会报错,只是给出一个warning信息,但是不会exit。JVM会自动回退以默认GC方式启动JVM。

G1收集器的相关JVM参数选项如下表所示:
在这里插入图片描述
G1收集器主要涉及Mixed GC,Mixed GC会回收新生代和部分老年代,G1关于Mixed GC调优常用参数选项如下表所示:
在这里插入图片描述
(5)GC日志相关的参数选项如下表所示:
在这里插入图片描述
(6)其他常用的参数选项如下表所示:
在这里插入图片描述

4、通过Java代码获取JVM参数

Java提供了java.lang.management包用于监视和管理JVM和Java运行时中的其他组件,它允许本地和远程监控和管理运行的JVM,会经常使用到其中的ManagementFactory类。另外还有Runtime类也可以获取一些内存、CPU核数等相关的数据。通过这些API可以监控我们的应用服务器的堆内存使用情况,也可以设置一些阈值进行报警等处理,代码清单如下演示了Java代码获取应用的内存使用情况:
在这里插入图片描述
运行结果如下,可以看到堆内存的各项信息:
在这里插入图片描述

5、小结

讲解了JVM运行时参数,JVM参数对于系统调优是非常重要的,参数分为三类,分别是标准参数选项、非标准参数选项和非稳定参数选项。标准参数是所有的JVM实现都必须要实现的参数,不同的JVM拥有相同的参数功能。非标准参数无法保证所有的JVM都会有对应的实现,该类型参数一般以“-X”开头。非稳定参数在JVM中是不健壮的,属于试验性质的参数,有可能在不同的JVM版本中会被取消,该类型参数一般以“-XX”开头,对于JVM调优有很大的用处。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1584716.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ROS机器人未知环境自主探索功能包explore_lite最全源码详细解析(五)

本系列文章主要针对ROS机器人常使用的未知环境自主探索功能包explore_lite展开全源码的详细解析,并进行概括总结。 本系列文章共包含六篇文章,前五篇文章主要介绍explore_lite功能包中 explore.cpp、costmap_tools.h、frontier_search.cpp、costmap_clie…

MySQL:关于数据库的一些练习题

文章目录 前面的内容已经把数据库的一些必要知识已经储备好了,因此下面就对于这些语句进行一些练习: 批量插入数据 insert into actor values (1, PENELOPE, GUINESS, 2006-02-15 12:34:33), (2, NICK, WAHLBERG, 2006-02-15 12:34:33);SQL202 找出所有…

C/S医学检验LIS实验室信息管理系统源码 医院LIS源码

LIS系统即实验室信息管理系统。LIS系统能实现临床检验信息化,检验科信息管理自动化。其主要功能是将检验科的实验仪器传出的检验数据经数据分析后,自动生成打印报告,通过网络存储在数据库中,使医生能够通过医生工作站方便、及时地…

一起学习python——基础篇(14)

今天讲一下python的json解析方式。 上一篇文章讲述了将传参数据转换为json格式的数据传给后台,如果后端返回的json格式数据,我们该如何解析呢? 例子一:简单的json数据格式 如果后端返回的json数据如下, { "na…

【leetcode面试经典150题】34.有效的数独(C++)

【leetcode面试经典150题】专栏系列将为准备暑期实习生以及秋招的同学们提高在面试时的经典面试算法题的思路和想法。本专栏将以一题多解和精简算法思路为主,题解使用C语言。(若有使用其他语言的同学也可了解题解思路,本质上语法内容一致&…

Docker Compose 一键安装

文章目录 一、场景说明二、脚本职责三、参数说明四、操作示例五、注意事项 一、场景说明 本自动化脚本旨在为提高研发、测试、运维快速部署应用环境而编写。 脚本遵循拿来即用的原则快速完成 CentOS 系统各应用环境部署工作。 统一研发、测试、生产环境的部署模式、部署结构、…

【C++学习】C++11新特性(第二节)—— 右值引用与移动语义超详解

文章目录 文章简介二.右值引用1.什么是左值,什么是右值?什么是左值引用,什么是右值引用?2.左值引用与右值引用比较 三.右值引用使用场景和意义1.左值引用的使用场景:2.左值引用的短板:3.右值引用与移动构造…

2024大模型落地应用案例集(免费下载)

【1】扫码关注本公众号 【2】私信发送 2024大模型落地应用案例集 【3】获取本方案PDF下载链接,直接下载即可。

【Linux】环境下OpenSSH升级到 OpenSSH_9.6P1(图文教程)

漏洞描述 OpenSSH(OpenBSD Secure Shell)是加拿大OpenBSD计划组的一套用于安全访问远程计算机的连接工具。该工具是SSH协议的开源实现,支持对所有的传输进行加密,可有效阻止窃听、连接劫持以及其他网络级的攻击。OpenSSH 9.6之前…

深入浅出Golang image库:编写高效的图像处理代码

深入浅出Golang image库:编写高效的图像处理代码 引言image库概览图像处理基础概念image库的主要组成和功能image接口图像格式的支持color模型 结论 图像的基本操作创建图像新图像的创建从文件加载图像 图像的保存与导出图像的颜色和像素处理绘制基本形状和文字 高级…

无网络连接 请检查你的网络设置 然后重试 [2604] 彻底解决方案

错误提示:无网络连接 请检查你的网络设置 然后重试 [2604] 彻底解决方案如下: 方案一: 打开Internet Explorer浏览器,选择"工具 > Internet 选项"。 在Internet属性窗口下,点击高级下滑到安全模块分类…

[漏洞复现]D-Link未授权RCE漏洞复现(CVE-2024-3273)

声明:亲爱的读者,我们诚挚地提醒您,Aniya网络安全的技术文章仅供个人研究学习参考。任何因传播或利用本实验室提供的信息而造成的直接或间接后果及损失,均由使用者自行承担责任。Aniya网络安全及作者对此概不负责。如有侵权&#…

Linux查看系统配置信息的命令【lscpu】【free】【df】【uname】【lsblk】【top】

目录 1.查看CPU信息【lscpu】 2.查看内存信息【free】 3.查看文件系统信息【df】 4.查看系统信息【uname】 知识扩展:Red Hat Enterprise Linux 和 Debian GNU/Linux 两者的发展介绍 知识扩展:Centos 和 ubuntu的区别 知识扩展:更多 …

Quanto: PyTorch 量化工具包

量化技术通过用低精度数据类型 (如 8 位整型 (int8)) 来表示深度学习模型的权重和激活,以减少传统深度学习模型使用 32 位浮点 (float32) 表示权重和激活所带来的计算和内存开销。 减少位宽意味着模型的内存占用更低,这对在消费设备上部署大语言模型至关…

Python学习从0开始——项目一day01爬虫

Python学习从0开始——项目一day01爬虫 一、导入代码二、使用的核心库三、功能测试3.1初始代码3.2新建文件3.3代码调试 四、页面元素解析4.1网页4.2修改代码4.3子页面4.4修改代码 一、导入代码 在Inscode新建一个python类型的项目,然后打开终端,粘贴以下…

高中数学:三角函数-基础知识

一、任意角 顺时针旋转是负值角 逆时针旋转式正值角 一个角对应一个终边 一个终边对应无数个角 xk*360 例题 二、弧度制 弧长与半径的比值,就是角度 常见角度与弧度的对应关系 例题 三、弧长与扇形面积公式 注意:弧度制下的扇形面积公式&#x…

SpringBoot --pagehelper分页

目录 1.建立数据库 2.页面显示 3.基本逻辑 4.配置依赖 5.使用pagehelper 6.页面列表 页面 效果 1.建立数据库 create database if not exists my_book; use my_book; create table if not exists myBook (id int primary key auto_increment,name varchar(50) not …

Python(4):函数(命名+参数+内置函数+匿名函数)

文章目录 一、关于*的一些打散功能二、函数的特点和命名规范三、函数的返回值return四、函数的参数1.无参数的函数2.有参数的函数 五、函数的命名空间六、全局变量和局部变量七、函数的作用域以及执行顺序(LEGB)八、递归函数九、常见内置函数十、匿名函数-lambda 一、关于*的一…

c++的学习之路:11、string(3)

昨天写string的时候没有说全,这里就开始接着讲。 目录 一、resize 二、insert 三、erase 一、resize 昨天说这个的时候没有考虑到缩小范围时咋处理,然后发现报错了,接着我调试发现缩小就不能正常执行了,因为用的是strcap所以…

芯片设计围炉札记

文章目录 语言Verilog 和 VHDL 区别 芯片验证 语言 System Verilog的概念以及与verilog的对比 IC 设计软件分析 Verilog 和 VHDL 区别 Verilog HDL 和 VHDL 的区别如下: 语法结构:Verilog的语法结构类似于C语言,而VHDL的语法结构则更接近…