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

文章目录

  • 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.mzph.cn/news/806634.shtml

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

相关文章

头歌机器学习实验 第7次实验 局部加权线性回归

任务描述 本关任务:编写一个利用局部加权计算回归系数的小程序。 相关知识 为了完成本关任务,你需要掌握:1.局部加权算法的思想;2.局部加权的核心算法。 局部加权算法的思想 在局部加权算法中 ,我们给待预测点附近…

【mT5多语言翻译】之六——推理:多语言翻译与第三方接口设计

请参考本系列目录:【mT5多语言翻译】之一——实战项目总览 [1] 模型翻译推理 在分别使用全量参数微调和PEFT微调训练完模型之后,我们来测试模型的翻译效果。推理代码如下: # 导入模型 if conf.is_peft:model AutoModelForSeq2SeqLM.from_pr…

为什么需要SOCKS代理?

在数字化时代🌐,随着网络安全威胁的不断演进和增加,保护个人隐私和数据安全成为了互联网用户的一大挑战🛡️。在寻求增强在线安全和隐私的解决方案时,SOCKS代理成为了一个关键的技术工具🔑。本文旨在详细探…

python如何输入多行

Python中的Input()函数在输入时,遇到回车符,那么一次输入就结束了。这不能满足输入多行文本并且行数也不确定的情形,当然输入空行也是允许的。 方法1:利用异常处理机制实现 lines[] while True:try:lines.append(input())except:…

JSON三种数据解析方法

文章目录 一、什么是JSON数据?二、JSON解析方法2.1、原生解析2.2、Gson解析2.3、FastJson解析 四、总结 一、什么是JSON数据? 先看下面,这里有一段JSON数据,我们根据这段数进行讲解: {"paramz": {"fe…

springboot+vue全栈开发【1.准备工作篇】

目录 前言环境配置关于Maven 前言 为了坚持每天写博客所以开了这个系列~~ 环境配置 1.配置java环境,下载jdk,配置环境变量 这一步有很多教程,不赘述了 2.安装idea 关于Maven Maven是一个项目管理工具,可以对java项目进行自动化…

Harmony与Android项目结构对比

主要文件对应 Android文件HarmonyOS文件清单文件AndroidManifest.xmlmodule.json5Activity/Fragmententryability下的ts文件XML布局pages下的ets文件resresourcesModule下的build.gradleModule下的build-profile.json5gradlehvigor根目录下的build.gradle根目录下的build-profi…

Linux——fork复制进程

1)shell: 在计算机科学中,Shell俗称壳(用来区别于核),是指“为使用者提供操作界面”的软件(command interpreter,命令解析器)。它类似于DOS下的COMMAND.COM和后来的cmd.exe。它接收用户命令&…

【Locust分布式压力测试】

Locust分布式压力测试 https://docs.locust.io/en/stable/running-distributed.html Distributed load generation A single process running Locust can simulate a reasonably high throughput. For a simple test plan and small payloads it can make more than a thousan…

30岁《爱·回家》小花多次得罪高层,正式宣布离巢TVB。

30岁的苏韵姿(Andrea)16年选港姐入行,虽然无三甲名次,但靠着皇后大学戏剧学士学位背景,她很快已有机会入剧组,凭《爱回家之开心速递》熊心如(红衫鱼)一角成功入屋,不过去…

Mongodb入门--头歌实验MongoDB 数据库基本操作

一、数据库创建 任务描述 本关任务:创建数据库。 相关知识 本关评测是在 Linux 环境下进行的,MongoDB 的安装与配置测评系统均已默认完成。 为了完成本关任务,你需要掌握: 1.如何连接数据库; 2.如何创建数据库。 连接数…

双云及多云融合(混合云)

背景:客户对于业务的高可用需求,当发生故障时,业务还能正常使用,如某云机房整体宕机,或云管理服务整体宕掉,导致客户业务不可用,此时,需有业务能顺利切换到灾备云上。 需求&#xf…

[蓝桥杯 2018 国 C] 迷宫与陷阱

题目&#xff1a; 思路&#xff1a; 代码&#xff1a; #include <bits/stdc.h> using namespace std; const int N1e310; char g[N][N];//输入&#xff1a;图的数组 int vis[N][N]; /* 剪枝&#xff1a;记录magic的个数&#xff08;一个点经过两次&#xff0c;magic越大…

【讲解下如何从零基础学习Java】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

设计模式学习笔记 - 设计模式与范式 -行为型:9.迭代器模式(上):相比直接遍历集合数据,使用迭代器模式有哪些优势?

概述 上篇文章&#xff0c;我们学习了状态模式。状态模式是状态机的一种实现方式。它通过将事件触发的状态转移和动作执行&#xff0c;拆分到不同的状态类中&#xff0c;以此来避免状态机类中的分支判断逻辑&#xff0c;应对状态机类代码的复杂性。 本章&#xff0c;学习另外…

Dude, where’s that IP? Circumventing measurement-based IP geolocation(2010年)

下载地址:https://www.usenix.org/legacy/event/sec10/tech/full_papers/Gill.pdf 被引次数:102 Gill P, Ganjali Y, Wong B. Dude, Wheres That {IP}? Circumventing Measurement-based {IP} Geolocation[C]//19th USENIX Security Symposium (USENIX Security 10). 2010.…

day55 最长递增子序列 最长连续递增子序列 最长重复子数组

题目1 300 最长递增子序列 题目链接 300 最长递增子序列 题意 找到整数数组nums的最长严格递增子序列的长度&#xff08;子序列并不改变原始的顺序&#xff0c;但是可以删除元素&#xff09; 动态规划 动规五部曲 1&#xff09;dp数组及下标i的含义 dp[i] 表示以nums[i…

dnspy逆向和de4dot脱壳

拿到一个软件&#xff0c;使用dnspy查看&#xff0c;发现反汇编后关键部分的函数名和代码有很多乱码&#xff1a; 这样的函数非常多&#xff0c;要想进一步调试和逆向&#xff0c;就只能在dnspy中看反汇编代码了&#xff0c;而无法看到c#代码&#xff0c;当时的整个逆向过程只剩…

遥感图像处理:从畸变消除到专题信息提取

​ ​ ​在遥感技术的应用中&#xff0c;图像处理是不可或缺的关键步骤。从消除各种辐射畸变和几何畸变&#xff0c;到利用增强技术突出景物的光谱和空间特征&#xff0c;再到进一步理解、分析和判别处理后的图像&#xff0c;这一过程为我们呈现了一幅幅更为真实、清晰的…

免费ssl证书能一直续签吗?如何获取SSL免费证书?

免费SSL证书是否可以一直续签。我们需要了解SSL证书的基本工作原理。当你访问一个使用HTTPS协议的网站时&#xff0c;该网站实际上在使用一个SSL证书。这个证书相当于一个数字身份证明&#xff0c;它验证了网站的真实性和安全性。而这个证明是由受信任的第三方机构——通常是证…