开篇词讲怎样才能做好性能调优
你好,我是刘超,⽬前在⾦⼭⻄⼭居担任技术经理,很⾼兴通过这个专栏,跟你⼀起讨论 Java 性能调优这个话题。
先给你讲个故事吧。多年前我加⼊了⼀家⼤型互联⽹公司,刚进⼊就以 996 标准,参与新品研发。公司业务发展急需互联⽹产品,因此我们的时间很紧张,4 个⽉新产品就上线了。
开始还算顺利,但不久后的⼀天晚上,系统突然就瘫痪了,重启之后,问题仍然⽆规律地重现。当时运维同事⻢上写了⼀个重启脚本,定时排队重启各个服务,但也只能做到“治标不治本”。
作为主⼒开发,我和公司的系统架构师⼀起排查问题。架构师轻⻋熟路地通过各种 Linux 命令在线上环境查看性能指标,也
dump 出⽇志⽂件,⾛查代码,最后定位到了问题,后⾯就是分析原因、制定解决⽅案、更新版本等⼀系列操作。那是我第⼀次深刻感受到性能调优的重要性。
后来的⼏年⾥,我⼜陆续参与过物流、电商、游戏⽀付系统的研发,这些项⽬都存在⼀个共性,就是经常会运营⼀些⼤促以及抢购类活动。活动期间,系统不仅要保证处理请求业务的严谨性,还要历经短时间内⾼并发的考验。我也⼀直处于性能调优的
⼀线。
正所谓“实践出真知“。这些年在⽣产环境中遇到的事故不少,很多坑⼀点点踩平,就⾛出了⼀条路,这个过程中我收获了很多实打实的经验,希望能分享给更多的⼈,我们⼀起学习、交流和探讨。
关于性能调优,我先来说说的我的感受。Java 性能调优不像是学⼀⻔编程语⾔,⽆法通过直线式的思维来掌握和应⽤,它对于⼯程师的技术⼴度和深度都有着较⾼的要求。
互联⽹时代,⼀个简单的系统就囊括了应⽤程序、数据库、容器、操作系统、⽹络等技术,线上⼀旦出现性能问题,就可能要你协调多⽅⾯组件去进⾏优化,这就是技术⼴度;⽽很多性能问题呢,⼜隐藏得很深,可能因为⼀个⼩⼩的代码,也可能因为线程池的类型选择错误…可归根结底考验的还是我们对这项技术的了解程度,这就是技术深度。
显然,性能调优不是⼀件容易的事。但有没有什么⽅法能把这件事情做好呢?接下来跟你分享⼏点我的⼼得。
1.扎实的计算机基础
我们调优的对象不是单⼀的应⽤服务,⽽是错综复杂的系统。应⽤服务的性能可能与操作系统、⽹络、数据库等组件相关,所以我们需要储备计算机组成原理、操作系统、⽹络协议以及数据库等基础知识。具体的性能问题往往还与传输、计算、存储数据等相关,那我们还需要储备数据结构、算法以及数学等基础知识。
2.习惯透过源码了解技术本质
我身边有很多好学的同学,他们经常和我分享在⼀些技术论坛或者公众号上学到的技术。这个⽅式很好,因为论坛上边的⼤部分内容,都是⽣产者⾃⼰吸收消化后总结的知识点,能帮助我们快速获取、快速理解。但是只做到这个程度还不够,因为你缺失了⾃⼰的判断。怎么办呢?我们需要深⼊源码,通过分析来学习、总结⼀项技术的实现原理和优缺点,这样我们就能更客观地去学习⼀项技术,还能透过源码来学习⽜⼈的思维⽅式,收获更好的编码实现⽅式。
3.善于追问和总结
很多同学在使⽤⼀项技术时,只是因为这项技术好⽤就⽤了,从来不问⾃⼰:为什么这项技术可以提升系统性能?对⽐其他技术它好在哪⼉?实现的原理⼜是什么呢?事实上,“知其然且知所以然”才是我们积累经验的关键。知道了⼀项技术背后的实现原理,我们才能在遇到性能问题时,做到触类旁通。
综合这三点⼼得,我也就想清楚了该怎么交付这个专栏。
在这个专栏⾥,我将从实战出发,精选⾼频性能问题,透过 Java 底层源码,提炼出优化思路和它背后的实现原理,最后形成
⼀套“学完就能⽤的调优⽅法论”。这也是很多⼀线⼤⼚对于⾼级⼯程师的要求,希望通过这个专栏帮助你快速进阶。
那这个专栏具体是怎么设计的呢?结合 Java 应⽤开发的知识点,我将内容分为七⼤模块,从上到下依次详解 Java 应⽤服务的每⼀层优化实战。
模块⼀,概述。为你建⽴两个标准。⼀个是性能调优标准,告诉你可以通过哪些参数去衡量系统性能;另⼀个是调优过程标准,带你了解通过哪些严格的调优策略,我们可以排查性能问题,从⽽解决问题。
模块⼆,Java 编程性能调优。JDK 是 Java 语⾔的基础库,熟悉 JDK 中各个包中的⼯具类,可以帮助你编写出⾼性能代码。这⾥我会从基础的数据类型讲起,涉及容器在实际应⽤场景中的调优,还有现在互联⽹系统架构中⽐较重要的⽹络通信调优。
模块三,多线程性能调优。⽬前⼤部分服务器都是多核处理器,多线程编程的应⽤⼴泛。为了保证线程的安全性,通常会⽤到同步锁,这会为系统埋下很多隐患;除此之外,还有多线程⾼并发带来的性能问题,这些都会在这个模块重点讲解。
模块四,JVM 性能监测及调优。Java 应⽤程序是运⾏在 JVM 之上的,对 JVM 进⾏调优可以提升系统性能。这⾥重点讲解
Java 对象的创建和回收、内存分配等。
模块五,设计模式调优。在架构设计中,我们经常会⽤到⼀些设计模式来优化架构设计。这⾥我将结合⼀些复杂的应⽤场景, 分享设计优化案例。
模块六,数据库性能调优。数据库最容易成为整个系统的性能瓶颈,这⾥我会重点解析⼀些数据库的常⽤调优⽅法。
模块七,实战演练场。以上六个模块的内容,都是基于某个点的调优,现在是时候把你前⾯所学都调动起来了,这⾥我将带你进⼊综合性能问题⾼频出现的应⽤场景,学习整体调优⽅法。
纵观整个专栏,以点带⾯,⽬的就是交付给你⼀套“学完就⽤的调优⽅法论”,让你在遇到性能问题时,能够调动所学,触类旁通,技术⽔平更上⼀层楼。
“纸上得来终觉浅,绝知此事要躬⾏”。这个专栏从实战中来,也希望你能应⽤到实战中去,最终在学习的基础上,融会贯通,
补充完善,形成属于你⾃⼰的⼀套调优⽅法论。
今天的内容就到这⾥,期待在下⼀讲,和你共同开启⼀段新的旅程。你可以在留⾔区做个简单的⾃我介绍,聊聊你⽬前的⼯作、学习情况,以及在 Java 性能调优上的痛点,我们认识⼀下,也⽅便我后续有针对性地为你讲解。
最后,感谢你的信任,我定会全⼒以赴,和你⼀起实现完美交付。
精选留⾔ <br />![](https://cdn.nlark.com/yuque/0/2022/png/1852637/1646315579019-df3ee1e6-835b-4223-854c-63b746a00d59.png#)业余草<br />定位痛点,难定位,其实是不会定位,难重现。分析问题,不会分析,不知道怎么分析,不知道各数据代表什么等。解决问题<br />,解决这个问题,可能引出另外⼀个问题等。<br />2019-05-20 18:21<br />作者回复<br />期待同学能在专栏中找到这些问题的答案~<br />2019-05-20 19:13
luciferin
跟着⼤佬有⾁吃
2019-05-20 18:18
年年
学完这个再等着波姐的翻译的《Java性能优化实践》出版,到时候两相印证美滋滋
2019-05-20 18:12
Jimmy(陈基明)®
挺好的,期待
2019-05-20 17:56
⾔凡
⽼师你好,我的项⽬上⽤户量少,对性能要求也不⾼,很难遇到性能调优的⼤场⾯。缺少实践的话,通过学习也不会有很深的感触。在这种情况下应该如何提⾼⾃⼰的性能调优能⼒呢?
2019-05-20 23:30
作者回复
⾔凡你好,你提的这个问题⾮常好,我相信很多童鞋都有跟你⼀样的问题。
具体的性能调优能⼒确实需要⼀些实战历练,但在具体的后⾯,是我们平时积累的⼤量基础知识。所以说,⾸先要保证练好扎实的基础功,到了真实战场,这些基础能帮上你的⼤忙。很多⼤公司⾯试的时候,对中⾼级开发⾸先要求的也是基础。
实战经验虽然是我们的短板,但平时我们也可以在很多源码上学习⼀些调优经验,例如锁的优化的⽅式,减⼩锁粒度是优化锁常⽤的⽅式,我们可以学习和借鉴使⽤,像这样的优化案例有很多。也可以通过⼀些渠道学习⼤公司的优化⽅案以及⼤神的分享优化⽅案,强调的是学习⼀种思维⽅式,不⼀定能在实际项⽬中应⽤到,但是我们能在遇到问题的时候想到优化⽅案。
还有就是通过动⼿来实践,提⾼⾃⼰的实践能⼒。
2019-05-21 10:11
⼃北纬91度灬
⽼师您好,我是做Android开发的,Java后台服务开发只是最近项⽬接触到⼀些,⽤的是Springboot,springcloud,对于性能调优这块,⾸先我们的项⽬⽤户量很少,针对⼀些⼚家定制项⽬,⽤户量⼩到出了问题可以停下来让你解决的地步,⽽且我也是刚接触后端这块,本身后端的很多开发知识要学,现在看到这个感觉很有⽤,也⼀边学开发⼀边学调优吧,也许能从摇篮中扼杀bug,对于我这种情况,⽼师您在学习的过程中有什么建议吗?
2019-05-22 01:01
作者回复
我总结下我过往的经历,我觉得打好基础功底,多动⼿实践是最重要的,其他的没有特别的建议。希望能帮助到你。
2019-06-03 22:00
何何何何何少侠
希望⽼师后⾯的课程能够更多的注重于实际业务场景⽽不只是理论
2019-05-20 23:48
作者回复
少侠你好,本次专栏第⼀个模块主要是给⼤家熟悉性能调优的⼀些指标和策略,后⾯的模块中,每⼀讲都是通过实际场景来讲解具体的调优。
2019-05-21 13:09
猫头鹰爱拿铁
对性能调优所说的要扎实的计算机基础实在是太认同了。之前也做过类似的事,不过涉及的不复杂,是个单体应⽤,在开始性能调优的时候⾸先要对应⽤的性能进⾏监控获知瓶颈在哪,这就涉及到磁盘、⽹络、内存、cpu以及数据库不仅仅是jvm这块。然后再从这些数据⾥⾯抽丝剥茧等去找问题。
2019-05-20 18:41
作者回复
英雄所⻅略同~
2019-05-20 19:10
linqw
买了很久今天才开始看,最近⾃⼰也在分析java并发包的源码https://juejin.im/user/5bd8718051882528382d8728/posts,⽼师 有空帮忙看下哦,感觉学技术得⾃⼰多看源码,才能知道如何正确的使⽤,才能在特定的业务中采⽤对应的技术,不然很多东
⻄只是看别⼈的总结,很多都很难深⼊,⽐如为什么要使⽤这项技术,才能做到⼼中有底。不管是学技术,还是其他,感觉先从宏观进⾏理解,再每个点进⾏突破,看源码,从今天开始跟着刘超⽼师学习调优的正确⽅式
2019-07-09 21:07
SlamDunk
做业务开发,经历过的性能优化最蛋疼的两种:1.压⼒测试过程中发现内存泄露。2.业务代码质量差稍显混乱,服务响应时间太
⻓,优化时还要⼩⼼翼翼保持原业务逻辑。
2019-06-07 21:48
李⻘
⾸先,感谢⽼师的分享,使我受益匪浅。
其实我在这想回答@业余草童靴在留⾔中的困惑个⼈认为性能调优分为以下步骤:
1.⽬前现象——》2.提出猜想———》3.验证猜想———-》4.定位到问题———-》5.解决问题
分析问题难其实就对应的是第2步骤,说⽩了就是你提不猜想,为什么你提出猜想,那是因为你的知识⾯不⼴,基础知识不牢
固。知识⾯不够,就导致针对现象,提不出问题。
定位问题难对应第4步骤,这个的问题就是不会使⽤⼯具,我们在佐证我们的猜想时需要⼀些辅助⼯具。不会使⽤⼯具,就导致不能佐证猜想。
2019-05-31 14:37
作者回复
阐述的很好,点赞!
2019-05-31 20:38
胖妞
平常开发的时候压根就没有进⾏过系统调优,平常开发只要没bug就感觉完事,可是,这样的开发总感觉停留在表象!⽽且,
⽇常开发也基本没有⽤过jdk⾃带的⼯具进⾏bug处理,linux系统下开发部署,只要满⾜不报错就⾏!遇到服务器报broken pipe
都不知道咋处理!希望这个课程能给我⼀些收获!
2019-05-22 14:27
建国
⽼师好,我是跨专业到码农,已经从事JAVA开发两年半,我们公司是做培训的系统,客户⼤规模使⽤前都会报备,平时不需要多少的并发量,需要的时候做系统升级,每次做升级都需要压⼒测试,但是现在服务器的内存达到了瓶颈,就是刚重启完系统基本都是70%,运⾏⼏天之后基本都是85%,所以每周都晚上重启两次(遇到上线就不需要了),所以很难受,希望能学到点内存优化的⽅案策略,期待期待
2019-05-22 09:08
作者回复
你好 建国,看来咱们的服务存在性能问题呀,希望这个专栏能帮助你快速上⼿性能问题分析和调优。
2019-05-22 12:37
liu
⼀个亟须扎实根底的专栏
2019-05-21 22:29
不靠谱~
每次遇到性能调优就不知所措了,希望能跟随⽼师⼊⻔。
2019-05-21 18:44
作者回复
加油!
2019-05-21 22:33
jack
性能调优涉及到对技术掌握的⼴度与深度。学习⼤佬的经验与⽅法,加油^0^~!
2019-05-20 21:03
男朋友
之前看了郑⾬迪⼤佬的jvm拆解分享,有点晦涩⽣硬,这不来看这边的调优
2019-06-28 17:36
null
看到⽼师这么认真负责地回复每条评论,我就知道,我⼜加⼊了⼀⻔超值的课程!
2019-06-20 19:59
ātma-grāha(harry)
公司是做电商的,⽤户量⼤概是百万级别的,我是刚毕业的主要接触的是逻辑代码,怎么才能继续提升⾃⼰?
2019-06-19 22:28
NARUTO
期待
2019-06-08 20:32