Java 程序该怎么优化?(实战篇)
面试官:出现了性能问题,该怎么去排查呢?
程序猿:接口响应那么慢,时间都花到哪里去了?
运维喵:为什么你的应用跑着跑着,CPU 就接近 100%?
分享一些真实生产问题排查故事,看看能否涨姿势,能否 get 到其中之「趣」?
另外,为了方便收藏,文末把 Java 程序优化及问题排查套路,整理成了葵花宝典,一定要记得收藏呦。
1. 业务催的急,心发慌的现场!
2012 年,在一家支付公司做用户域的基础服务,每天做的事儿便是为满足业务需求,制定各种各样的 API。
某天,业务反馈线上调用查询省份地市接口频繁超时 ... ...
生产要敬畏,生产无小事。
于是乎,煎饼果子丢一旁。一边让业务同事提供调用接口时的唯一 ID(rpid,查询日志全靠它),一边找运维同事确认网络有没有问题、服务有没有问题,在排除环境没问题的前提下,快速根据 rpid 获取日志并进行分析。
日志记得好,排查问题没烦恼。发现程序执行到访问数据库拿数据时总会需要花费很长时间,导致业务接口超时。
当时,分析原因有二。
原因一:大部分接口都是读在线库,而该接口读的则是离线库,但是离线库配置的最大连接数是 2,在高并发情况下,拿不到数据库连接;
原因二:省份地市信息为不变信息,程序并没有借助缓存提升性能。
寻得病症,便可对症下药。
2. 服务一启动,运维就疯狂打 Call 的现场。
2016 年,在一家互联网金融公司负责理财网站的从 0 到 1,都知道要想服务做的好,监控模块少不了。
当时时间紧任务重,分工也很明确,有两个兄弟负责监控模块的搭建,测试验证通过后,进行上线,但是只要一启动监控模块,运维同事都反馈机器 CPU 疯狂报警。
生产要敬畏,生产无小事。
于是,带着做监控模块的兄弟开启了排查诊断之旅。
当时的代码没有了,为了更好的还原现场,还是跑一个模拟程序。
首先,采用 top 命令,找出 CPU 占用最高的进程 PID;
然后,通过 ps -ef | grep PID 查看对应的应用,确认一下是不是你的应用,运维喵别给扣错帽子,说啥咱也不能背锅。
接着,采用 jstack -l PID >> PID.log 获取进程的堆栈信息。
然后,采用 ps -mp PID -o THREAD,tid,time 拿到占用 CPU 最高的线程 TID。
接着,采用 printf "%x\n" tid 获取 16 进制的线程 TID。
最后,采用 grep TID -A20 PID.log 确定是线程哪儿出了问题。
找到代码位置,便可对症下药。
另外,你或许会感觉命令繁琐,其实摆脱命令的困扰,采用 VisualVM 图形化性能监控工具,则会有种土枪换炮的感觉,不过生产上一般还是用命令的居多(言外之意:势必要掌握命令)。
3. 经验从哪儿来?
作为一个久经职场的码农,真心的告诉你,经验来源于填坑,遇到的坑越多,经验越丰富,虽然遇到的问题可能变幻莫测,但是解决问题却有章可循。
用心画了一部 Java 程序优化的「葵花宝典」,丑是丑了点,但是真能解决大问题,请放心收藏。
好了,今天的分享接近尾声,以备不时之需,建议你好好收藏,最重要的是去拿去实践。
Java 程序该怎么优化?(实战篇)的更多相关文章
- 小程序Canvas性能优化实战
以下内容转载自totoro的文章<小程序Canvas性能优化实战!> 作者:totoro 链接:https://blog.totoroxiao.com/canvas-perf-mini/ ...
- 手牵手,使用uni-app从零开发一款视频小程序 (系列下 开发实战篇)
系列文章 手牵手,使用uni-app从零开发一款视频小程序 (系列上 准备工作篇) 手牵手,使用uni-app从零开发一款视频小程序 (系列下 开发实战篇) 扫码体验,先睹为快 可以扫描下微信小程序的 ...
- Java 程序该怎么优化?(工具篇)
程序员:为什么程序总是那么慢?时间都花到哪里去了? 面试官:若你写的 Java 程序,出现了性能问题,该怎么去排查呢? 工欲善其事必先利其器,为你呈上一箩筐性能优化工具,必有一款满足你,废话不多说,直 ...
- Java 程序该怎么优化?(命令篇)
灵魂拷问,JDK 提供的命令,除了 java.javac,你还用过哪些命令呢? 灵魂再拷问,若你写的 Java 程序,出现了性能问题,该怎么去排查呢? Java 作为编程语言中的战斗机,JDK 默认已 ...
- Java 程序该怎么优化?(技巧篇)
搬砖者:为什么程序总是那么慢?它现在到底在干什么?时间都花到哪里去了? 面试官:简单谈谈 Java 程序性能优化? 1. 字符串处理优化,乃优化之源. 研发过程中,String 的 API 用的应该是 ...
- PHP性能优化 -实战篇
借助xhprof 工具分析PHP性能 XHPorf(源自Fackbook 的PHP性能分析工具) 实战 通过分析Wordpress程序,做优化! 优化 找到需要优化的函数 grep 'impo ...
- java程序员的NodeJS初识篇
摘要 作为一个一直用java来写后端的程序员用NodeJS来写后台,实在不是很爽.这里记下这两个月的NodeJS学习所遇之坑,与java转NodeJS的同仁共勉.学习时间不长,若有理解错误,望指正. ...
- 为何我建议1-3年的Java程序员仔细看看这篇文章
此文的目的是为了督促自己去不断学习,让自己有更明确的方向去提升自己.以技能树为基础,以面试要点为大纲,我觉得比抓住什么看什么要更有目的,更能坚持下去.世界瞬息万变,我们要时刻准备着.时刻提高着自己,才 ...
- JVM性能优化系列-(4) 编写高效Java程序
4. 编写高效Java程序 4.1 面向对象 构造器参数太多怎么办? 正常情况下,如果构造器参数过多,可能会考虑重写多个不同参数的构造函数,如下面的例子所示: public class FoodNor ...
随机推荐
- CSS3新单位vw,vh,vmin,vmax详解
1,vw,vh,vmin,vmax是由视窗Viewport大小来决定的,单位1,代表1%,是一种相对单位,只要是为响应式适配视窗的一种解决方案: vw:view width(视窗宽度)的百分比,1vw ...
- Linux基本操作及常用指令
今天复习了下Linux的基本操作及常用指令,上学期大数据云计算课一直也在用linux系统还是比较熟悉的,并在centos6.7虚拟机上部署了前几天做的web项目,了解了Nginx的反向代理与负载均衡, ...
- JS反爬绕过思路之--谷歌学术镜像网链接抓取
首先,从问题出发: http://ac.scmor.com/ 在谷歌学术镜像网收集着多个谷歌镜像的链接.我们目标就是要把这些链接拿到手. F12查看源码可以发现,对应的a标签并不是我们想要的链接,而是 ...
- Simulink仿真入门到精通(十三) Simulink创建自定义库
当用户自定义了一系列模块之后,可以自定义模块库将同类自定义模块显示到Simulink Browser中,作为库模块方便地拖曳到新建模型中. 建立这样的自定义库需要3个条件: 建立library的mdl ...
- Vue2.0 【第二季】第6节 Component 初识组件
目录 Vue2.0 [第二季]第6节 Component 初识组件 第6节 Component 初识组件 一.全局化注册组件 二.局部注册组件局部 三.组件和指令的区别 Vue2.0 [第二季]第6节 ...
- 大数据存储利器 - Hbase 基础图解
由于疫情原因在家办公,导致很长一段时间没有更新内容,这次终于带来一篇干货,是一篇关于 Hbase架构原理 的分享. Hbase 作为实时存储框架在大数据业务下承担着举足轻重的地位,可以说目前绝大多数大 ...
- GO系列 | 5分钟入门GO【译】
什么是Google Go? Google Go是由Robert Griesmer,Rob Pike和Ken Thompson在Google设计的一种开源编程语言. Go在语法上类似于C语言: 除了内存 ...
- 升级cocoapods到指定版本
把cocoapods升级到1.7.4 sudo gem install -n /usr/local/bin cocoapods -v 1.7.4
- ComplexBrowser: a tool for identification and quantification of protein complexes in large-scale proteomics datasets(大规模蛋白组学数据集中鉴定和定量蛋白复合物)
文献名:ComplexBrowser: a tool for identification and quantification of protein complexes in large-scale ...
- 曹工说Spring Boot源码(25)-- Spring注解扫描的瑞士军刀,ASM + Java Instrumentation,顺便提提Jar包破解
写在前面的话 相关背景及资源: 曹工说Spring Boot源码(1)-- Bean Definition到底是什么,附spring思维导图分享 曹工说Spring Boot源码(2)-- Bean ...