JVM-接口响应时间很长解决办法

news2024/9/21 12:37:56

问题
在程序运行过程中,发现有几个接口的响应时间特别长,需要快速定位到是哪一个方法的代码执行过程中出现了性能问题。
解决思路
已经确定是某个接口性能出现了问题,但是由于方法嵌套比较深,需要借助于算法定位到具体的方法。

Arthas的trace命令

使用arthas的trace命令,可以展示出整个方法的调用路径以及每一个方法的执行耗时。

命令: trace 类名 方法名

添加--skipJDKMethod false 参数可以输出JDK核心包中的方法及耗时。

添加 ‘ #cost >毫秒值 ’ 参数,只会显示耗时超过该毫秒值的调用。

添加 -n 数值参数,最多显示该数值条数的数据。

所有监控都结束之后,输入stop结束监控,重置arthas增强的对象。(arthas底层使用动态代理的方式去增强这些对象从而获取他的调用时间,这样就增加了方法调用的开销降低了性能,如果不输入stop,增强的对象会在内存中保存,这个性能将会持续产生,所以最好是使用stop结束监控)

Arthas使用trace命令统计每个方法的执行时间

在这里插入图片描述

代码:

package com.itheima.jvmoptimize.performance;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.ArrayList;
import java.util.Random;

@RestController
@RequestMapping("/performance")
public class PerformanceController {

    private Object obj1 = new Object();
    private Object obj2 = new Object();
    private Random random = new Random();

    @GetMapping("/1")
    public void test1(){
        while (true){

        }
    }

    @GetMapping("/deadlock1")
    public String test2() throws InterruptedException {
        synchronized (obj1){
            Thread.sleep(5000);
            synchronized (obj2){
                return "返回成功";
            }
        }
    }

    @GetMapping("/deadlock2")
    public String test3() throws InterruptedException {
        synchronized (obj2){
            Thread.sleep(5000);
            synchronized (obj1){
                return "返回成功";
            }
        }
    }

    @GetMapping("/slow")
    public void test4(int i) throws InterruptedException {
        if(i <= 0){
            return;
        }
        Thread.sleep(random.nextInt(2000));
        test5();
    }

    private void test5() throws InterruptedException {
        Thread.sleep(random.nextInt(1000));
    }


    @GetMapping("/profile1")
    public void test6() throws InterruptedException {
        ArrayList<Integer> objects = new ArrayList<>();
        for (Integer i = 0; i < 20000000; i++) {
            objects.add(i);
        }
    }

    @GetMapping("/profile2")
    public void test7() throws InterruptedException {
        ArrayList<Integer> objects = new ArrayList<>(20000000);
        for (Integer i = 0; i < 20000000; i++) {
            objects.add(i);
        }
    }

}

启动程序(springboot)

启动arthas连接springboot应用程序(可自行百度查找):

输入命令进行监控慢请求的接口

trace com.itheima.jvmoptimize.performance.PerformanceController test4

打开测试软件请求:

http://localhost:8882/performance/slow?i=1

在这里插入图片描述

请求结果如下发现可以打印出请求比较慢的一些接口和信息

在这里插入图片描述

也可以使用命令查看更详细的显示

trace com.itheima.jvmoptimize.performance.PerformanceController test4 --skipJDKMethod false

在这里插入图片描述

再次使用postman发起请求

输出内容为:

在这里插入图片描述
可以看出命令窗口中输出了详细的方法和内容

重新发送请求将 i=1改为i=0(这样代码直接就return出去了)

发起请求 http://localhost:8882/performance/slow?i=0

在这里插入图片描述

可以发现依旧能打印出来信息

在这里插入图片描述

但是在线上环境这种端时间的请求我们不希望被arthas监控到,我们可以加个参数根据耗时时间打印出来内容

命令:

 trace com.itheima.jvmoptimize.performance.PerformanceController test4 --skipJDKMethod false  '#cost >1000'

再次发起请求
在这里插入图片描述

可以发现什么都没有打印出来

在这里插入图片描述

将参数改成i=1发现请求时间超过1s
在这里插入图片描述

在这里插入图片描述

如上图已经打印出来信息了

接下来可以输入-n 设置监控多少次请求

trace com.itheima.jvmoptimize.performance.PerformanceController test4 -n 1

在这里插入图片描述

打开postman发起两次请求看下结果:
在这里插入图片描述
在这里插入图片描述

命令窗口内容如下

在这里插入图片描述

会发现当前命令自动退出了,我们可以对它进行仔细分析

注意:arhtas 有一个小细节如下

启动一个项目,其中有个接口循环100w次
在这里插入图片描述

请求后发现接口响应时长为1.5秒:
在这里插入图片描述

我们启动arthas监控一下这个接口,在命令提示行输入命令
在这里插入图片描述

再次调用发现这个接口耗时增加到了2秒多
在这里插入图片描述

将代码中的循环调整为100次再次使用arthas监控

在这里插入图片描述在这里插入图片描述

这个现象表现是arthas对循环较大的接口会产生较大的影响,循环越大影响响应时间越长,建议本地测试时适当减少循环次数

使用完记得输入stop命令进行关闭,这样将不会当前的内存和性能产生任何影响
在这里插入图片描述

watch命令

在使用trace定位到性能较低的方法之后,

使用watch命令监控该方法,可以获得更为详细的方法信息。

命令:watch 类名 方法名 '{params, returnobj}' '#cost>毫秒值' -x 2

'{params,returnobj}' 代表打印参数和返回值
-x 代表打印的结果中如果有嵌套(比如对象里有属性),最多只展开2层。允许设置的最大值为4。

测试如下
在这里插入图片描述
在这里插入图片描述

总结

1、通过arthas的trace命令,首先找到性能较差的具体方法,如果访问量比较大,建议设置最小的耗时,精确的找到耗时比较高的调用。
2、通过watch命令,查看此调用的参数和返回值,重点是参数,这样就可以在开发环境或者测试环境模拟类似的现象,通过debug找到具体的问题根源。
。允许设置的最大值为4。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1312028.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

为什么要有arp以及arp原理

今天给大家说说arp吧&#xff01;在学网络的时候&#xff0c;我们知道的是自顶向下交付数据包。但是我们在交付给数据链路层的时候&#xff0c;我们已经有了ip的报头&#xff0c;但是要注意的是&#xff0c;ip层可不会给我们传输数据包&#xff0c;他还要向下交付。我们学过ip协…

一分钟带你了解电容

电容器中的电容究竟是怎么定义的&#xff1f; 一个电容器&#xff0c;如果带1库的电量时两级间的电势差是1伏&#xff0c;这个电容器的电容就是1法拉&#xff0c;即&#xff1a;CQ/U 。但电容的大小不是由Q&#xff08;带电量&#xff09;或U&#xff08;电压&#xff09;决定…

Ubuntu18.04.6下samba服务的安装及配置

目录 01 安装samba服务&#xff1a; 03 重启samba服务 04 设置samba登录密码 05 测试 前言 虚拟机下Ubuntu18.04.6samba服务的安装及配置 01 安装samba服务&#xff1a; 命令行中输入 sudo apt-get install samba 02 配置 2.1 先创建一个需要共享的目录&#xff0c…

探索 Coinbase 二层链 Base 的潜力与风险

作者&#xff1a;lesleyfootprint.network 在不断变化的加密货币领域&#xff0c;Coinbase 已经确立了自己领先中心化交易所&#xff08;CEX&#xff09;的地位。然而&#xff0c;Coinbase 坚信去中心化是创造一个开放、全球范围内对每个人都可访问的加密经济的关键&#xff0…

【Axure教程】区间评分条

区间评分条是一种图形化的表示工具&#xff0c;用于展示某一范围内的数值或分数&#xff0c;并将其划分成不同的区间。这种评分条通常用于直观地显示数据的分布或某个指标的表现。常用于产品评价、调查和反馈、学术评价、健康评估、绩效评估、满意度调查等场景。 所以今天作者…

【Python】—— 文本分析

文本分析 相关知识1. 文本数据处理2. 文本可视化3. Python编程4. 词频统计5. 人名提取6. 自然段划分7. 人物出现频率分布分析8. 词云生成 实验内容数据下载地址&#xff1a;1.对纯英文小说进行分析。2.对中文小说进行分析。 问题与解决附录1.对纯英文小说进行分析。2.对中文小说…

【C语言】超详解strncpystrncatstrncmpstrerrorperror的使⽤和模拟实现

&#x1f308;write in front :&#x1f50d;个人主页 &#xff1a; 啊森要自信的主页 ✏️真正相信奇迹的家伙&#xff0c;本身和奇迹一样了不起啊&#xff01; 欢迎大家关注&#x1f50d;点赞&#x1f44d;收藏⭐️留言&#x1f4dd;>希望看完我的文章对你有小小的帮助&am…

Python自动化测试系列[v1.0.0][多种数据驱动实现附源码]

前情提要 请确保已经熟练掌握元素定位的常用方法及基本支持&#xff0c;请参考Python自动化测试系列[v1.0.0][元素定位] 数据驱动测试是自动化测试中一种重要的设计模式&#xff0c;这种设计模式可以将测试数据和测试代码分开&#xff0c;实现数据与代码解耦&#xff0c;与此同…

openHarmony添加system_basic权限安装报错

openHarmony添加system_basic权限安装报错 12/14 13:49:57: Install Failed: [Info]App install path:D:\huawei\project\FCTTest\entry\build\default\outputs\default\entry-default-signed.hap, queuesize:0, msg:error: failed to install bundle. error: install failed …

k8s常用命令及示例(三):apply 、edit、delete

k8s常用命令及示例(三)&#xff1a;apply 、edit、delete 1. kubectl apply -f 命令&#xff1a;从yaml文件中创建资源对象。 -f 参数为强制执行。kubectl apply和kubectl create的区别如下&#xff1a;kubectl create 和 kubectl apply 是 Kubernetes 中两个常用的命令&…

若依打包将vue放到.jar里面部署

1.vue静态文件&#xff0c;以及单页面 ruoyi-admin\src\main\resources\static \ruoyi-admin\src\main\resources\templates 2.后台开放白名单 "/cms", "/cms#/login" 3. mvc访问vue页面入口&#xff0c;接口 package com.ruoyi.web.controller.syst…

信号继电器 DX-31B DC220V 电压型 带板前接线底座

系列型号 DX-31B信号继电器DX-31BJ信号继电器 DX-32A信号继电器DX-32AJ信号继电器 DX-32B信号继电器DX-32BJ信号继电器 DX-31A信号继电器DX-33/1信号继电器 DX-33/2信号继电器DX-33/3信号继电器 DX-33/4信号继电器DX-33/5信号继电器 一. 继电器用途 DX-30系列信号继电器…

从池化的角度看GNN(包含PR-GNN,EdgePool等7篇论文)下篇

从池化的角度看GNN&#xff08;包含PR-GNN&#xff0c;EdgePool等7篇论文&#xff09;下篇 前言一些总结一些早期论文的简要介绍5️⃣论文StructPool&#xff1a;《StructPool: Structured Graph Pooling via Conditional Random Fields》6️⃣论文ASAP&#xff1a;《ASAP: Ada…

Kotlin 笔记 -- Kotlin 语言特性的理解(二)

都是编译成字节码&#xff0c;为什么 Kotlin 能支持 Java 中没有的特性&#xff1f; kotlin 有哪些 Java 中没有的特性&#xff1a; 类型推断、可变性、可空性自动拆装箱、泛型数组高阶函数、DSL顶层函数、扩展函数、内联函数伴生对象、数据类、密封类、单例类接口代理、inter…

Linux ed命令教程:如何使用ed命令编辑文本文件(附案例详解和注意事项)

Linux ed命令介绍 ed命令是Linux中的一个简单文本编辑器。它是一种基于行的文本编辑器&#xff0c;用于创建、修改和操作文本文件。它是Unix中最早的编辑器&#xff0c;后来被vi和emacs文本编辑器所取代。 Linux ed命令适用的Linux版本 ed命令在大多数Linux发行版中都可以使…

华为战略管理的核心工具与方法论:五看三定之“三定”定什么

上一篇文章&#xff0c;华研荟介绍了华为在战略管理中使用的工具之一&#xff1a;五看三定中的五看含义和主要的一些工具&#xff08;模型&#xff09;&#xff0c;今天继续为您介绍“三定”。 在“五看”中&#xff0c;最后一看是“看机会”&#xff0c;将我们面临的各种可能…

[Linformer]论文实现:Linformer: Self-Attention with Linear Complexity

文章目录 一、完整代码二、论文解读2.1 介绍2.2 Self-Attention is Low Rank2.3 模型架构2.4 结果 三、整体总结 论文&#xff1a;Linformer: Self-Attention with Linear Complexity 作者&#xff1a;Sinong Wang, Belinda Z. Li, Madian Khabsa, Han Fang, Hao Ma 时间&#…

Leetcode—1822.数组元素积的符号【简单】

2023每日刷题&#xff08;五十九&#xff09; Leetcode—1822.数组元素积的符号 实现代码 class Solution { public:int arraySign(vector<int>& nums) {int neg 0;for(int i 0; i < nums.size(); i) {if(nums[i] 0) {return 0;}if(nums[i] < 0) {neg;}}i…

机器人制作开源方案 | 智能助老机器人

作者&#xff1a;刘颖、王浩宇、党玉娟 单位&#xff1a;北京科技大学 指导老师&#xff1a;刘新洋、栗琳 1. 项目背景 1.1 行业背景 随着越来越多的服务机器人进入家庭&#xff0c;应用场景呈现多元化和专业化&#xff0c;机器人产业生态体系正在不断完善&#xff0c;服务…

亚马逊云科技发布企业生成式AI助手Amazon Q,助力企业迈向智能化时代

&#xff08;声明&#xff1a;本篇文章授权活动官方亚马逊云科技文章转发、改写权&#xff0c;包括不限于在 亚马逊云科技开发者社区、知乎、自媒体平台、第三方开发者媒体等亚马逊云科技官方渠道&#xff09; 一、前言 随着人工智能技术的快速发展和广泛应用&#xff0c;我们…