[ JVM ] 常用参数 优化参考

news2025/3/9 10:54:49

基础概念回顾


JDK、JRE、JVM的关系(JDK>JRE>JVM)

JDK = JRE + 开发工具 、JRE = JVM + 类库,具体关系如下图:

JDK(Java Development Kit) 用于开发 Java 应用程序的软件开发工具集合,包括 了 【Java 运行时的环境(JRE)】、【DevelopmentTools开发工具包:解释器(Java):编译器(javac)、Java 归档 (jar)、文档生成器(Javadoc)等工具】。简单的说我们要开发Java程序,就需要安 装某个版本的JDK工具包。

JRE(Java Runtime Enviroment )提供 Java 应用程序执行时所需的环境,由 Java 虚拟机(JVM)、核心类、支持文件等组成。简单的说,我们要是想在某个机器上运 行Java程序,可以安装JDK,也可以只安装JRE,后者体积比较小。

JVM(Java Virtual Machine)(Java 虚拟机)有三层含义,分别是:

  • JVM规范要求

  • 满足 JVM 规范要求的一种具体实现(一种计算机程序)

  • 一个 JVM 运行实例,在命令提示符下编写 Java 命令以运行 Java 类时,都会创建一 个 JVM 实例,我们下面如果只记到JVM则指的是这个含义;如果我们带上了某种JVM 的名称,比如说是Zing JVM,则表示上面第二种含义

三者在开发运行Java程序时的交互关系:                                                                                                                                                                                                                                          

        简单的说,就是通过JDK开发工具,编译以后,可以打包分发给其他装有JRE的机器上去运行。而这个运行的程序,就是通过java命令启动的一个JVM实例,我们所有代码逻辑的执行都运行在这 个JVM实例上 。                                                                                                                                                                                                                                                                                

关于 Java运行时 和 JVM虚拟机 概念:                                                                                                                                                                                                                                          

        简单的说JRE就是Java的 “运行时”,包括虚拟机和相关的库等资源。 可以说运行时提供了程序运行的基本环境,JVM在启动时需要加载所有运行时的核心库(Libraries)等资源,然后再加载我们的应用程序字节码,才能让应用程序字节码运行在JVM这 个容器里。                                              

下图为JDK中的开发 [Development Tools工具包] 编译成Class文件到运行时 [JRE-JVM] 的过程:

三大类型事件

  • MinorGC: 收集年轻代内存的GC事件称为 Minor GC

  • MajorGC: 清理老年代空间(Old Space)的GC事件

  • FullGC: 清理整个堆内存空间的GC事件,包括年轻代空间和老年代空间

                                                                                                                                                     

        其实 Major GC 和 Full GC 有时候并不能很好地区分。更复杂的情况是, 很多 Major GC 是由Minor GC 触发的,所以很多情况下这两者是不可分离的。 另外,像G1这种垃圾收集算法,是每次找一小部分区域来进行清理,这部分区域中可能有一部分是年轻 代,另一部分区域属于老年代。

                                                                                                                                                        

        所以我们不要太纠结具体是叫 Major GC 呢还是叫 Full GC ,它们一般都会造成单次较长时间的STW暂停。我们需要关注的是:某次GC事件,是暂停了所有线程、进而对系统造成了性能影响呢,还是与其他业务线程并发执行、暂停时间几乎可以忽略不计,比如GC频率高如果暂停时间低的话就会降低延迟,但是牺牲了吞吐率,而如果频率低,暂停时间如果高的话则会提升吞吐率,但会可能提升延迟,而这些就是需要权衡优化的点之一。

                                                                                                                                                                                           

关键指标参考


计算机中三个关键指标
  1. cpu:因单位时间有限,所以由于业务逻辑不合理而出现瓶颈等...

  2. 内存:数据可直接使用的暂存空间,GC会回收垃圾,但是GC配置不合理也有可能造成OOM

  3. IO(存储+网络):存储数据时持久化的IO过程,分布式多机部署时网络的IO过程。

性能优化常见套路

遵循2/8原则: 所有慢因素按照对性能影响列一个清单,前20%的瓶颈问题对性能影响站80%,也就是说解决这20%性能就会好一大半。

ps:与JVM有关的核心资源cpu和内存。

衡量系统的三个维度 —— [ 延迟(单位: RP)、吞吐量(单位: TPS、QPS)、系统容量 (计算机常用单位)]
  • 延迟: 衡量单位 —— RT(Response Time)响应时间,一般为平均响应时间,比如要保障95%用户在可接受响应范围,则可叫做P95(percent95)-95线,而同理99%用户就是99线。那么要保障P95用户平均1s的RT就是保障95%用户请求的平均响应时间为1s。

  • 吞吐量: 衡量单位——TPS(TransactionPerSecend)每秒处理的事务(增删改查)数、QPS(QueryPerSecend)每秒处理的请求(查)数。

  • 系统容量: 也叫做设计容量,可理解为硬件配置。

此外还可从另外一个维度来讲性能指标分为两类:

业务需求指标: 如吞吐量(QPS、TPS)、响应时间(RT)、并发数、业务成功率等

资源约束指标: 如CPU、内存、I/O等资源的消耗情况。

PS:另外不同种类的系统,关注的性能侧重点还不一样。比如【批处理/流处理型系统】更关注的是吞吐量,延迟可适当放宽。而【高可用的Web型系统】则及关注高并发下的系统响应时间也关注吞吐量。

                                                                                                                                                      

: "配置2核4GB的节点,每秒响应200个请求,95%线是20ms,最大响应时间40ms。"

                                                                                                                                                      

从上文可以解读出基本的性能信息: 响应时间(RT<40ms), 吞吐量(200TPS), 系统配置信息(2C4G)。隐含的条件可能是 "并发请求数不超过200 "。类似这样的情况,我们可采用的分析优化的手段和方式包括:

                                                                                                                                                      

  • 使用JDWP(Java Platform Debugger Architecture) 或开发工具做本地/远程调试

  • 系统和JVM的状态监控,收集分析指标

  • 性能分析: CPU使用情况/内存分配分析                                                                                          

常用配置清单


        以下为常用配置参数介绍,有点要先说明 —— 大部分情况下,配置GC参数并不是越多越好。原则上只配置最重要的几个参数即可,其他的都保持默认值,除非你对系统的业务特征有了深入的分析和了解,才需要进行某些细微参数的调整。 毕竟,古语有云:“过早优化是万恶之源”

一、内存参数:

  • -Xmx: 最大堆内存大小

  • -Xms: 初始化时的堆内存大小

  • -Xmn: 等价于-XX:NewSize,指新生代大小(注意:使用 G1 垃圾收集器 不应该 设置该选项,在其他的某些业务场景下可以设置。官方建议设置为 -Xmx1/2 ~ 1/4。)

  • -XX:MetaspaceSize: 指定元数据区最小大小(Java8以后)

  • -XX:MaxMetaspaceSize: 指定元数据区最大大小(Java8以后)(注意:Java8 默认不限制 Meta 空间, 一般不允许设置该选项)

  • -XX:PermSize、-XX:MaxPermSize: 分别设置永久代最小大小与最大大小(Java8以前)

  • -XX:MaxDirectMemorySize: 最大直接内存(也就是堆外内存),这个参数跟-Dsun.nio.MaxDirectMemorySize效果相同。

  • -XX:MaxTenuringThreshold: 设置转入老年代的存活次数(也就是在新生代未被回收的次数)。如果是0,则直接跳过新生代进入老年代

  • -XX:SurvivorRatio: 新生代中Eden区与两个Survivor区的比值。

  • -XX:NewRatio: 设置新生代和老年代的比值。

  • Xss:设置每个线程栈的字节数。 例如 -Xss1m 指定线程栈为 1MB,与-XX:ThreadStackSize=1m等价

二、垃圾回收器参数:

  • -XX:+UseG1GC:使用 G1 垃圾回收器(注意:使用 G1垃圾收集器: -XX:+UseG1GC 。原则上不能指定G1垃圾收集器的年轻代大小,否则不仅是画 蛇添足,更是自废武功了。因为G1的回收方式是小批量划定区块(region)进行,可能一次普通GC中 既有年轻代又有老年代,可能某个区块一会是老年代,一会又变成年轻代了。 )

  • -XX:+UseSerialGC:使用串行收集器

  • -XX:+UseParallelGC:使用并行收集器

  • -XX:+UseParalledlOldGC:使用并行老年代收集器

  • -XX:+UseConcMarkSweepGC:使用并发收集器

三、垃圾回收器参数:

  • -XX:+PrintGCDetails: 打印GC日志详情

  • -Xloggc:gc.demo.log : 将日志信息作为文件保存(默认在项目的根目录下,若需指定位置可在前面加路径,如

    -Xloggc:/var/log/gc.demo.log)

  • -XX:+PrintGCDateStamps:打印GC时间发生的日期和时间

  • -XX:+PrintGCApplicationStoppedTime: 输出每次GC的持续时间和程序暂停时间;

四、其他参数(诊断or预警):

  • -XX:+-HeapDumpOnOutOfMemoryError: 当 OutOfMemoryError 产生 —— 即内存溢出(堆内存或持久代)时,自动 Dump 堆内存。 因为在运行时并没有什么开销, 所以==在生产机器上是可以使用的==。 示例用法: java -XX:+HeapDumpOnOutOfMemoryError -Xmx256m ConsumeHeap

  • -XX:HeapDumpPath : 与HeapDumpOnOutOfMemoryError搭配使用, 指定内存溢出时 Dump 文件的目录。 如果没有指定则默认为启动 Java 程序的工作目录。 示例用法: java -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/usr/local/ ConsumeHeap 自动 Dump 的 hprof 文件会存储到 /usr/local/ 目录下。

  • -XX:OnError : 发生致命错误时(fatal error)执行的脚本。 例如, 写一个脚本来记录出错时间, 执行一些命令, 或者 curl 一下某个在线报警的url. 示例用法: java -XX:OnError="gdb - %p" MyApp 可以发现有一个 %p 的格式化字符串,表示进程 PID。

  • -XX:OnOutOfMemoryError : 抛出 OutOfMemoryError 错误时执行的脚本。

  • -XX:ErrorFile=filename 选项: 致命错误的日志文件名,绝对路径或者相对路径。

        注: 以上只把JVM一些常用配置参数列举出来了,如果要了解完整的JVM配置参数清单,可在官网查看:

Java HotSpot VM Options

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

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

相关文章

【接口mock工具】推荐一个好用的api接口关联,接口mock,文档管理的工具-yapi

【接口mock工具】推荐一个好用的api接口关联&#xff0c;接口mock&#xff0c;文档管理的工具-yapi 能满足的功能 &#xff1a; 1. 接口mock 2. 接口文档生成 3. 接口自动化测试 4. 接口自动化测试结果可以发送到你的企业微信上面 5. 接口管理可以按照分组&#xff0c;分项…

python数据分析之利用多种机器学习方法实现文本分类、情感预测

大家好&#xff0c;我是带我去滑雪&#xff01; 文本分类是一种机器学习和自然语言处理&#xff08;NLP&#xff09;任务&#xff0c;旨在将给定的文本数据分配到预定义的类别或标签中。其目标是为文本数据提供自动分类和标注&#xff0c;使得可以根据其内容或主题进行组织、排…

初见RNN(第七次组会)

初见RNN&#xff08;第七次组会&#xff09; 序列模型、马尔可夫假设循环神经网络 序列模型、马尔可夫假设 循环神经网络

[rocketmq] 浅谈结构

rocketmq 结构 NameServer &#xff1a;几乎是无状态节点&#xff0c;可横向扩展&#xff0c;节点之间无消息同步&#xff0c;主要负责对源数据的管理&#xff0c;包括对于Topic和路由信息的管理。 每个 Broker 在启动的时候会到 NameServer 注册&#xff0c;Producer 在发送消…

【UEFI实战】UEFI图形显示(从像素到字符)

GraphicsConsoleDxe 在【UEFI实战】UEFI图形显示&#xff08;显示驱动&#xff09;中已经介绍了如何使用显卡驱动安装的GOP来进行像素级别的显示&#xff0c;本文介绍的内容是对像素的包装&#xff0c;最终变成普通字符的输出。 模块简述 本模块将原本的GOP包装成了字符输出…

MySQL数据库——主从复制优化及读写分离

目录 主从复制优化主服务器配置优化redo log&#xff08;事务日志&#xff09;的刷盘策略从服务器配置优化 搭建MySQL读写分离 主从复制优化 主服务器配置优化 vim /etc/my.cnf expire_logs_days7 #设置二进制日志文件过期时间&#xff0c;默认值为0&#xff0c;表示logs不…

Vue2生命周期

Vue2生命周期 1、概念2、生命周期过程2.1 流程图示2.2 三阶段 3、钩子函数详解3.1 beforeCreate() 创建前3.2 created()创建后3.3 beforeMount() 挂载前3.4 mounted()挂载完成3.5 beforeUpdate() 更新前3.6 updated() 更新后3.7 beforeDestroy() 销毁前3.8 destroyed() 销毁完成…

在群晖上安装运行Airflow

本文是应网友 &#xff1a; 要求折腾的&#xff1b; 什么是 Airflow &#xff1f; Apache Airflow 是一个开源平台&#xff0c;用于开发、调度和监控面向批处理的工作流。Airflow 的可扩展 Python 框架使您能够构建与几乎任何技术连接的工作流。Web 界面有助于管理工作流程的状…

RabbitMQ灵活运用,怎么理解五种消息模型

RabbitMQ灵活运用&#xff0c;怎么理解五种消息模型 简介一、AMQP协议二、交换机类型与默认交换机1. 交换机的四种类型2. 默认交换机 三、五种模式速览1. 一对一简单模式2. work模式&#xff08;轮询&#xff09;3. 发布/订阅模式4. 路由模式&#xff08;自称direct模式&#x…

Android 应用自动开启辅助(无障碍)功能并使用辅助(无障碍)功能

一.背景 由于最近的项目需要开启无障碍功能然后实现对应的功能需求,但是由于需求是需要安装后就开启辅助功能,不要在繁琐的在设置中开启辅助功能,所以需要如何在应用中开启辅助功能。 二.前提条件 将普通应用转换成系统应用,然后将系统的framework.jar包放到应用中并且可以…

vscode配置task.json和launch.json启动调试

首先说一下参考博文&#xff1a; 文章标题“VScode 调试教程 tasks.json和launch.json的设置&#xff08;超详细&#xff09;” 地址&#xff1a;https://blog.csdn.net/qq_59084325/article/details/125662393 官方文档太官方&#xff0c;其他人的文档也看过&#xff0c;单独…

微信小程序浏览docx,pdf等文件在线预览使用wx.openDocument

wx.downloadFile({ url: fileUrl,//pdf链接success(res) {wx.openDocument({ //打开文档filePath: res.tempFilePath,fileType: "pdf",//文档类型showMenu: true,success: function (res) {wx.showToast({title: 打开文档成功,})},fail: function (res) {wx.showToas…

Stable Diffusion使用“面部修复”时报TypeError: ‘NoneType‘ object is not subscriptable错

问题 Stable Diffusion使用“面部修复”时报TypeError: ‘NoneType’ object is not subscriptable错 解决方案 下载【detection_Resnet50_Final.pth】和【parsing_parsenet.pth】到【repositories\CodeFormer\weights\facelib】目录下&#xff0c;并重新运行项目即可。 ht…

Unity 基础之 URP 项目创建\项目转URP Pipline

Unity 基础之 URP 项目创建\项目转URP Pipline 目录 Unity 基础之 URP 项目创建\项目转URP Pipline 一、简单介绍 二、创建 URP 项目 三、工程项目转 URP 一、简单介绍 Unity中的一些基础知识点&#xff0c;方便日后查阅。 Unity游戏开发中&#xff0c;这里简单介绍如何创…

Methodot低代码开发教程——玩转表格增删改查分页

目录 1、背景介绍 2、连接数据源 2.1 新增数据源 2.2 填写数据源信息 3、表格数据的展示 3.1 新增查询&#xff0c;编写查询语句 3.2 使用表格组件 3.3 同步数据源与表格列名 4、表格的数据新增 4.1 新增查询&#xff0c;编写新增语句 4.2 表格配置新增一行&#xff0…

华为云专家出品《从零到一•Python图像处理入门》电子书

《华为云云享.书库》系列电子书来啦&#xff01; 本系列电子书旨在帮助开发者成长&#xff0c;汇聚华为云内外部专家技术精华制作而成。 本书《从零到一•Python图像处理》是该系列电子书第3部。 我们在华为开发者即将到来之际&#xff0c;开放电子书免费下载。 点击下方链接…

JVM探究

JVM探究 请谈谈你对JVM的理解&#xff1f;java8虚拟机和之前的变化、更新&#xff1f;什么是OOM&#xff0c;栈溢出StackOverFlowError&#xff1f;怎么分析&#xff1f;JVM的常用调优参数有哪些&#xff1f;内存快照如何 抓取&#xff0c;怎么分析Dump文件&#xff1f;知道吗…

Unity VR开发教程 OpenXR+XR Interaction Toolkit(八)手指触控 Poke Interaction

文章目录 &#x1f4d5;教程说明&#x1f4d5;XR Poke Interactor&#x1f4d5;与 UI 进行触控交互⭐添加 Tracked Device Graphic Raycaster 和 XR UI Input Module 让 UI 可被交互 &#x1f4d5;与物体进行交互⭐XR Simple Interactable⭐XR Poke Filter 往期回顾&#xff1a…

【Linux进程】进程的基本概念 {PCB结构体,进程表,Linux中的task_struct,查看进程,获取进程PID,使用fork创建子进程}

一、进程的基本概念 1.1 什么是进程&#xff1f; 进程是计算机中正在运行的程序的实例。它是操作系统进行资源分配和调度的基本单位。每个进程都有自己的内存空间、代码、数据和执行状态。进程可以独立运行&#xff0c;相互之间不会干扰。操作系统可以同时运行多个进程&#…

vue表格实现一个简单的合并单元格功能

用的是vue2ant-design-vue 但是vue3或者element-ui也是同理 先上效果 需要后端的数据将相同id的放在一起 否则也会有问题 例如&#xff1a; this.list [{id: 1,name: 舟山接收站,...}{id: 2,name: 舟山接收站碳中和LNG,...},{id: 2,name: 舟山接收站碳中和LNG,...} ]// th…