一次线上java应用响应时间过长问题的排查

article/2025/10/13 12:01:11

最近接手一个老java应用,没多久接到响应时间太长的报警,整个排查过程还是挺有意思的,记录一下。
整个过程中,设计到cpu,内存,垃圾回收,引用,spring, 单例 等等知识,整个下来,心情愉悦。

接到报警

吃完晚饭回来,接到报警短信,服务响应时间太长,达到2s以上。
第一反应,怎么可能,这个应用很简单,就提供了几个查询接口,QPS单机也就10左右,居然响应时间2s以上,这不科学。

看监控

看监控平台,有问题的机器,cpu占用很高,这。。。更不科学了。理论上,这应用cpu能到1%就不错了,现在居然80%,吓得我赶紧跑到机器上,top了一把,确实是java应用占用cpu很高。

找出占用cpu的线程

ps -mp pid -o THREAD,tid,time

发现cpu几乎全被一个线程占用了,将线程id转换成16进制

printf "%x\n" tid

打印线程堆栈信息

jstack pid |grep tid -A 30

看到的结果居然是,CMS垃圾收集器的线程。。。
这,这,这不科学。

垃圾回收

看垃圾回收日志,发现一直在进行Full GC,但是几乎没啥效果,GC完了,老年代依然是几乎占满的状态。
即使是CMS,也不能避免传说中的stop the world,所以响应时间变长了。
但是,现在问题来了,Full GC回收不掉的对象都是啥啥啥?

分析java堆内存

先把线上流量从这台机器切走,然后dump,分析后发现,一共160多万个PoolHttpConnectionManager对象占领了绝大多数内存。
会议了一下代码,和http请求有关的只有oss存储的client了。
猜测是new oss client时的问题

oss client 源码

看了一下应用中的代码,发现每次使用oss时都会 new OssClient,用完之后没有shutdown。
但是,new是在方法内部的,方法内的局部变量按道理说,方法结束后直接就可以回收的啊,这不科学,肯定是ossClient的源码中搞了鬼。于是直接去源码中看了一下。
发现在new OssClient时,源码中会新建上面提到的PoolHttpConnectionManager,然后调用ossClient存取数据时,PoolHttpConnectionManager会从内部维护的http连接池中找到可用连接,进行操作。
这没问题,大多是框架都是这么设计的。
既然JVM 堆内存中有160多万个PoolHttpConnectionManager对象,说明肯定是有地方把内次new OssClient时新建的PoolHttpConnectionManager给缓存起来了,导致垃圾回收无能为力。
继续看源码,发现确实和我想的一样。给存起来了,只有显式调用ossClient的shutdown,才会清理掉缓存。
想想这样设计也没问题,这和线程池的思想是一样的,我们使用线程池时,肯定不会每次都new 一个新的,只不过这个ossClient隐藏的比较深。。。

解决

解决办法很简单,把OssClient改成单例就行了。
但是,集团封网期间不允许上线,这。。。
没办法,把应用重启一遍,JVM内存满血复活,清醒QPS很低,重启后可以撑过封网的时间断了

Spring的Controller是单例的

突然想到,其他应用也使用了这个OssClient,一直没问题,想必是单例吧,忍不住上去瞅了瞅代码,发现,是在一个Controller中使用了成员变量,像这样:

@RestController
@RequestMapping("/sdk/map/styles")
public class MyController {private OSSClient ossClient = new OSSClient();public put(Object o) {ossClient.put(0);}

我记得上学那会儿,捣腾Struts的时候,Action并不是单例的啊,单里会有问题,难道Spring是单例了?
查了一下,确实,Spring的Controller,默认是单例。
想了想,单例也没啥问题,只要不在方法中去操作成员变量就可以了。

后记

你所学的知识,都是有用的,认为没用,也许只是时候未到而已。


http://chatgpt.dhexx.cn/article/T9WqRwGT.shtml

相关文章

阿里云服务器部署项目正常启动,但是访问项目时报响应时间过长

目录 1.问题描述 2.解决办法 1.问题描述 本人使用阿里云部署项目时,将jar包传到服务器中并成功启动后,访问项目时一直报响应时间过长 2.解决办法 这种情况可能是因为阿里云服务器中安全组策略的对应端口没有开放,修改一下就行了&#xff0…

asp.net MVC项目,localhost响应时间过长解决办法

1、vs打开很慢,浏览器如下: 2、那就很可能是IIS问题嘛,IIS重启了一下,还是不行,在地址栏输入localhost,如下图(本人win10系统),明显IIS也没问题。 3、我们的项目没问题,IIS也没问题&…

解决Chrome 账户登录时,网页显示响应时间过长

解决Chrome 账户登录时,网页显示响应时间过长 chrome 想要开启同步功能,登录Chrome账户时网页显示 响应时间过长 通过此文章https://blog.csdn.net/m0_38020436/article/details/112859777解决了这个问题,于是顺手将过程记录下来。 一、下…

解决github.com 的响应时间过长

github.com 的响应时间过长 windows系统打开目录 C:\Windows\System32\drivers\etc 找到host文件,右键-属性,把只读取消勾选。 利用一下任一网站查询github.com的IP地址 站长之家 http://ip.tool.chinaz.com/github.com 便民查询网 https://ip.51240.co…

网站响应时间过长怎么回事 解决方法都有哪些

网站响应时间过长怎么回事?解决方法都有哪些?很多人在完成HTML5和CSS3部分的学习之后,都要独立完成网页制作项目实践,在这个过程中有部分同学发现网页打开很慢,即网站响应时间过长。针对这​个问题,千锋老师给大家分享几种比较好的解决方法。 网站响应时间是什么? 网站…

为什么我的接口响应时间这么长?记一次接口响应时间过长问题排查

一、情况描述 某saas应用,在请求一个接口的时候,发现响应时间非常的慢,利用前台google浏览器的F12调试,发现响应时间超过2秒 二、问题排查 项目整体采用前后端分离,前端通过nginx实现负载转发,请求后端接…

计算机网络(六):链路层

文章目录 1. 概述2. 差错检测和纠正技术3. 多路访问链路和协议3.1 信道划分协议3.2 随机接入协议3.2.1 ALOHA协议3.2.2 CSMA 3.3 轮流协议 4. 交换局域网4.1 MAC地址4.2 以太网4.2.1 以太网帧结构 4.3 链路层交换机4.3.1 交换机转发和过滤4.3.2 链路层交换机的性质 5. 无线网络…

网络层、链路层理解

1.网络层和链路层关系 2.网络层 路由器 其实计算机本身就有路由器的功能,路由器可以理解成专用的特化简化型计算机,因此数据包的第一次转发发生在计算机本身。这也是为什么在不用路由器,纯交换机组局域网的时候,IP地址也会被需…

链路层协议——以太网协议

以太网协议 一、以太网帧格式二、ARP协议2.1 协议格式2.2 作用2.3 工作流程2.4 ARP局域网欺骗攻击 三、MTU对于上层协议的影响3.1 TCP协议的影响3.2 UDP协议的影响 链路层协议主要是负责相邻设备之间的数据传输。 一、以太网帧格式 max地址:网卡设备的物理硬件地址&…

链路层交换机及和路由器的比较

文章目录 前言一、交换机转发和过滤二、帧来到交换机可能发生的情况三、自学习三、链路交换机的性质四、交换机和路由器比较 前言 交换机的任务是接收入链路层帧并将它们转发到出链路;交换机自身对子网中的主机和路由器是透明的;这就是说,某主机/路由器向另一个主机…

链路层、网络层、传输层、应用层长度

1、概述 首先要看TCP/IP协议,涉及到四层:链路层,网络层,传输层,应用层。      以太网(Ethernet)的数据帧在链路层      IP包在网络层      TCP或UDP包在传输层      TCP或UDP中…

计算机网络原理 - 网络层、链路层总结笔记

计算机网络原理 - 网络层、链路层 ##4.网络层 网络层主要是利用IP上的传输,在路由器中最高达到的层次为网络层,分组交换机只到链路层;IP准确来说不是一个主机的地址,而是一个接口的地址。 4.1 概述 网络层的作用:将分…

【计算机网络】链路层

链路层和局域网 1、链路层概述1.1链路层提供的服务1.2链路层在何处实现 2、差错检测和纠正技术2.1奇偶校验2.2检验和方法2.3循环冗余检测 3、多路访问链路和协议3.1信道划分协议3.2随机接入协议3.2.1时隙ALOHA3.2.2ALOHA3.2.3载波侦听多路访问CSMA3.2.4具有碰撞检测的载波侦听多…

BLE 链路层(LL)的数据结构

一 链路层的数据结构 在链路层上传输的数据格式如下图所示: 广播报文和数据报文都包含 Preamble(前导码), AccessAddress(接入地址),PDU(数据),CRC。其中Constant Tone Extension是可选的。 前导码接入地址PDU HeaderLengthpayloadMIC(可选…

计算机网络自顶向下-链路层

链路层和局域网 两台主机之间,数据报跨越一系列通信链路传输,一些是有线链路一些是无线链路,从源主机起,通过一些了分组交换机在目的主机结束。在链路层中有两种不同的链路层信道, 第一种是广播信道,这种信…

链路层信道详解

文章目录 一、链路层概述链路层提供的服务链路层在何处实现 二、差错检验和纠正技术奇偶校验检验和方法循环冗余检测 三、多路访问协议信道划分协议时分多路复用(TDM):频分多路复用(FDM):码分多址&#xff…

计算机网络-链路层

一、概述 1.相关概念 节点:运行链路层协议的任何设备。链路:沿着通信路径连接相邻几诶单的通信信道。 2.提供的服务 2.1 成帧 几乎所有的链路层协议都要将数据报用链路层帧封装起来。一个帧由一个数据字段和若干首部字段组成,其中网络层…

链路层协议

文章目录 1. 链路层协议1.1 链路层协议与IP协议 2. 以太网帧与IP数据包2.1 以太网帧2.1.1 实用地位2.1.2 以太网帧格式 2.2 串行接口链路层协议 S L I P2.2.1 实用地位2.2.2 链路帧格式 2.3 串行接口链路层协议 P P P2.3.1 实用地位2.3.2 PPP 帧格式 2.4 环回接口2.4.1 环回定义…

链路层---->MAC地址,链路层与网络层对比

链路层 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> . 链路层和网络层…

链路层数据帧格式总结

创作人QQ:851301776,邮箱:lfr890207163.com,欢迎大家一起技术交流,本博客主要是自己学习的心得体会,只为每天进步一点点! 个人座右铭: 1.没有横空出世,只要厚积一定发。 2.你可以学…