Java调优遇到的姿势【非原创】

13 篇文章 0 订阅

Java调优

本文简单说一说JVM应如何调优。引用【廖雪峰 / 编程 / 2020/3/12 12:39 】

Java语言本身的成功,除了天时地利人和,JVM功不可没。

毫不夸张地说,JVM是现代软件工程最成功的案例之一。它规模庞大,代码极其复杂,但运行极其稳定可靠,所以,许多厂商的核心业务系统,才敢放心地用Java编写,运行在JVM之上。

因为JVM自带GC,又有无数可以微调的参数,所以,JVM调优,现在已经被当作Java面试的必考知识点,精通JVM调优参数的童鞋,可以冠名微操小王子。

写了这么多年的Java程序,很遗憾,我迄今为止只会用两个参数:XMS和XMX,能正确写出如下启动脚本:

java -Xms1g -Xmx2g -jar abc.jar

如果-server也算的话,一共会三,估计面试通过的概率不大。

我承认我对JVM调优几乎一无所知,原因在于,还没有遇到过性能问题必须通过JVM调优才能解决。

我发现喜欢研究JVM调优的两类人:

准备面试的;

自己写的烂代码想甩锅给JVM的。

绝大多数情况下,如果程序出现了性能问题,比如TPS上不去,内存撑爆了,最好自己冷静一下,先监控一下自己程序的日志和性能数据,如果这两个都没有,就一口咬定JVM有问题,有问题的很可能不是JVM,而是态度。

这并不是说JVM不会出问题,或者说JVM就肯定没有bug,而是说,软件领域,bug能不能尽可能地被发现然后修复,很大程度上取决于用的人是否足够多。这个世界上用JVM的人多还是用自己写的程序的人多?很明显,能被某个人发现的JVM的bug可能性很低,尤其是公司线上运行的JVM并不会追求最新版本。

那么JVM正确的调优方式是啥?我个人推荐四步走:

记录好日志;
对程序做好性能监控;
根据日志和性能监控数据修改程序;
使用专业工具通过不同的JVM参数进行压测并获得最佳配置。
根据我的个人经验,走完前三步,就可以高质量交付并下班回家了,第四步那是在有摸鱼时间的情况下才做。

这么多年我一共遇到过两次因为JVM参数引发的问题:

一次是某公司的超大型Java程序,导致PermGen OutOfMemoryError,那是JDK 1.6平台,原因很简单,编写的Java类数量太多了,撑爆了默认的128M的PermGen。解决方法也很简单,改成更大的512M(参数叫啥已经忘了,因为新版JVM没有PermGen限制了)。但是根本问题不是出在JVM,而是代码太垃圾,Java类的数量超多造成的。

另一次是因为TPS超高引起内存不足崩溃,但实际上内存有32G非常大,分配给JVM有30G,不可能用完。现实情况是EC2直接被干掉连日志都看不到了。如果手动把TPS降下来(每次sleep 1ms),就能以一定概率成功启动。后咨询AWS技术支持发现,原来是Kafka这货为了提高速度,用了大量的堆外内存结果在高TPS下爆了。解决方法也很简单,把JVM内存限制在系统内存的一半,给操作系统留出足够的内存。这次根本问题是代码性能太高但错误地设定了XMS和XMX造成的。

所以,绝大部分情况下,并不需要特意去调优JVM,因为那是最后一步的优化手段。即使真的需要,到时候再研究也不迟,因为时间是宝贵的,在解决自己程序的性能问题之前,不必在意JVM的性能。

引用自--------------https://www.liaoxuefeng.com/article/1336345083510818

系统吞吐量(TPS)、用户并发量、性能测试概念和公式

【引用非原创】
发表于: Linux, 个人日记 | 作者: 博客教主
标签: TPS,公式,吞吐量,并发量,性能测试,概念
如果你想加载一篇你写过的.md文件,在上方工具栏可以选择导入功能进行对应扩展名的文件导入,
继续你的创作。

PS:下面是性能测试的主要概念和计算公式,记录下:

一.系统吞度量要素:

一个系统的吞度量(承压能力)与request对CPU的消耗、外部接口、IO等等紧密关联。

单个reqeust 对CPU消耗越高,外部系统接口、IO影响速度越慢,系统吞吐能力越低,反之越高。

系统吞吐量几个重要参数:QPS(TPS)、并发数、响应时间

QPS(TPS):每秒钟request/事务 数量

并发数: 系统同时处理的request/事务数

响应时间: 一般取平均响应时间

(很多人经常会把并发数和TPS理解混淆)

理解了上面三个要素的意义之后,就能推算出它们之间的关系:
在这里插入图片描述

QPS(TPS)= 并发数/平均响应时间

一个系统吞吐量通常由QPS(TPS)、并发数两个因素决定,每套系统这两个值都有一个相对极限值,在应用场景访问压力下,只要某一项达到系统最高值,系统的吞吐量就上不去了,如果压力继续增大,系统的吞吐量反而会下降,原因是系统超负荷工作,上下文切换、内存等等其它消耗导致系统性能下降。

决定系统响应时间要素

我们做项目要排计划,可以多人同时并发做多项任务,也可以一个人或者多个人串行工作,始终会有一条关键路径,这条路径就是项目的工期。

系统一次调用的响应时间跟项目计划一样,也有一条关键路径,这个关键路径是就是系统影响时间;

关键路径是有CPU运算、IO、外部系统响应等等组成。

二.系统吞吐量评估:

我们在做系统设计的时候就需要考虑CPU运算、IO、外部系统响应因素造成的影响以及对系统性能的初步预估。

而通常境况下,我们面对需求,我们评估出来的出来QPS、并发数之外,还有另外一个维度:日PV。

通过观察系统的访问日志发现,在用户量很大的情况下,各个时间周期内的同一时间段的访问流量几乎一样。比如工作日的每天早上。只要能拿到日流量图和QPS我们就可以推算日流量。

通常的技术方法:

  1. 找出系统的最高TPS和日PV,这两个要素有相对比较稳定的关系(除了放假、季节性因素影响之外)

  2. 通过压力测试或者经验预估,得出最高TPS,然后跟进1的关系,计算出系统最高的日吞吐量。B2B中文和淘宝面对的客户群不一样,这两个客户群的网络行为不应用,他们之间的TPS和PV关系比例也不一样。

A)淘宝

淘宝流量图:

系统吞吐量评估方法

淘宝的TPS和PV之间的关系通常为 最高TPS:PV大约为 1 : 11*3600 (相当于按最高TPS访问11个小时,这个是商品详情的场景,不同的应用场景会有一些不同)

B) B2B中文站

B2B的TPS和PV之间的关系不同的系统不同的应用场景比例变化比较大,粗略估计在1 : 8个小时左右的关系(09年对offerdetail的流量分析数据)。旺铺和offerdetail这两个比例相差很大,可能是因为爬虫暂的比例较高的原因导致。

在淘宝环境下,假设我们压力测试出的TPS为100,那么这个系统的日吞吐量=100113600=396万

这个是在简单(单一url)的情况下,有些页面,一个页面有多个request,系统的实际吞吐量还要小。

无论有无思考时间(T_think),测试所得的TPS值和并发虚拟用户数(U_concurrent)、Loadrunner读取的交易响应时间(T_response)之间有以下关系(稳定运行情况下):
TPS=U_concurrent / (T_response+T_think)。

并发数、QPS、平均响应时间三者之间关系

系统吞吐量评估方法

来源:http://www.cnblogs.com/jackei/

软件性能测试的基本概念和计算公式
一、软件性能的关注点

对一个软件做性能测试时需要关注那些性能呢?

我们想想在软件设计、部署、使用、维护中一共有哪些角色的参与,然后再考虑这些角色各自关注的性能点是什么,作为一个软件性能测试工程师,我们又该关注什么?

首先,开发软件的目的是为了让用户使用,我们先站在用户的角度分析一下,用户需要关注哪些性能。

对于用户来说,当点击一个按钮、链接或发出一条指令开始,到系统把结果已用户感知的形式展现出来为止,这个过程所消耗的时间是用户对这个软件性能的直观印象。也就是我们所说的响应时间,当相应时间较小时,用户体验是很好的,当然用户体验的响应时间包括个人主观因素和客观响应时间,在设计软件时,我们就需要考虑到如何更好地结合这两部分达到用户最佳的体验。如:用户在大数据量查询时,我们可以将先提取出来的数据展示给用户,在用户看的过程中继续进行数据检索,这时用户并不知道我们后台在做什么。

用户关注的是用户操作的相应时间。

其次,我们站在管理员的角度考虑需要关注的性能点。

1、 相应时间
2、 服务器资源使用情况是否合理
3、 应用服务器和数据库资源使用是否合理
4、 系统能否实现扩展
5、 系统最多支持多少用户访问、系统最大业务处理量是多少
6、 系统性能可能存在的瓶颈在哪里
7、 更换那些设备可以提高性能
8、 系统能否支持7×24小时的业务访问

再次,站在开发(设计)人员角度去考虑。

1、 架构设计是否合理
2、 数据库设计是否合理
3、 代码是否存在性能方面的问题
4、 系统中是否有不合理的内存使用方式
5、 系统中是否存在不合理的线程同步方式
6、 系统中是否存在不合理的资源竞争

那么站在性能测试工程师的角度,我们要关注什么呢?

一句话,我们要关注以上所有的性能点。

二、软件性能的几个主要术语

1、响应时间:对请求作出响应所需要的时间

网络传输时间:N1+N2+N3+N4

应用服务器处理时间:A1+A3

数据库服务器处理时间:A2

响应时间=N1+N2+N3+N4+A1+A3+A2

2、并发用户数的计算公式

系统用户数:系统额定的用户数量,如一个OA系统,可能使用该系统的用户总数是5000个,那么这个数量,就是系统用户数。

同时在线用户数:在一定的时间范围内,最大的同时在线用户数量。
同时在线用户数=每秒请求数RPS(吞吐量)+并发连接数+平均用户思考时间

平均并发用户数的计算:C=nL / T

其中C是平均的并发用户数,n是平均每天访问用户数(login session),L是一天内用户从登录到退出的平均时间(login session的平均时间),T是考察时间长度(一天内多长时间有用户使用系统)

并发用户数峰值计算:C^约等于C + 3*根号C

其中C^是并发用户峰值,C是平均并发用户数,该公式遵循泊松分布理论。

3、吞吐量的计算公式

指单位时间内系统处理用户的请求数

从业务角度看,吞吐量可以用:请求数/秒、页面数/秒、人数/天或处理业务数/小时等单位来衡量

从网络角度看,吞吐量可以用:字节/秒来衡量

对于交互式应用来说,吞吐量指标反映的是服务器承受的压力,他能够说明系统的负载能力

以不同方式表达的吞吐量可以说明不同层次的问题,例如,以字节数/秒方式可以表示数要受网络基础设施、服务器架构、应用服务器制约等方面的瓶颈;已请求数/秒的方式表示主要是受应用服务器和应用代码的制约体现出的瓶颈。

当没有遇到性能瓶颈的时候,吞吐量与虚拟用户数之间存在一定的联系,可以采用以下公式计算:F=VU * R /

其中F为吞吐量,VU表示虚拟用户个数,R表示每个虚拟用户发出的请求数,T表示性能测试所用的时间

4、性能计数器

是描述服务器或操作系统性能的一些数据指标,如使用内存数、进程时间,在性能测试中发挥着“监控和分析”的作用,尤其是在分析统统可扩展性、进行新能瓶颈定位时有着非常关键的作用。

资源利用率:指系统各种资源的使用情况,如cpu占用率为68%,内存占用率为55%,一般使用“资源实际使用/总的资源可用量”形成资源利用率。

5、思考时间的计算公式

Think Time,从业务角度来看,这个时间指用户进行操作时每个请求之间的时间间隔,而在做新能测试时,为了模拟这样的时间间隔,引入了思考时间这个概念,来更加真实的模拟用户的操作。

在吞吐量这个公式中F=VU * R / T说明吞吐量F是VU数量、每个用户发出的请求数R和时间T的函数,而其中的R又可以用时间T和用户思考时间TS来计算:R = T / TS

下面给出一个计算思考时间的一般步骤:

A、首先计算出系统的并发用户数

C=nL / T F=R×C

B、统计出系统平均的吞吐量

F=VU * R / T R×C = VU * R / T

C、统计出平均每个用户发出的请求数量

R=uCT/VU

D、根据公式计算出思考时间

TS=T/R

【引用自】----------------------http://www.ha97.com/5095.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于Java调优的常见面试题,以下是一些问题和答案: 问题1: 什么是Java调优?为什么需要进行Java调优? 答案: Java调优是指通过各种技术手段来提高Java程序的性能和效率。Java调优的目的是优化程序的资源利用,减少响应时间,提高并发能力。调优可以帮助我们发现和解决性能问题,提升应用程序的稳定性和用户体验。 问题2: 请列举一些常见的Java调优技术? 答案: 常见的Java调优技术包括: - JVM参数调优:通过调整JVM的参数,如堆内存大小、垃圾回收器等,来优化内存使用和垃圾回收效率。 - 多线程优化:合理使用线程池、避免使用锁和同步、减少线程上下文切换等,提高并发性能。 - 数据库连接池优化:合理配置数据库连接池的参数,减少数据库连接创建和销毁的开销。 - 缓存优化:使用缓存技术,如Redis、Memcached等,减少对数据库或其他外部资源的访问。 - 算法和数据结构优化:选择合适的算法和数据结构,提高程序的执行效率。 问题3: 如何监控和分析Java应用程序的性能问题? 答案: 监控和分析Java应用程序的性能问题可以使用以下工具: - Java VisualVM:可以监控Java应用程序的内存、线程、GC等情况,进行性能分析和故障排查。 - JConsole:可以监控Java应用程序的资源使用情况,如内存、线程、类加载等。 - JProfiler:一款商业化的Java性能分析工具,提供了丰富的功能和图形化界面。 - 压力测试工具:如Apache JMeter、Gatling等,用于模拟多用户并发访问情况,测试系统的性能瓶颈。 问题4: 如何解决Java应用程序的内存泄漏问题? 答案: 解决Java应用程序的内存泄漏问题可以采取以下措施: - 分析代码:通过代码审查和调试,查找可能引起内存泄漏的代码段。 - 使用内存分析工具:如Eclipse Memory Analyzer、VisualVM等,分析堆内存中的对象引用关系,找出内存泄漏的原因。 - 避免长期持有对象引用:当不再需要某个对象时,要及时将其引用置为null,以便垃圾回收器能够回收内存。 - 使用弱引用或软引用:对于不需要强引用的对象,可以使用弱引用或软引用,当内存不足时会被自动回收。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值