JAVACPU占用过高、内存泄漏问题排查
📢📢📢📣📣📣
哈喽!大家好,我是「奇点」,江湖人称 singularity。刚工作几年,想和大家一同进步🤝🤝
一位上进心十足的【Java ToB端大厂领域博主】!😜😜😜
喜欢java和python,平时比较懒,能用程序解决的坚决不手动解决😜😜😜✨ 如果有对【java】感兴趣的【小可爱】,欢迎关注我
❤️❤️❤️感谢各位大可爱小可爱!❤️❤️❤️
————————————————如果觉得本文对你有帮助,欢迎点赞,欢迎关注我,如果有补充欢迎评论交流,我将努力创作更多更好的文章。
————————————————
版权声明:本文为CSDN博主「HiSiri666666」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_29235677/article/details/126655356
问题起因:
java工程消费的内容延迟严重,发现负责消费的dispatcher 进程阻塞,且占用的CPU%很高。
开始按照https://www.cnblogs.com/paul8339/p/7464206.html 文中提到的方法排查。
一、追查
重点:
如果java进程在docker下执行,需要进入docker里边执行下面的步骤,否则会报错:
Unable to open socket file: target process not responding or HotSpot VM not loaded
第一步:先获取到需要排查的进程PID
查询前十个消耗CPU做多的进程命令:
ps aux|head -1;ps aux|grep -v PID|sort -rn -k +3|head
获取java进程的资源消费情况:
ps -ef | grep java
第二步:获取线程信息,找到耗CPU的线程
ps -mp pid -o THREAD,tid,time | sort -rn 6
第三步:打印线程的堆栈信息
先将需要的线程ID转换为16进制格式
printf "%x\n" tid
jstack pid |grep tid -A 30
jstack 1024 |grep tid -A 30
踩坑1:
我们的工程运行在docker环境下,需要进入docker下执行前两步,否则在执行jstack的时候报错:
Error attaching to process: Doesn't appear to be a HotSpot VM (could not find symbol "gHotSpotVMTypes" in remote process)
sun.jvm.hotspot.debugger.DebuggerException: Doesn't appear to be a HotSpot VM (could not find symbol "gHotSpotVMTypes" in remote process)
at sun.jvm.hotspot.HotSpotAgent.setupVM(HotSpotAgent.java:411)
at sun.jvm.hotspot.HotSpotAgent.go(HotSpotAgent.java:305)
at sun.jvm.hotspot.HotSpotAgent.attach(HotSpotAgent.java:140)
at sun.jvm.hotspot.tools.Tool.start(Tool.java:185)
at sun.jvm.hotspot.tools.Tool.execute(Tool.java:118)
at sun.jvm.hotspot.tools.JStack.main(JStack.java:92)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at sun.tools.jstack.JStack.runJStackTool(JStack.java:140)
at sun.tools.jstack.JStack.main(JStack.java:106)
解决办法:
执行 docker ps -a 找到需要进入的docker CONTAINER ID
执行 docker exec -it CONTAINER ID /bin/bash 进入docker
踩坑2:
linux没有默认开启trace debug功能,执行jstack的时候提示:
Can't attach to the process
解决办法:
echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope
参考https://www.cnblogs.com/wscit/p/6803354.html
执行jstack后发现好多线程都是BLOCKED状态,堆栈信息如下:
Thread 171: (state = BLOCKED)
- sun.misc.Unsafe.park(boolean, long) @bci=0 (Compiled frame; information may be imprecise)
- java.util.concurrent.locks.LockSupport.park(java.lang.Object) @bci=14, line=175 (Compiled frame)
- java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await() @bci=42, line=2039 (Compiled frame)
- java.util.concurrent.LinkedBlockingQueue.take() @bci=29, line=442 (Compiled frame)
- java.util.concurrent.ThreadPoolExecutor.getTask() @bci=149, line=1074 (Compiled frame)
- java.util.concurrent.ThreadPoolExecutor.runWorker(java.util.concurrent.ThreadPoolExecutor$Worker) @bci=26, line=1134 (Compiled frame)
- java.util.concurrent.ThreadPoolExecutor$Worker.run() @bci=5, line=624 (Interpreted frame)
- java.lang.Thread.run() @bci=11, line=748 (Interpreted frame)
--
- org.apache.commons.httpclient.HttpMethodBase.readStatusLine(org.apache.commons.httpclient.HttpState, org.apache.commons.httpclient.HttpConnection) @bci=36, line=1973 (Compiled frame)
- org.apache.commons.httpclient.HttpMethodBase.readResponse(org.apache.commons.httpclient.HttpState, org.apache.commons.httpclient.HttpConnection) @bci=21, line=1735 (Compiled frame)
- org.apache.commons.httpclient.HttpMethodBase.execute(org.apache.commons.httpclient.HttpState, org.apache.commons.httpclient.HttpConnection) @bci=68, line=1098 (Compiled frame)
- org.apache.commons.httpclient.HttpMethodDirector.executeWithRetry(org.apache.commons.httpclient.HttpMethod) @bci=135, line=398 (Compiled frame)
- org.apache.commons.httpclient.HttpMethodDirector.executeMethod(org.apache.commons.httpclient.HttpMethod) @bci=288, line=171 (Compiled frame)
- org.apache.commons.httpclient.HttpClient.executeMethod(org.apache.commons.httpclient.HostConfiguration, org.apache.commons.httpclient.HttpMethod, org.apache.commons.httpclient.HttpState) @bci=114, line=397 (Compiled frame)
- org.apache.commons.httpclient.HttpClient.executeMethod(org.apache.commons.httpclient.HttpMethod) @bci=14, line=323 (Compiled frame)
- com.weibo.qa.util.RequestUtil.execHttpMethod(org.apache.commons.httpclient.HttpMethod, int) @bci=38, line=361 (Compiled frame)
- com.weibo.qa.util.RequestUtil.getHttpRequest(java.util.Map, java.util.Map, java.lang.String, int) @bci=18, line=319 (Compiled frame)
- com.weibo.qa.util.RequestUtil.getHttpRequest(java.util.Map, java.util.Map, java.lang.String) @bci=4, line=340 (Compiled frame)
- com.weibo.qa.util.RequestUtil.getHttpRequest(java.util.Map, java.lang.String) @bci=11, line=272 (Compiled frame)
- com.weibo.qa.terminator.service.FriendService.getUserInforBatch(java.lang.Long[]) @bci=255, line=126 (Compiled frame)
二、分析
分析上面的信息可以看到,是调用了HttpClient之后线程锁死。
看工程的log日志,发现较多的warning:
WARN org.apache.commons.httpclient.HttpMethodBase - Going to buffer response body of large or unknown size. Using getResponseBodyAsStream instead is recommended.
参考https://blog.csdn.net/xiaoshuji/article/details/71077619
提到HttpClient建议使用InputStream getResponseBodyAsStream()代替byte[]getResponseBody()。对于返回结果很大或无法预知的情况,就需要使用InputStreamgetResponseBodyAsStream(),避免byte[] getResponseBody()可能带来的内存的耗尽问题。
三、解决
1. 一方面优化工程代码,减少接口调用;
2. 修改HttpClient接口的Response获取方式。
相关文章:

JAVACPU占用过高、内存泄漏问题排查
📢📢📢📣📣📣 哈喽!大家好,我是「奇点」,江湖人称 singularity。刚工作几年,想和大家一同进步🤝🤝 一位上进心十足的【Java ToB端大厂…...

2023年【公路水运工程施工企业安全生产管理人员】新版试题及公路水运工程施工企业安全生产管理人员模拟试题
题库来源:安全生产模拟考试一点通公众号小程序 公路水运工程施工企业安全生产管理人员新版试题是安全生产模拟考试一点通生成的,公路水运工程施工企业安全生产管理人员证模拟考试题库是根据公路水运工程施工企业安全生产管理人员最新版教材汇编出公路水…...

屏幕截图软件Snagit 2023 mac中文特点介绍
Snagit 2023 mac是一款屏幕截图和视频录制软件,它可以帮助用户快速捕捉屏幕上的任何内容,并将其编辑、标注和共享。 Snagit 2023 软件特点 多种截图模式:支持全屏截图、窗口截图、区域截图、延时截图等多种截图模式,满足不同用户…...

deepin操作系统下载
官网 最新版本 – 深度科技社区 下载页面 最新版本 – 深度科技社区 随便选择一个下载 直接下载地址 https://cdimage.deepin.com/releases/20.9/deepin-desktop-community-20.9-amd64.iso...

【docker】查看容器日志
目录 一.通过查找宿主机日志路径,通过Linux命令查看即可。 1.1 查看容器日志路径 1.2 按照日志路径检索日志 二、通过docker命令检索日志 2.1 查看指定时间后的日志,只显示最后20行 2.2 查看最近10分钟的日志 2.3 查看某时间段之后的日志 2.4 查…...
Vue使用Echarts建立知识图谱
文章目录 一、安装Echarts二、main.js中引入Echarts三、封装成组件四、渲染结果一、安装Echarts npm install echarts@4.9.0二、main.js中引入Echarts // 引入echarts --------------------- // npm install echarts@4.9.0 import echarts from echarts Vue.prototype.$echar…...
力扣(LeetCode)1726. 同积元组(C++)
哈希表 请看示例,可发现规律:乘积相同的两个数对,存在8种排列,满足同积元组的要求。于是有结论:乘积相同的两个数对,对答案的贡献是ansans8. 如上所述,我们需要先知道数对的乘积,才…...
LAXCUS分布式操作系统是怎么实现的?
一直有网友要求讲讲LAXCUS分布式操作系统是怎么实现的,其实LAXCUS分布式操作系统的设计研发,涉及各种基础技术和底层架构,研发过程很漫长,一直在坚持,实现过程也非常复杂,尤其重要的是要保证运行过程&#…...
香港服务器的速度为什么比较快
租用过海外服务器的用户的都知道,在这么多免备案的服务器产品中,租用香港服务器的速度是最快的,对于身在国内的网站 运营者或者企业租用香港服务器搭建网站,针对大陆用户不仅仅体验是最好的,其次也方便网站的管理者对于…...

PhotoShop批量压缩图片
打开photoshop,在顶部的菜单栏选择文件》脚本》图像处理器。 选择合适的参数,运行即可。...

零基础入门网络渗透到底要怎么学?_网络渗透技术自学
前言: 很多朋友问我,想搞网络安全,编程重要吗,选什么语言呢? 国内其实正经开设网络安全专业的学校很少,大部分同学是来自计算机科学、网络工程、软件工程专业的,甚至很多非计算机专业自学的。…...

一个可以解决企业跨网文件交换难题的软件所具备的特性必须有哪些
在当今数字化办公的浪潮中,企业跨网文件交换成为了不可忽视的重要需求。无论是内部网络还是外部网络,都存在着各种跨网文件交换的场景,然而这一过程也面临着一系列的挑战。本文将深入探讨企业跨网文件交换的难题以及一款可以解决企业跨网文件…...

【根据车间号[81321000]未找到ERP逻辑仓】
以条码Z42310062781622举例,WMS集成报错。 先说业务逻辑: 新建包装工单,维护包装批次管制时,会把包装批次管制里的部门信息传给115。 赛龙捷包装后,会根据115里的这个部门对应的车间号,返还给MES。 MES会…...
Dapr v1.12 正式发布:发件箱模式是亮点
Dapr 是一种可移植、事件驱动的运行时,使任何开发人员都可以轻松构建在云和边缘运行的弹性、无状态和有状态应用程序,并支持多种语言和开发框架。 Dapr 1.12.0 发布!以下是 v1.12 版本的亮点,发件箱模式 是最大亮点: …...
RedisObject
前言 Redis 是一个基于内存的,以 Key-Value 形式存储数据的 NoSQL 数据库。 相较于其它 NoSQL 数据库,Redis 提供了更丰富的数据类型和 API,开发者可以基于 Redis 实现数据缓存、消息队列、分布式锁等场景。 Redis 底层用一个全局哈希表来存…...
【剑指Offer】31.栈的压入、弹出序列
题目 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就…...
Linux设置开机自启动奇安信可信浏览器,并配置默认页面
1. 先安装奇安信可信浏览器 安装完成后,会在/usr/share/applications/目录下生成一个 qaxbrowser-safe.desktop文件。 2.配置fixfox开机自启动 使用root用户进行如下操作: 将qaxbrowser-safe.desktop 文件复制到 ~/.config/autostart/ 目录下…...
flink1.15 异步维表Join 用于外部数据访问的异步 I/O scala版本
官方文档 Asynchronous I/O for External Data Access 异步 I/O | Apache Flink 核心问题 问什么有官方文档,我还要写个博客,因为scala Future这块有坑. 1 为什么我的算子显示反压100% 2 为什么我的任务不报错,也没有输出 3 Future对象我该怎么构建,有哪些注意事项. pom …...

Elasticsearch Relevance Engine---为AI变革提供高级搜索能力[ES向量搜索、常用配置参数、聚合功能等详解]
Elasticsearch Relevance Engine—为AI变革提供高级搜索能力[ES向量搜索、常用配置参数、聚合功能等详解] 今天要介绍的 Elasticsearch Relevance Engine™ (ESRE™),提供了多项用于创建高度相关的 AI 搜索应用程序的新功能。ESRE 站在 Elastic 这个搜索领域的巨人…...

微信小程序之会议OA系统首页布局搭建与Mock数据交互
目录 前言 一、Flex 布局( 分类 编程技术) 1、Flex布局是什么? 2、基本概念 3、容器的属性 3.1 flex-direction属性 3.2 flex-wrap属性 3.3 flex-flow 3.4 justify-content属性 3.5 align-items属性 3.6 align-content属性 4、项目…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型
摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...
基于大模型的 UI 自动化系统
基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...
Admin.Net中的消息通信SignalR解释
定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...

LeetCode - 394. 字符串解码
题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...
OkHttp 中实现断点续传 demo
在 OkHttp 中实现断点续传主要通过以下步骤完成,核心是利用 HTTP 协议的 Range 请求头指定下载范围: 实现原理 Range 请求头:向服务器请求文件的特定字节范围(如 Range: bytes1024-) 本地文件记录:保存已…...

2021-03-15 iview一些问题
1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...

相机从app启动流程
一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...
Axios请求超时重发机制
Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式: 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...
拉力测试cuda pytorch 把 4070显卡拉满
import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试,通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小,增大可提高计算复杂度duration: 测试持续时间(秒&…...