Java 性能调优实战
刘超
前金山软件技术经理
59174 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 49 讲
开篇词 (1讲)
模块一 · 概述 (2讲)
结束语 (1讲)
Java 性能调优实战
15
15
1.0x
00:00/00:00
登录|注册

01 | 如何制定性能调优标准?

除了常见的性能参考指标,是否还能想到其他可以衡量系统性能的指标?
通过自动化性能测试校验迭代发版后的系统性能是否出现异常
完成项目后进行系统测试,将性能指标作为性能调优的标准
在项目开始阶段不必过早介入性能优化,只需保证编码优秀、高效、良好的程序设计
性能调优可使系统稳定、用户体验更佳、节约资源
负载承受能力
计算机资源分配使用率
吞吐量
响应时间
锁竞争
数据库
异常
网络
磁盘I/O
内存
CPU
根据线上实际情况进行日志监控和性能统计日志
在项目编码完成后进行性能测试
在代码层面保证有效编码,充分利用设计模式优化业务代码
初期不必过于在意性能优化,需保证有效编码
性能调优可提高系统性能并节省资源
性能问题可能由时间累积或访问量波动导致
系统未经性能测试就上线可能导致潜在性能问题
思考题
总结
有哪些参考因素可以体现系统的性能?
什么时候开始介入调优?
为什么要做性能调优?
性能调优标准

该思维导图由 AI 生成,仅供参考

你好,我是刘超。
我有一个朋友,有一次他跟我说,他们公司的系统从来没有经过性能调优,功能测试完成后就上线了,线上也没有出现过什么性能问题呀,那为什么很多系统都要去做性能调优呢?
当时我就回答了他一句,如果你们公司做的是 12306 网站,不做系统性能优化就上线,试试看会是什么情况。
如果是你,你会怎么回答呢?今天,我们就从这个话题聊起,希望能跟你一起弄明白这几个问题:我们为什么要做性能调优?什么时候开始做?做性能调优是不是有标准可参考?

为什么要做性能调优?

一款线上产品如果没有经过性能测试,那它就好比是一颗定时炸弹,你不知道它什么时候会出现问题,你也不清楚它能承受的极限在哪儿。
有些性能问题是时间累积慢慢产生的,到了一定时间自然就爆炸了;而更多的性能问题是由访问量的波动导致的,例如,活动或者公司产品用户量上升;当然也有可能是一款产品上线后就半死不活,一直没有大访问量,所以还没有引发这颗定时炸弹。
现在假设你的系统要做一次活动,产品经理或者老板告诉你预计有几十万的用户访问量,询问系统能否承受得住这次活动的压力。如果你不清楚自己系统的性能情况,也只能战战兢兢地回答老板,有可能大概没问题吧。
所以,要不要做性能调优,这个问题其实很好回答。所有的系统在开发完之后,多多少少都会有性能问题,我们首先要做的就是想办法把问题暴露出来,例如进行压力测试、模拟可能的操作场景等等,再通过性能调优去解决这些问题。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入探讨了如何制定Java应用的性能调优标准,强调了性能调优的重要性和实施方法。文章首先指出了没有经过性能测试的产品可能存在潜在问题,因此需要制定性能调优标准。在介入性能调优方面,建议在项目开发初期不过于在意性能优化,而是在代码层面保证有效的编码。接着,文章列举了体现系统性能的参考因素,包括CPU、内存、磁盘I/O、网络、异常、数据库和锁竞争,并介绍了衡量系统性能的重要指标——响应时间。此外,还详细讨论了吞吐量、计算机资源分配使用率和负载承受能力等性能指标。最后,作者分享了在实际项目中对系统性能的要求和如何进行系统性能测试的经验,并提出了思考题,引发读者对其他衡量系统性能的指标的思考。整篇文章通过实例和技术原理深入浅出地解释了性能调优的重要性和实施方法,对于Java应用的性能调优具有一定的指导意义。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Java 性能调优实战》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(77)

  • 最新
  • 精选
  • 杨军
    首先很高兴终于有人开Java性能优化的课程,我在工作中需要接触很多这方面的工作,希望通过学习这次课程能带来更多收获。 然后我想请教老师一个问题,CPU利用率和系统负载这两个指标之间是什么关系?网上很多资料讲的不清不楚,看不明白。

    作者回复: 杨军你好,系统负载代表单位时间内正在运行或等待的进程或线程数,代表了系统的繁忙程度,CPU利用率则代表单位时间内一个线程或进程实时占用CPU的百分比。我们知道,一个进程或者线程在运行时,未必都在实时的利用CPU的。 比如,在CPU密集型的情况下,系统的负载未必会高,但CPU的利用率肯定会高,一个线程/进程一直在计算,它对CPU的实时利用率是100%,而系统负载是0.1; 又比如,而对于I/O密集型的程序来说,有可能CPU的利用率不高,但系统的负载却会非常高,这是因为I/O经常引起阻塞,这样导致很多线程/进程被处于阻塞等待状态,处于等待的线程或进程也是属于负载线程/进程的。 通过以上两个例子,不知道有没有让你分清楚两个指标的区别,有问题保持沟通。

    2019-05-21
    4
    174
  • 遇见阳光
    老师,tps qps这块还是有点不太清楚。

    作者回复: 遇见阳光 你好,TPS(transaction per second)是单位时间内处理事务的数量,QPS(query per second)是单位时间内请求的数量。TPS代表一个事务的处理,可以包含了多次请求。很多公司用QPS作为接口吞吐量的指标,也有很多公司使用TPS作为标准,两者都能表现出系统的吞吐量的大小,TPS的一次事务代表一次用户操作到服务器返回结果,QPS的一次请求代表一个接口的一次请求到服务器返回结果。当一次用户操作只包含一个请求接口时,TPS和QPS没有区别。当用户的一次操作包含了多个服务请求时,这个时候TPS作为这次用户操作的性能指标就更具有代表性了。

    2019-05-21
    2
    80
  • kaixiao7
    老师,关于JVM的异常问题,您在@陆离的回答中说"平时的业务异常避免生成栈追踪信息,在异常中用字符串描述业务异常信息即可",我通过throw new Exception("aaa"),debug时发现还是会调用fillInStackTrace()方法。我是不是理解错了呢?具体该怎么做?感谢

    作者回复: 可以自己实现自定义异常,继承RuntimeException,然后将writableStackTrace设置为false。 以下是RuntimeException的构造函数: protected RuntimeException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { super(message, cause, enableSuppression, writableStackTrace); }

    2019-06-04
    62
  • Maxwell
    请问老师最近段时间遇到端口被CLOSE_WAIT占用,重启后过了半天又重现,以前没有出现过,一般如何排查

    作者回复: 可以通过tcpdump抓包看看连接状态,分析是否是服务端的FIN packet没有发出去。 正常的关闭流程是:服务端在接收到客户端发送的关闭请求FIN后,会进入CLOSE_WAIT状态,同时发送ACK回去。在完成与客户端直接的通信操作之后,再向客户端发送FIN,进入LAST_ACK状态。 如果连接是CLOSE_WAIT状态,而不是LAST_ACK状态,说明还没有发FIN给Client,那么可能是在关闭连接之前还有许多数据要发送或者其他事要做,导致没有发这个FIN packet。 建议确定关闭请求的四次握手,哪个环节出了问题,再去排查业务代码,可能是由于超时或者异常导致没有正常关闭连接。

    2019-06-01
    4
    36
  • 天持
    今天查个问题,发现有台机器cpu使用率,明显比其他机器高了10%左右,其他指标也没发现问题,不懂呀,好好学习

    作者回复: 你好 天持,机器的cpu高是不是我们服务进程导致的呢,可以使用top命令查看各个进程的cpu使用率,如果是我们服务进程导致的,可以再通过系统命令top -H -p 进程ID 查看具体线程的cpu使用率,如果确定某个线程的cpu使用率异常,可以使用jstack系统命令导出系统日志进行分析。这是帮我们确定是不是服务性能问题,不过按照我的经验,10%的高出,比较难排查出具体的问题,线程的cpu使用率不断在变化,我们很难区分到底哪个线程使用cpu异常。 如果确定是我们代码问题,我们也可以使用排除法进行分析,将你怀疑可能产生问题的代码注释掉,一个一个排除,这也是最笨的方法,但有时候找不到问题的时候就很受用。 如果不是代码问题,还有就是服务器的配置问题,不同的服务器配置,系统资源使用率也会不一样。

    2019-05-20
    29
  • QQ怪
    我觉得还有接口返回200的成功率吧

    作者回复: 晚上好 QQ怪,你说的很对。我们平时在使用AB进行压测时,会有一个failed requests指标,本身接口没有异常的情况下,压测出现了异常,也是说明这个接口有性能问题。还有就是percentage of the requests served within a certain time这个指标,这个指标对金融交易系统来说是非常重要的,如果有99%的请求是1ms返回,但有1%是500ms返回,这对于某些对交易时间要求极致的金融系统来说也是性能问题。感谢你的回答,期望我的回答能让你满意!

    2019-05-20
    2
    29
  • 大树
    抛出异常需要构建异常栈,对异常进行捕获和处理,这个过程比较消耗系统的性能,怎么理解?为什么这个过程就消耗性能?消耗什么性能呢?CPU?内存?

    作者回复: 创建异常对象时会调用父类Throwable的fillInStackTrace()方法生成栈追踪信息,也就是调用native的fillInStackTrace()方法去爬取线程堆栈信息,为运行时栈做一份快照,正是这一部分开销很大

    2020-03-25
    28
  • Phoenix
    想请教下老师,使用MySQL经常会遇到业务需要实时导出大量业务数据的需求,那么如何在不影响业务和不分库的的情况满足业务实时导出大量数据的需求呢?

    作者回复: 你好 Phoenix,切忌在主库中操作这种报表类的导出,在写入和查询都在一个主库进行,会造成数据库性能瓶颈,严重的会导致数据库死锁。我们可以将数据库读写分离,写业务走主(写)库,导出数据可以从从(读)库导出。这种实现方式,首先能提高数据导出的性能,其次不影响写业务。 如果你们公司有大数据中心,可以考虑将需要导出的数据实时同步到大数据中心,通过实时的流计算处理生成不同需求的业务数据。 希望以上的回答能让你满意,如果有问题保持沟通!

    2019-05-20
    26
  • 诸葛
    异常:Java 应用中,抛出异常需要构建异常栈,对异常进行捕获和处理,这个过程非常消耗系统性能。如果在高并发的情况下引发异常,持续地进行异常处理,那么系统的性能就会明显地受到影响。 老师好,高并发调用方法之后第一步就是检验一堆入参,如果入参有问题立即抛出异常给前端,不再处理下边的逻辑了,这样有问题吗?我看系统性能还可以啊。压力测试也还行。如果有问题的话那应该怎么做呢,检验错误后给前端放回code码然后返回空对象吗?感谢

    作者回复: 如果没有生成堆栈追踪信息,不会有性能问题。一般业务异常避免生成堆栈追踪信息,我们知道这个异常是什么原因,所以直接返回字符串就好了。而系统异常,一般都会生成堆栈追踪信息,以便追踪源头,更好的排查问题。

    2019-05-26
    22
  • Mr. Huang
    老师您好,请问您提到的那几个响应时间测试,有没有比较好的工具推荐

    作者回复: 你好Mr.Huang,比较常用的压力测试工具有AB,这是一个Linux系统工具,使用起来很简便,还有jmeter工具,可以在Windows环境下运行使用,个人比较习惯使用AB。

    2019-05-21
    13
收起评论
显示
设置
留言
77
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部