Java 应用性能优化

一、性能调优涉及哪些方面

Java 编程性能调优。包括数据类型,集合容器,网络通信。

多线程性能调优。包括线程安全,同步锁的问题,多线程的性能问题。

JVM 性能监控及调优。包括Java对象的创建和回收,内存分配。

设计模式调优。使用设计模式来优化架构设计。

数据库性能调优。数据库最容易成为整个系统的性能瓶颈,包括一些常用的数据库调优方法。

二、如何制定性能调优标准?

任何系统上线都有有性能问题,我们要做的是压力测试,让问题暴露出来。

       性能调优的目的:

        1)用压力测试暴露响应延迟问题,然后解决客户请求响应的问题。

        2)性能优化可以降低服务器数量,同时提升性能指标。

三、何时介入性能调优?

在项目开发初期:

       没有必要在意性能优化,否则会降低开发进度,同时不会提升性能。我们只要在代码层面保证有效编码,比如减少IO操作,降低竞争锁的使用,高效的算法,已经设计模式(比如在设计商品价格的时候,有很多折扣,红包活动,这时候可以用装饰者模式去设计这个业务实现)。

在系统编码完成以后:

       根据产品经理提供的线上预期数据,我们可以通过压测,性能分析,统计工具来统计各项性能指标是否在预期范围之内。

       上线之后,我们要通过监控系统来判断线上的性能问题,最后根据日志来判断问题并解决。

四、哪些因素可以体现系统性能?

CPU: 有些计算任务会长时间,不间断的占用CPU资源,导致其它任务无法争夺到CPU资源,这种情况有下面几种:

  • 代码递归导致的无限循环。
  • JVM 频繁的 FULL GC.
  • 多线程编程造成的大量上下文切换。

内存:JVM中的堆内存来存储类对象,如果对象没有及时收回,就会导致内存溢出的问题。

磁盘I/O: 磁盘IO的读写速度慢于内存,频繁的大量的磁盘IO会导致响应变慢。

网络:网络带宽不够也会造成性能瓶颈。

异常:java异常的捕获和处理是非常消耗资源的,如果程序高频率地在异常处理也会影响系统。

数据库:大量的数据库读写操作会导致磁盘I/O性能瓶颈,进而导致数据库响应的延迟。

锁竞争:在并发编程中,我们经常会需要多个线程,共享读写操作同一个资源,这个时候为了保持数据的原子性(即保证这个共享资源在一个线程写的时候,不被另一个线程修改),我们就会用到锁。锁的使用可能会带来上下文切换,从而给系统带来性能开销。Java 为了降低锁竞争带来的上下文切换,对 JVM 内部锁做了多次优化,例如,新增了偏向锁、自旋锁、轻量级锁、锁粗化、锁消除等。而如何合理地使用锁资源,优化锁资源,就需要你了解更多的操作系统知识、Java 多线程编程基础,积累项目经验,并结合实际场景去处理相关问题。

五、衡量一般系统的性能

响应时间

响应时间越短,性能越好,一般一个接口的响应时间是在毫秒级。在系统中,我们可以把响应时间自下而上细分为以下几种:

吞吐量

TPS是业务层面衡量吞吐量的最重要指标,表示每秒事务处理量。TPS 越大越好,吞吐量自下而上分两种:磁盘吞吐量和网络吞吐量。

磁盘吞吐量,也有两个指标:

一个是IOPS(Input/Output Per Second), 指每秒读写次数,单位时间内系统能处理的IO请求数,IO请求通常为读或写数据操作请求,关注随机读写性能。适用于随机读写频繁的应用。如,小文件存储(图片,视频等),OLTP数据库,邮件服务等。

另一个是数据吞吐量,单位时间呃逆可以成功传输的数据量。对应大量顺序读写频繁的应用,传输大量连续数据,如,视频点播,数据吞吐量是关键指标。

网络吞吐量:

指网络传输时没有帧丢失的情况下,设备能够接受的最大数据速率。网络吞吐量不仅仅跟带宽有关系,还跟 CPU 的处理能力、网卡、防火墙、外部接口以及 I/O 等紧密关联。而吞吐量的大小主要由网卡的处理能力、内部程序算法以及带宽大小决定。

六、计算机资源分配使用率

上述指标整体来看就要按木桶理论来考虑,如果其中任何一块木板出现短板或任何一项分配不合理,对整个系统性能的影响都是毁灭性的。

七、如何判断负载承受能力

当系统压力上升时,系统响应时间的上升曲线是否平缓。如果响应时间出现了突然暴涨,那么可能就是系统所能承受的负载极限,例如,当你对系统进行压测时,系统的响应时间会随着系统并发数的增加而延长,直到系统无法处理这么多请求,抛出大量错误时,就到了极限。

迭代过程中,充分保证系统的稳定性给你延伸一个方法,就是将迭代之前版本的系统性能指标作为参考标准,通过自动化性能测试,校验迭代发版之后的系统性能是否出现异常,这里就不仅仅是比较吞吐量、响应时间、负载能力等直接指标了,还需要比较系统资源的 CPU 占用率、内存使用率、磁盘I/O、网络 I/O 等几项间接指标的变化。

八、如何制定性能调优策略

调优策略三个阶段:测试-分析-调优

性能测试攻略

微基准性能测试

针对某一个模块或一个方法在不同实现方式下的性能对比。比如,对比一个方法在同步和非同步实现的性能对比。

宏基准性能测试

这是一个综合测试场景,需要考虑到测试环境,测试环境和测试目标。

首先测试环境需要模拟线上的真实环境。

选择测试场景时,我们需要确定在测试某个接口时,是否有其他接口也同时有请求,造成对这个接口测试的干扰。如果有必须考虑到,否则测试结果会有偏差。

最后设定测试目标:包括吞吐量,响应时间来衡量系统服务是否达标。不达标就要进行优化,达标就要加大测试并发数,探底接口的TPS。这样做可以了解接口性能。同时要观察各个服务器的CPU,内存已经I/O使用率的变化。

性能测试过程中需要注意的问题

java 应用热身问题

先简单介绍一下 java 应用运行原理

我们知道java class文件编译后会生成 .class 文件,但.class 文件并不是能够直接执行的机器码。java 应用在运行的时候,并不是把.class 都转换为机器码文件,而是运行应用的时候通过解释器实时把.class 文件转换为机器码文件,然后执行机器码。这样做是为了节约内存和执行效率。而当jvm观察到有些.class 文件执行的频率比较频繁,那么就会把.class 文件编译转换为机器码并加载到内存中,这样就可以实时运行机器码了,这样就加快的执行效率。

所以,我们要考虑到当第一个请求过来的时候,可能会造成应用执行比较慢,这时就需要我们优化一下。

应用测试不稳定

当我们用同样的测试数据集进行性能测试的时候,会出现每次测试结果不一致,这个现象很正常,比如被机器其它进程影响,网络波动,以及被不同阶段的垃圾回收影响等。

多JVM情况下的影响

如果我们的一个机器上部署了多个应用,比如部署在不同的 tomcat 上,那么不同的 JVM 直接肯定会有一定的影响。所以,建议不要部署多个 JVM 在一个机器上进行性能测试。

分析结果,制定调优策略

完成性能测试后,会输出一份性能测试报告,包括测试接口的平均,最大和最小吞吐量,响应时间,服务器的CPU, 内存,网络 I/O 使用率,JVM 的 GC 频率。

分析查找问题时,需要自下而上的方式定位问题,首先从操作系统层面,查看系统的 CPU, 内存,I/O, 网络的使用率是否有异常。再找异常日志来定位具体问题。

看完操作系统层面,再来分析 JVM 层面的问题,查看垃圾回收频率,以及内存分配情况,分享日志,确定问题。

如果操作系统和 JVM 都没有问题,那么我们就要看具体的java应用了,例如 java 编程问题,读写数据瓶颈等。

分析问题是从下而上的,而具体的调优是采用自上而下的。下面几种方法是从应用到操作系统层面的优化策略:

优化代码

一种很容易发现并暴露出来。比如,我们某段代码导致内存溢出,往往是 JVM 中的内存用完了, 这个时候会引发 JVM 频繁的进行垃圾回收,那么频繁的进行垃圾回收会导致 CPU 100% 以上高居不下。

另一种很难暴露出来。需要我们依靠经验来判断,比如 LinkedList 集合,如果使用 for 循环遍历该容器,将大大降低读的效率,但这种效率的降低很难导致系统性能参数异常。如果改用 Iterator (迭代器)迭代循环该集合会好很多,这是因为 LinkedList

是链表实现的,如果使用 for 循环获取元素,在每次循环获取元素时,都会去遍历一次List,这样会降低读的效率。

优化设计

面向对象有许多设计模式,可以帮助优化业务层以及中间层的代码设计。不仅能精简代码还能够提升整体的性能。比如,单例模式可以共享一个对象,这样在频繁调用创建对象的场景中可以减少创建和销毁对象所带来的性能消耗。

优化算法

好的算法可以帮助我们大大提升系统性能,比如,用合适的查找算法可以降低时间复杂度。

时间换空间

应用对查询的速度没有太高的要求,但是对于内存空间要求比较高,这时就需要用时间来换空间。

如,用 String 对象的intern 方法, 可以将重复率比较高的数据集存储在常量池,重复的使用一个相同的对象,这样可以大大节省内存存储空间。但常量池使用的是 HashMap 数据结构类型, 如果我们存储数据过多,查询的性能就会下降,所以在这种对存储量要求比较苛刻,但对查询速度不做要求的场景,可以用时间来换空间。

空间换时间

比如 mysql 对于千万以上的数据量响应的速度很慢,我们这时就可以考虑用分库分表的方法把 mysql 单库单表的数据切分为多库多表的数据。

数据通过某个字段 Hash 值或者其他方式分拆,系统查询数据时,会根据条件的 Hash 值判断找到对应的表,因为表数据量减小了,查询性能也就提升了。

参数调优

JVM、Web 容器以及操作系统的优化也是非常重要的。

根据自己的业务场景,合理地设置 JVM 的内存空间以及垃圾回收算法可以提升系统性能。

例如,如果我们业务中会创建大量的大对象,我们可以通过设置,将这些大对象直接放进老年代。这样可以减少年轻代频繁发生小的垃圾回收(Minor GC),减少 CPU 占用时间,提升系统性能。

Web容器线程池的设置以及Linux 操作系统的内核参数设置不合理也有可能导致系统性能瓶颈。

兜底策略

当上面所有的策略都做了,我们仍然需要兜底策略来防范外部请求的变化造成的不稳定因素。

  • 限流:以性能测试中 TPS 的结果为参考,设置系统的最大访问限制。
  • 智能化横向扩容:智能化横向扩容可以保证当访问量超过某一个阈值时,系统可以根据需求自动横向新增服务。
  • 提前扩容:这种方法通常应用于高并发系统,例如,瞬时抢购业务系统。这是因为横向扩容无法满足大量发生在瞬间的请求,即使成功了,抢购也结束了。目前很多公司使用 Docker 容器来部署应用服务。这是因为 Docker 容器是使用。Kubernetes 作为容器管理系统,而 Kubernetes 可以实现智能化横向扩容和提前扩容Docker 服务。

总结

 

来源:云海天教程 

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

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

相关文章

CRC的手算过程——MODBUS

软件计算结果: 原理参考下面的文章: https://www.cnblogs.com/esestt/archive/2007/08/09/848856.html https://blog.csdn.net/weixin_44256803/article/details/105805628 https://blog.csdn.net/d_leo/article/details/73572373 手算过程如下&#x…

LeetCode面试150——122买卖股票的最佳时机II

题目难度:中等 默认优化目标:最小化平均时间复杂度。 Python默认为Python3。 目录 1 题目描述 2 题目解析 3 算法原理及题目解析 3.1 动态规划 3.2 贪心算法 参考文献 1 题目描述 给你一个整数数组 prices ,其中 prices[i] 表示某支…

如何做OLED屏幕安装方案

制定OLED屏幕安装方案时,需要综合考虑多个方面,包括安装环境、屏幕尺寸、支架选择、电源与信号连接、调试与测试等。以下是一个详细的OLED屏幕安装方案: 一、前期准备 确定安装位置: 根据使用需求和环境条件,选择一个…

装修新选择:探索浦东地区口碑排名前五的大平层装修公司!

在繁华的浦东中寻找一个安静的港湾,大平层无疑是许多成功人士的首选。宽敞的空间、自由的布局设计,以及优雅的生活氛围,都是大平层备受青睐的理由。以下为您探索的浦东地区口碑排名前五的大平层装修公司: 1.即住空间装饰 即住空…

MoE:混合专家模型介绍(一)

MoE:混合专家模型介绍(一) 本文是对混合专家模型 (MoE) 详解重点摘要与归纳,有兴趣的小伙伴可以点击链接阅读原文。 混合专家模型 (MoEs)特点 与稠密模型相比,预训练速度更快与具有相同参数数量的模型相比&#xff…

与OpenAI合作:期待已久的苹果AI战略

探讨 Apple 和 OpenAI 合作的AI战略 ©作者|CodeDan 来源|神州问学 一.引言 在当今科技发展日新月异的背景下,大型科技公司的合作与联盟日益成为关注焦点。在最近的2024苹果全球开发者大会上,苹果展示了最新苹果系统上搭载的大模型应用…

Godot入门 05收集物品

创建新场景,添加Area2D节点,AnimatedSprite2D节点 ,CollisionShape2D节点 添加硬币 按F键居中,放大视图。设置动画速度设为10FPS,加载后自动播放,动画循环 碰撞形状设为圆形,修改Area2D节点为Co…

Vue3父子组件传属性和方法调用Demo

Vue3父子组件传属性和方法调用Demo 说明目录父组件给子组件传值和方法父组件给子组件传值-使用defineProps接受父组件属性值父组件给子组件传值-使用defineModel接受父组件v-model值当子组件只需要接收父组件一个v-model值时,写法1如下:子组件接收单个v-model写法2如下:当子组件…

海尔智家三翼鸟:从家电到场景,能否跨越智能化陷阱?

在智能家居浪潮的席卷之下,三翼鸟作为海尔智家旗下的场景品牌,曾一度被视为传统家电厂商转型升级的典范。然而,在光鲜亮丽的宣传背后,三翼鸟正逐步暴露出难以忽视的困境与挑战,其智能化之路似乎并不如预期般顺畅。 从用…

微软:云服务大规模宕机因DDoS“防卫过当”

杀毒软件导致全球蓝屏,DDoS防护导致云服务宕机,微软这家全球最大的网络安全公司,正在不断刷新人们对“安全威胁”的认知。 微软本周三晚间宣布,本周二全球范围内多个Microsoft 365和Azure云服务大规模长时间宕机事件的原因&#…

AI大模型应用(2)ChatGLM3本地部署及其在alpaca_zh数据集上的低精度微调

AI大模型应用(2)ChatGLM3部署及其在alpaca_zh数据集上的低精度微调 我们之前已经了解了HuggingFace中peft库的几种高效微调方法。 参数高效微调PEFT(一)快速入门BitFit、Prompt Tuning、Prefix Tuning 参数高效微调PEFT(二)快速入门P-Tuning、P-Tuning V2 参数高效微调PEFT…

deepseek杀疯了,偷摸开源全球一梯队大模型——DeepSeek-V2-Chat-0628

就在今年6月,深度求索团队发布了DeepSeek-V2模型后不久,新版本DeepSeek-V2-Chat-0628 模型也在7月开源了。其推理能力有了极大提升。尤其在数学解题、逻辑推理、编程、指令跟随、Json格式输出不同维度上,最高有16%的性能提升。 在Arena-Hard…

推荐一款前端滑动验证码插件(Vue、uniapp)

uniapp版本&#xff1a;滑块拼图验证码&#xff0c;有后端&#xff0c;简单几步即可实现&#xff0c;小程序、h5都可以用 - DCloud 插件市场 Vue版本及cdn版本可以查阅文档&#xff1a; 行为验证 | Poster 文档 示例代码&#xff1a; <template><view id"app&…

YesPlayMusic本地服务器部署并实现远程在线访问听歌

文章目录 前言1. 安装Docker2. 本地安装部署YesPlayMusic3. 安装cpolar内网穿透4. 固定YesPlayMusic公网地址 前言 本文主要介绍如何在本地快速搭建YesPlayMusic云音乐播放器&#xff0c;并且结合cpolar内网穿透工具实现随时随地远程访问局域网内的音乐播放器听歌。 YesPlayM…

保研408真题练习:2009年全国硕士研究生入学统一考试(单选篇2)

&#x1f9ca;&#x1f9ca;&#x1f9ca;单项选择题&#xff08;共40道&#xff09; &#x1f9ca;操作系统&#xff08;8道&#xff09; &#x1f965;1.进程调度算法 高响应比优先调度&#xff1a;选出响应比最高的进程投入执行&#xff0c;响应比R(等待时间&#xff0b;执…

排序算法:归并排序,golang实现

目录 前言 归并排序 代码示例 1. 算法包 2. 归并排序代码 3. 模拟程序 4. 运行程序 5. 从大到小排序 归并排序主要操作 1. 合并 2. 分割&#xff08;Divide&#xff09;与递归排序&#xff08;Conquer&#xff09; 总体思想 循环次数测试 假如 10 条数据进行排序…

10、billu-b0x2

难度 中 目标 root权限 首先确定靶机ip地址 netdiscover -i eth0 -r 192.168.189.0/24 kali 192.168.189.58 靶机 192.168.189.184 信息收集端口扫描 看到一个80和8080&#xff0c;先重点摸一下网站的内容 然后看到信息里有个robots.txt 首先就去访问一下 看到有许多不允许…

【C语言】数组和函数实践:扫雷游戏

扫雷游戏 1. 扫雷游戏分析和设计1.1 扫雷游戏的功能说明1.2 游戏的分析和设计1.2.1 数据结构的分析1.2.2 ⽂件结构设计 2. 扫雷游戏的代码实现&#xff08;1&#xff09;菜单menu函数&#xff08;2&#xff09;设计main函数&#xff08;3&#xff09;设计game函数&#xff08;4…

华为od机试真题:求幸存数之和(Python)

2024华为OD机试&#xff08;C卷D卷&#xff09;最新题库【超值优惠】Java/Python/C合集 题目描述 给一个正整数列nums&#xff0c;一个跳数jump&#xff0c;及幸存数量left。运算过程为:从索引为0的位置开始向后跳&#xff0c;中间跳过 J 个数字&#xff0c;命中索引为 J1的数…

腾讯云短信服务的开通流程

目录 一、开通服务二、创建secretId和secretKey三、创建应用四、创建实名资质五、创建签名六、创建正文模板一、开通服务 从控制台进入短信模块,点击【开始接入】开通服务: 认证主体首次开通短信服务可获赠国内短信,免费试用: 二、创建secretId和secretKey 创建链接:…