如何正确规划 JVM 性能调优

JVM性能调优涉及到很多方面的权衡,其中某一方面可能会极大地影响整体性能。因此,需要综合考虑所有可能的影响。理解并遵循一些基本原则和理论将使性能调优变得更加容易。为了更好地理解本文的内容,您必须满足以下先决条件:

了解 JVM 垃圾收集器
熟悉JVM性能监控常用工具
具备读取GC日志的能力
仅在必要且实用时才进行调优(JVM 性能调优并不能解决所有性能问题)
如果您不熟悉上述内容,建议您在继续阅读本文之前先阅读这些内容。

本文介绍了 JVM 性能调优,并展示了如何使用 JVM 的参数来执行应用程序调优。本文主要涉及以下内容:

JVM调优的一般流程
JVM调优的关键性能指标
重要的 JVM 调优原则
调整策略和示例
性能调优层
为了提高系统性能,我们需要从各个角度、各个层面对系统进行优化。

除了JVM调优之外,还有很多其他层需要优化。系统调优不仅仅包括 JVM 调优。相反,需要对系统进行整体调整以提高系统性能。本文仅介绍 JVM 调优。其他调整方面将在稍后讨论。

在进行JVM调优之前,假设项目的架构和代码已经调优或者是当前项目的最优架构和代码。这两个假设是JVM调优的基础,架构调优对系统性能的影响最为显着。我们不能指望一个架构有缺陷的应用程序能够通过仅执行 JVM 调优来实现质的飞跃。

另外,在调优开始之前,我们需要有明确的性能优化目标,了解当前的性能瓶颈。为了优化瓶颈,我们需要对应用程序进行压力和基准测试,并使用各种监控和统计工具来确认优化后的应用程序是否达到预期目标。

JVM调优过程
调优的最终目标是让应用程序以最低的硬件消耗成本获得更大的吞吐量。JVM 调优也不例外。JVM 调优主要涉及优化垃圾收集器以获得更好的收集性能,从而使运行在虚拟机上的应用程序能够在使用更少的内存和体验更低的延迟的同时获得更大的吞吐量。请注意,更少的内存/更低的延迟并不一定意味着更少/更低的内存/延迟,性能就越好。这是关于最优选择。

性能指标
为了查找和评估性能瓶颈,我们需要了解一些性能指标的定义。对于 JVM 调优,我们需要了解以下三个定义,并将这些指标作为我们评估的基础:

吞吐量:它是重要指标之一。吞吐量是指垃圾收集器允许应用程序达到的最高可能性能,而不考虑垃圾收集引起的暂停时间或内存消耗。
延迟:延迟衡量的是垃圾收集导致的暂停时间减少了多少,以避免应用程序在运行过程中发生振动。
内存使用量:指垃圾收集器顺利运行所需的内存量。
这三个属性中任何一个的性能提升几乎是以其他一两个属性的性能损失为代价的。应用程序业务需求决定了一个或两个属性对于应用程序的重要性。

性能调优原则
在调优过程中,以下三个原则可以帮助我们实现更简单的垃圾收集调优,以满足期望的应用程序性能要求。

Minor GC收集原则:每次Minor GC应该收集尽可能多的垃圾对象,以减少应用程序的Full GC频率。
GC内存最大化原则:在解决吞吐量和延迟问题时,垃圾收集器使用的内存越大,垃圾收集越高效,应用也越流畅。
GC调优“三取二”原则:我们应该只调整三个性能属性中的两个,而不是全部三个属性:吞吐量、延迟和内存使用率。
性能调优过程
JVM 调优涉及持续的配置优化和基于性能测试结果的多次迭代。在满足每个期望的系统指标之前,前面的每个步骤可能会经历多次迭代。在某些情况下,为了满足特定的指标,之前的参数可能需要多次调整,需要重新测试之前的所有步骤。

此外,调优通常从满足应用程序的内存使用要求开始,然后是延迟和吞吐量。调整应遵循以下步骤顺序。我们不能颠倒这些调整步骤的顺序。以下部分将使用示例来详细说明每个调整步骤。

对于运行JVM,我们直接选择Server模式,这是JDK 1.6之后官方推荐的模式。

我们使用JDK 1.6-1.8中默认的并行收集器作为垃圾收集器。(用于 parallelGC 年轻代,parallelOldGC 用于老年代。)

确定内存使用情况
在确定内存使用情况之前,我们需要了解两件事:

应用程序运行阶段
JVM内存分配
运营阶段
我将应用程序的运行分为以下三个阶段:

初始化:JVM加载应用程序并初始化应用程序的主要模块和数据。
稳定性:应用程序已经运行了很长时间,并接受了压力测试。各项性能参数均处于稳定状态。核心功能已通过 JIT 编译执行和预热。
摘要:在最后的总结阶段,进行一些基准测试,生成相应的报告。我们不必关注这个阶段。
内存使用情况和活动​​数据的大小应在应用程序稳定阶段确定,而不是在项目启动阶段确定。在解释如何确定内存使用情况之前,我们先看一下 JVM 内存分配。

JVM 内存分配和参数
3

JVM 的主要堆空间由年轻代、老年代和永久代组成。年轻代大小、老年代大小和永久代大小组成了总堆大小。具体的对象提升方法这里不讨论。现在,让我们看看以下 JVM 命令如何指定堆大小。如果不使用以下参数指定堆大小,虚拟机会自动选择一个合适的值,该值可以根据系统开销自动调整。

4

如果考虑性能开销,请尽可能将永久代的初始大小和最大大小设置为相同的值,因为只有FullGC可以实现永久代的大小调整。

计算活动数据的大小
要计算活动数据的大小,请按照下列步骤操作:

5

正如前面提到的,活动数据大小应该通过自应用程序稳定阶段开始以来长期处于活动状态的数据占用了多少 Java 堆空间来衡量。

计算活跃数据大小时,请务必满足以下要求:

执行测试时,不要手动设置启动参数,而是使用默认的 JVM 参数。
确保Full GC发生时应用程序处于稳定状态。
使用默认的JVM启动参数是为了观察应用程序处于稳定阶段时所需的内存使用情况。

应用程序何时处于稳定阶段?
当应用承受足够的压力后,只有在生产环境的业务高峰时达到满足业务需求的工作负载时,应用才处于稳定阶段,并在高峰后保持稳定。因此,要确定应用程序是否达到稳定阶段,压力测试是必不可少的。如何对应用程序进行压力测试不在本文讨论范围内。这个问题后面会单独写一篇文章来解释。

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

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

相关文章

Docker 笔记(一)--安装

Docker 笔记(一)–安装 记录Docker 安装操作记录,便于查询。 参考 链接: Docker 入门到实战教程(二)安装Docker链接: docker入门(利用docker部署web应用)链接: 阿里云容器镜像服务/镜像加速器/操作文档链接: 网易镜像中心链接: 阿里云镜像…

智能配电系统解决方案

智能配电系统解决方案是一种集成了先进技术和智能化功能的配电系统,它能够提高电力系统的效率、可靠性和安全性。力安科技智能配电系统解决方案依托电易云-智慧电力物联网,具体实施的方案如下: 智能化设备和传感器:采用智能化的开…

「Java开发指南」如何在Spring中使用JAX-WS注释器?

本文将指导您如何使用JAX-WS注释器从Spring服务生成JAX-WS Web服务,在本教程中,您将学习如何: 为Spring服务启用JAX-WS部署应用程序并测试服务 所有与Spring scaffolding相关的任务都需要MyEclipse Spring或Bling授权。 MyEclipse v2023.1…

RT-DETR优化改进:轻量级Backbone改进 | VanillaNet极简神经网络模型 | 华为诺亚2023

🚀🚀🚀本文改进:一种极简的神经网络模型 VanillaNet,支持vanillanet_5, vanillanet_6, vanillanet_7, vanillanet_8, vanillanet_9, vanillanet_10, vanillanet_11等版本,相对于自带的rtdetr-l、rtdetr-x参数量如下: layersparametersgradientsvanillanet_5338277174…

MapApp 地图应用

1. 简述 1.1 重点 1)更好地理解 MVVM 架构 2)更轻松地使用 SwiftUI 框架、对齐、动画和转换 1.2 资源下载地址: Swiftful-Thinking:https://www.swiftful-thinking.com/downloads 1.3 项目结构图: 1.4 图片、颜色资源文件图: 1.5 启动图片配置图: 2. Mo…

前端JS 使用input完成文件上传操作,并对文件进行类型转换

使用input实现文件上传 // 定义一个用于文件上传的按钮<input type"file" name"upload1" />// accept属性用于定义允许上传的文件类型&#xff0c; onchange用于绑定文件上传之后的相应函数<input type"file" name"upload2"…

数据结构-链表的简单操作代码实现3-LinkedList【Java版】

写在前: 本篇博客主要介绍关于双向链表的一些简答操作实现&#xff0c;其中有有部分代码的实现和前两篇博客中的单向链表是相类似的。例如&#xff1a;查找链表中是否包含关键字key、求链表的长度等。 其余的涉及到prev指向的需要特别注意&#xff0c;区分和单向链表之间的差异…

uniapp heckbox-group实现多选

文章目录 html 代码JS 代码 混了业务逻辑&#xff0c;谨慎观看 html 代码 <view><!--可滚动视图区域。用于区域滚动 --><scroll-view :style"{ height: clientHeight px }" :scroll-top"scrollTop" scroll-y"true"scrolltouppe…

http的几种方法

http的几种方法在 rfc2616 中进行了定义&#xff1a; https://www.rfc-editor.org/rfc/rfc2616.html#page-51 HEAD方法&#xff1a;HEAD方法和GET方法相同&#xff0c;只不过服务端只返回头&#xff0c;不返回消息体。GET方法&#xff1a;用于获取资源POST方法&#xff1a;用于…

2013年11月10日 Go生态洞察:Go语言四周年回顾

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

招聘小程序源码 人才招聘网源码

招聘小程序源码 人才招聘网源码 求职招聘小程序源码系统是一种基于微信小程序的招聘平台&#xff0c;它可以帮助企业和求职者快速、方便地进行招聘和求职操作。 该系统通常包括以下功能模块&#xff1a; 用户注册和登录&#xff1a;用户可以通过微信小程序注册和登录&#…

javascript选择器的封装,只需要写元素名或css类及id都可以选择到元素

//模仿jquery选择器样式&#xff0c;只需要写元素名或css类及id都可以选择到元素 <html><head><meta http-equiv"Content-Type:text/html;charsetutf8"/><link rel"shortcut icon" href"#"/><title>封装选择器&l…

MySQL中json类型,你使用过吗

在最近的项目开发过程中&#xff0c;遇到了消息发送内容以Map形式存储的情况。最初的解决方案是将对象转换为字符串&#xff0c;并存储在MySQL的varchar(3000)字段中。然而&#xff0c;由于对存储空间的限制&#xff0c;不得不寻找其他解决方案。在调研中发现&#xff0c;从MyS…

如何利用ChatGPT撰写学术论文?

在阅读全文前请注意&#xff0c;本文是利用ChatGPT“辅助完成”而不是“帮写”学术论文&#xff0c;请一定要注意学术规范&#xff01; 本文我将介绍如何使用清晰准确的“指令”让ChatGPT帮助我们在论文写作上提高效率&#xff0c;希望通过本文的指导&#xff0c;读者能够充分…

uniapp app tabbar 页面默认隐藏

1.在page.json 中找到tabbar visible 默认为true,设为false则是不显示 uni.setTabBarItem({ index: 1, //列表索引 visible:true //显示或隐藏 })

Linux环境的Windows子系统

Linux环境的Windows 子系统 (WSL) 可让开发人员直接在 Windows 上按原样运行 GNU/Linux 环境&#xff08;包括大多数命令行工具、实用工具和应用程序&#xff09;&#xff0c;且不会产生传统虚拟机或双启动设置开销。 1、启用适用于 Linux 的 Windows 子系统 dism.exe /online …

PyTorch

正常界面 创建环境 conda create -n env_test python3.6进入环境 conda activate env_testpycharm中&#xff0c;创建项目&#xff0c;选择环境

Ubuntu18.04安装IgH主站

EtherCAT主站是EtherCAT网络中的中央控制单元,负责协调和管理连接到网络的所有从站设备。EtherCAT(Ethernet for Control Automation Technology)是一种高性能、实时的工业以太网通信协议,广泛应用于自动化和控制领域。 一、安装依赖包 sudo apt install autoconf automa…

LeetCode(26)判断子序列【双指针】【简单】

目录 1.题目2.答案3.提交结果截图 链接&#xff1a; 判断子序列 1.题目 给定字符串 s 和 t &#xff0c;判断 s 是否为 t 的子序列。 字符串的一个子序列是原始字符串删除一些&#xff08;也可以不删除&#xff09;字符而不改变剩余字符相对位置形成的新字符串。&#xff08;…

【Java】恺撒密码,stream流,方法引用

文章目录 一、题目二、题解2.1、写法12.2、写法2&#xff0c;stream流2.3、写法3&#xff0c;方法引用 一、题目 二、题解 2.1、写法1 普通写法, 遍历每个字符进行加密 public static void main1 (String[] args) {Scanner sc new Scanner(System.in);String strs sc.nextL…