面试官:出现了性能问题,该怎么去排查呢?

程序猿:接口响应那么慢,时间都花到哪里去了?

运维喵:为什么你的应用跑着跑着,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 程序该怎么优化?(实战篇)的更多相关文章

  1. 小程序Canvas性能优化实战

    以下内容转载自totoro的文章<小程序Canvas性能优化实战!> 作者:totoro 链接:https://blog.totoroxiao.com/canvas-perf-mini/ ...

  2. 手牵手,使用uni-app从零开发一款视频小程序 (系列下 开发实战篇)

    系列文章 手牵手,使用uni-app从零开发一款视频小程序 (系列上 准备工作篇) 手牵手,使用uni-app从零开发一款视频小程序 (系列下 开发实战篇) 扫码体验,先睹为快 可以扫描下微信小程序的 ...

  3. Java 程序该怎么优化?(工具篇)

    程序员:为什么程序总是那么慢?时间都花到哪里去了? 面试官:若你写的 Java 程序,出现了性能问题,该怎么去排查呢? 工欲善其事必先利其器,为你呈上一箩筐性能优化工具,必有一款满足你,废话不多说,直 ...

  4. Java 程序该怎么优化?(命令篇)

    灵魂拷问,JDK 提供的命令,除了 java.javac,你还用过哪些命令呢? 灵魂再拷问,若你写的 Java 程序,出现了性能问题,该怎么去排查呢? Java 作为编程语言中的战斗机,JDK 默认已 ...

  5. Java 程序该怎么优化?(技巧篇)

    搬砖者:为什么程序总是那么慢?它现在到底在干什么?时间都花到哪里去了? 面试官:简单谈谈 Java 程序性能优化? 1. 字符串处理优化,乃优化之源. 研发过程中,String 的 API 用的应该是 ...

  6. PHP性能优化 -实战篇

    借助xhprof 工具分析PHP性能 XHPorf(源自Fackbook 的PHP性能分析工具) 实战     通过分析Wordpress程序,做优化! 优化 找到需要优化的函数 grep 'impo ...

  7. java程序员的NodeJS初识篇

    摘要 作为一个一直用java来写后端的程序员用NodeJS来写后台,实在不是很爽.这里记下这两个月的NodeJS学习所遇之坑,与java转NodeJS的同仁共勉.学习时间不长,若有理解错误,望指正. ...

  8. 为何我建议1-3年的Java程序员仔细看看这篇文章

    此文的目的是为了督促自己去不断学习,让自己有更明确的方向去提升自己.以技能树为基础,以面试要点为大纲,我觉得比抓住什么看什么要更有目的,更能坚持下去.世界瞬息万变,我们要时刻准备着.时刻提高着自己,才 ...

  9. JVM性能优化系列-(4) 编写高效Java程序

    4. 编写高效Java程序 4.1 面向对象 构造器参数太多怎么办? 正常情况下,如果构造器参数过多,可能会考虑重写多个不同参数的构造函数,如下面的例子所示: public class FoodNor ...

随机推荐

  1. 前端劝退预警:JavaScript 工具链不完全指南

    经过这么多年的发展,JavaScript 早已经不是当年那个不太起眼的脚本语言.如今的 JavaScript 可以说是风光无限,在 Web 前端.移动端.服务端甚至物联网设备上都大展身手,到处都有它的 ...

  2. C#.Net全栈工程师之路-学习路径

    C#.Net全栈工程师之路-学习路径 按架构分: C/S架构: B/S架构: Mobile移动开发: 按技术点分: C#编程基础以及OOP面向对象编程: 数据库基础以及高级应用(MYSQL+MSSQL ...

  3. Lake Counting(POJ No.2386)

    题目描述:有一个大小为N*M的园子,八连通的积水被认为是连接在一起的.请求出园子里总共有多少水洼?(八连通指的是下图中相对w的*部分) *** *w* *** 限制条件 N,M<=100 样例 ...

  4. BFC块级格式上下文介绍

    块级格式上下文(Block formatting context) 什么是BFC? 块格式化上下文(block formatting context) 是页面 CSS视觉渲染的一部分.它是用于决定块盒 ...

  5. iframe的父子层跨域 用了百度的postMessage()方法

    父层:第一个是方法申明 第二个是接收子层过来的数据 <script type="text/javascript"> $("#main").load( ...

  6. 【分布式锁】04-使用Redisson实现ReadWriteLock原理

    前言 关于读写锁,大家应该都了解JDK中的ReadWriteLock, 当然Redisson也有读写锁的实现. 所谓读写锁,就是多个客户端同时加读锁,是不会互斥的,多个客户端可以同时加这个读锁,读锁和 ...

  7. java-根据用户输入的成绩来判断等级(新手)

    //创建的一个包名. package qige; //导入的一个包.import java.util.Scanner; //定义一个类.public class Zy2 { //公共静态的主方法. p ...

  8. JavaScript(7)--- 继承

    JavaScript(7)--- 继承 概念 首先继承是一种关系,类(class)与类之间的关系,JS中没有类,但是可以通过构造函数模拟类,然后通过原型来实现继承,继承也是为了数据共享. 之间有讲过j ...

  9. 【开源】使用Angular9和TypeScript开发RPG游戏

    RPG系统构造 通过对于斗罗大陆小说的游戏化过程,熟悉Angular的结构以及使用TypeScript的面向对象开发方法. 项目地址 人物 和其他RPG游戏类似,游戏里面的人物角色大致有这样的一些属性 ...

  10. 华为云+NextCloud(私人云盘搭建)

    这几天发现了牛客+华为云的返现活动,免费用一年,赶紧的去搞了一个折腾折腾.(相关软件下载链接在最下面) 噔噔噔!!! 102822985.png) 废话少说,开始搭建. 基础环境部署 Apache安装 ...