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 ...
随机推荐
- position:absolute和width的关系
碰到如下问题: 如图,我设置了宽高和绝对定位 ,但实际上我图片显示宽度为0: 然后我就查了一下,发现是因为我设了公共img宽度有个max-width:100%:屏蔽掉就有正常宽了,这点暂时没明白为啥 ...
- IoT设备实践丨如果你也在树莓派上部署了k3s,你也许需要这篇文章
前 言 树莓派是一种广泛流行的开发板,随着物联网的深入发展,树莓派大有成为IoT终端设备标准之趋势.在支持客户在IoT场景中落地k3s时,k3s在树莓派上的部署问题也就出现了.本文记录了一些其中的关键 ...
- 数据结构 - Collection接口
简介 Collection继承自Iterable,Collection接口是Java集合两大分支中的一支,Queue.List.Set都是Collection的扩展:集合大类分为了Collection ...
- python读取文件指定行内容
python读取文件指定行内容 import linecache text=linecache.getline(r'C:\Users\Administrator\Desktop\SourceCodeo ...
- 详解分页组件中查count总记录优化
1 背景 研究mybatis-plus(以下简称MBP),使用其分页功能时.发现了一个JsqlParserCountOptimize的分页优化处理类,官方对其未做详细介绍,网上也未找到分析该类逻辑的只 ...
- div中单行文字垂直水平居中
1.div中单行文字垂直水平居中.条件:外层div高度已经给定.代码如下: 复制代码代码如下: <style type="text/css">.div3{border: ...
- 当AI遇上K8S:使用Rancher安装机器学习必备工具JupyterHub
Jupyter Notebook是用于科学数据分析的利器,JupyterHub可以在服务器环境下为多个用户托管Jupyter运行环境.本文将详细介绍如何使用Rancher安装JupyterHub来为数 ...
- 下载网页中的 pdf 各种姿势,教你如何 carry 各种网页上的 pdf 文档。
关联词: PDF 下载 FLASH 网页 HTML 报告 内嵌 浏览器 文档 FlexPaperViewer swfobject. 这个需求是最近帮一个妹子处理一下各大高校网站里的 PDF 文档下载, ...
- 关于CORS(跨域资源共享)的几个http请求头小实验
对几种与跨域相关的请求头做一个总结 关于跨域可以看:9 种常见的前端跨域解决方案(详解) 看完后可以配合我的代码做些实验,看看注释掉某个响应头会发生什么,整体代码会在最后贴出 跨域简单请求 需要在服务 ...
- hdoj 1829 A bug's life 种类并查集
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1829 并查集的一个应用,就是检测是否存在矛盾,就是两个不该相交的集合有了交集.本题就是这样,一种虫子有 ...