Linux上快速定位Java代码问题行

news2024/12/23 19:16:56

生产环境中,经常会遇到CPU持续飙高或内存、IO飙高,如何快速定位问题点是很多新手头疼的问题,只能通过经验和代码推理,其实这里针对Java程序可以通过top和jstack命令,快速定位到问题代码。

Top命令的输出

具体定位之前,先补全一下top命令的输出解释,top 命令的输出是动态更新的,通常每3秒刷新一次,但这个刷新频率可以通过交互命令 d 来调整。看一个top命令的输出样例:

top - 16:45:26 up 5 days,  3:12,  1 user,  load average: 0.00, 0.01, 0.05
Tasks: 239 total,   1 running, 238 sleeping,   0 stopped,   0 zombie
%Cpu(s):  1.0 us,  0.6 sy,  0.0 ni, 98.4 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  16280104 total,  10346652 free,   2689256 used,   3256196 buff/cache
KiB Swap:   2097148 total,   2097148 free,        0 used.   7256332 avail Mem

  PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND      
 1234 user1     20   0 12345672 1048576  524288 S  0.7  6.4   2:34.16 java     
    1 root      20   0       0      0      0 S  0.0  0.0   0:03.16 init      
   72 www-data  20   0  344736   8192   7168 S  0.3  0.1   0:01.93 apache2     

top 命令的输出分为两部分:顶部的系统概览和底部的进程列表。

顶部的系统概览

  • 任务:显示系统中的进程总数,以及运行(R)、休眠(S)、停止(T)、僵尸(Z)状态的进程数量。
  • %Cpu(s):CPU使用率的百分比,通常分为用户空间(us)、系统空间(sy)、空闲(id)、等待I/O(wa)和其他(hi、si、st)。
  • KiB Mem:系统内存的使用情况,包括已使用(used)、空闲(free)、缓存(buffers/cached)和可用内存(available)。
  • KiB Swap:交换空间的使用情况,包括已使用(used)和空闲(free)。
  • 时间:显示当前时间、系统运行时间、平均负载(1分钟、5分钟、15分钟)。

底部的进程列表

  • PID:进程ID。
  • USER:进程所有者的用户名称。
  • PR:进程的优先级(数值越小,优先级越高)。
  • NI:进程的nice值(影响进程的优先级)。
  • VIRT:虚拟内存的大小,单位通常是KiB。
  • RES:常驻内存的大小,即进程实际占用的物理内存,单位通常是KiB。
  • SHR:共享内存的大小,单位通常是KiB。
  • S:进程的状态,如休眠(S)、运行(R)、停止(T)等。
  • %CPU:进程占用的CPU使用率百分比。
  • %MEM:进程占用的内存使用率百分比。
  • TIME+:进程占用CPU的总时间。
  • COMMAND:启动进程的命令名称或命令行。

在这个示例中,系统已经运行了5天3小时12分钟,平均负载在过去1分钟是0.00,过去5分钟是0.01,过去15分钟是0.05。CPU使用情况显示1%的用户空间使用率和0.6%的系统空间使用率,其余为空闲。内存方面,总共有16280104KiB的内存,其中10346652KiB是空闲的,2689256KiB被使用,3256196KiB作为缓存或缓冲。交换空间总共有2097148KiB,全部空闲。

进程列表显示了PID为1234的进程占用了较多的CPU和内存资源,它是以用户 user1 运行的,它是一个Java程序。

快读定位源代码步骤

通过top可以快速定位到资源利用异常的进程程序,这时候,如果是我们开发的Java程序占用较高的资源,但是又无法确认是具体哪一部分占用时,则可以通过 top命令和jstack进行具体代码的定位。思路如下:

首先,使用Top命令,发现存在问题的进程:

top - 10:05:00 up 3 days,  5:25,  1 user,  load average: 0.10, 0.15, 0.20
Tasks: 242 total,   2 running, 240 sleeping,   0 stopped,   0 zombie
%Cpu(s):  5.0 us,  1.0 sy,  0.0 ni, 94.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem : 16384M total,  8192M used,   8192M free,   2048M buff/cache
KiB Swap:  4096M total,     0M used,  4096M free.   4096M avail Mem 

 PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM   TIME+ COMMAND      
23456 root     20   0 21G 15G  1024K S  0.5 91.5   1:50.01 java 
73455 root     20   0 0.2G 0.1G  1024K S  0.5 91.5   00:34.01 mysqld
11234 root     20   0 0.1G 0.15G 1024K S  0.5 91.5   1:45.03 sh

在这个例子中,PID为23456的 Java 进程使用了超过15GB的物理内存,并且占用了91.5%的内存资源。这可能意味着它正在消耗大量内存,可能会导致内存泄漏或其他内存使用问题。 

使用Top查看进程里的线程

获得了具体的问题进程后,通过 top -Hp [PID] 来查看其内部线程

top -Hp 23456

top - 10:15:00 up 3 days,  5:35,  1 user,  load average: 0.50, 0.40, 0.30
Tasks: 500 total,   2 running, 498 sleeping,   0 stopped,   0 zombie
%Cpu(s): 10.0 us,  2.0 sy,  0.0 ni, 88.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem : 16384M total,  9000M used,  7384M free,   2048M buff/cache
KiB Swap:  4096M total,     0M used,  4096M free.   7384M avail Mem

  PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND      
 23457 root     20   0 21G 15G 1024K S  5.0 91.5   1:50.01 java        
 23457 root     20   0  4G 3.5G  8192K R 10.0  2.1   0:05.20 java        
 23458 root     20   0  4G 3.5G  8192K S  3.0  2.1   0:04.30 java        
 23459 root     20   0  4G 3.5G  8192K S  2.0  2.1   0:03.40 java        

将线程ID转为16进制

找到对应异常的线程,使用16进制转换命令 printf "0x%x" [线程ID],获取其线程16进制编码

[root@10]# printf "0x%x" 23457
0x5ba1[root@10]#

jstack跟踪堆栈定位代码

拿到了线程16进制编码,则通过java工具内置的jstack命令进行代码定位:

jstack [PID] | grep [线程16进制编码] -A 5

# 数字5表示输出栈顶最前几行代码

jstack 23456 | grep 0x5ba1 -A 5

"Thread-3" #23458 prio=5 os_prio=31 cpu=33.42ms elapsed=6.25s tid=0x5BEA runnable
   java.lang.Thread.State: RUNNABLE
        at java.util.HashMap.get(HashMap.java:628)
        at com.example.MyApplication.doSomething(MyApplication.java:42)
        at com.example.MyApplication.access$000(MyApplication.java:18)
        at com.example.MyApplication$1.run(MyApplication.java:77)
        at java.lang.Thread.run(Thread.java:748)

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

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

相关文章

ubuntu20.04配置调试工具

1.准备工作&#xff1a;安装g或者gdb sudo apt updatesudo apt install gg --versionsudo apt install gdbgdb --version 2.配置环境 2.1在本地新建一个main.cpp #include <iostream> #include <vector> #include <string>using namespace std;int main(…

【HarmonyOS4学习笔记】《HarmonyOS4+NEXT星河版入门到企业级实战教程》课程学习笔记(二十一)

课程地址&#xff1a; 黑马程序员HarmonyOS4NEXT星河版入门到企业级实战教程&#xff0c;一套精通鸿蒙应用开发 &#xff08;本篇笔记对应课程第 31 节&#xff09; P31《30.数据持久化-关系型数据库》 上一节中学习了使用用户首选项的方式实现数据持久化&#xff0c;但用户首…

DC/AC电源模块:效率与可靠性兼备的能源转换解决方案

BOSHIDA DC/AC电源模块&#xff1a;效率与可靠性兼备的能源转换解决方案 随着科技的迅速发展和人工智能技术的逐渐成熟&#xff0c;各种电子设备的需求也日益增加。然而&#xff0c;这些设备往往需要不同的电压和电流来正常工作&#xff0c;而供电方式却可能不尽相同。这时&am…

miniprogram-to-uniapp-微信小程序转换成uniapp项目

文章目录 参考:miniprogram-to-uniapp使用指南第一步第二步第三步第四步【miniprogram-to-uniapp】转换微信小程序”项目为uni-app项目(新版本工具已经支持各种小程序转换) 参考: 小程序技能树 uni-app基础知识总结 miniprogram-to-uniapp使用指南 第一步 win + R 输入…

【计算机网络仿真】b站湖科大教书匠思科Packet Tracer——实验15 网络故障导致的路由环路问题

一、实验目的 1.验证因网络故障而导致的静态路由的路由环路问题&#xff1b; 二、实验要求 1.使用Cisco Packet Tracer仿真平台&#xff1b; 2.观看B站湖科大教书匠仿真实验视频&#xff0c;完成对应实验。 三、实验内容 1.构建网络拓扑&#xff1b; 2.验证网络故障导致的…

Stable Diffusion图像的脸部细节控制——采样器全解析

文章目录 艺术地掌控人物形象好易智算原因分析为什么在使用Stable Diffusion生成全身图像时&#xff0c;脸部细节往往不够精细&#xff1f; 解决策略 局部重绘采样器总结 艺术地掌控人物形象 在运用Stable Diffusion这一功能强大的AI绘图工具时&#xff0c;我们往往会发现自己…

web学习笔记(七十五)

目录 1.小程序修改响应式数据 1.1修改基本数据类型的值 1.2修改复合数据类型的值 2. 发送请求 3.小程序解决跨域问题 1.小程序修改响应式数据 1.1修改基本数据类型的值 在小程序中需要先将data中的数据拿过来并结构&#xff0c;才可以在this.setdata中修改数据&#xf…

充分利用智慧校园人事系统,提升党政职务管理

智慧校园人事系统中的党政职务管理功能&#xff0c;是专为高校及教育机构设计的&#xff0c;旨在高效、精确地处理与党政职务相关的各类事务&#xff0c;包括职务任命、任期管理、职责分配、考核评估等&#xff0c;以信息化手段促进党务及行政工作的透明化、规范化。 该模块首先…

14-5 小语言模型SLM 百科全书

想象一下这样一个世界&#xff1a;智能助手不再驻留在云端&#xff0c;而是驻留在你的手机上&#xff0c;无缝理解你的需求并以闪电般的速度做出响应。这不是科幻小说&#xff1b;这是小型语言模型 (SLM) 的前景&#xff0c;这是一个快速发展的领域&#xff0c;有可能改变我们与…

转让北京文化传媒公司带营业性演出经纪许可证

影视文化传播倡导将健康的影视文化有效传播给观众&#xff0c;从而构建观众与电影制作者的良 性沟通与互动&#xff0c;是沟通电影制作者与电影受众的重要桥梁。影视文化泛指以电影&#xff0c;电视方式所进行的全部文化创造&#xff0c;即体现为电影&#xff0c;电视全部的存在…

探索企业知识边界,鸿翼ECM AI助手开启智慧问答新时代

在信息化迅速发展的当下&#xff0c;企业积累的数字文档数量巨大&#xff0c;这些文档中蕴含的深层信息对业务发展至关重要。然而&#xff0c;传统的搜索技术常常因只能进行关键字查询而无法满足对文档深层次理解的需求。 据Gartner调查&#xff0c;高达47%的员工在寻找有效工…

制造企业真的需要数字化转型吗?一文讲透:为何做,如何做?

此前拜访了不少制造企业&#xff0c;其以中小型企业居多&#xff0c;在与企业负责人交流数字化转型话题时&#xff0c;感触最多的还是管理者对“数字化转型”的认知。 在数字化转型方面从国家层面到地方政府进行大量的宣传与政策支持&#xff0c;部分行业头部企业也从数字化转…

AI免费英语学习在线工具:Pi;gpt;其他大模型AI 英语学习智能体工具

1、pi(强烈推荐&#xff1a;可以安卓下载使用) https://pi.ai/talk &#xff08;网络国内使用方便&#xff09; 支持实时聊天与语音对话 2、chatgpt&#xff08;强烈推荐&#xff1a;可以安卓下载使用) https://chat.openai.com/ &#xff08;网络国内使用不方便&#xf…

贪心 | Java | LeetCode 455, 376, 53 做题总结

贪心算法介绍 贪心算法&#xff1a;贪心的本质是选择每一阶段的局部最优&#xff0c;从而达到全局最优。 说实话贪心算法并没有固定的套路。 一般解题步骤 贪心算法一般分为如下四步&#xff1a; ① 将问题分解为若干个子问题 ② 找出适合的贪心策略 ③ 求解每一个子问题的…

vue2+element-ui新增编辑表格+删除行

实现效果&#xff1a; 代码实现 &#xff1a; <el-table :data"dataForm.updateData"border:header-cell-style"{text-align:center}":cell-style"{text-align:center}"><el-table-column label"选项字段"align"center&…

【全网最全流程+所有代码】企业微信回调联调,开通企微回调和收到企微回调

流程图: 只是这里的消息回调,仅作为提示,群内有消息了。不是具体的消息,而是类似这样的结构,: 如果需要获取消息,还需要拉取企微群内消息方法,这个后续再更新。 好了,我们开始吧。 开启消息回调和接收消息回调,地址是一样的,只是 开启消息回调,get请求, 接受消…

【图像分割】mask2former:通用的图像分割模型详解

最近看到几个项目都用mask2former做图像分割&#xff0c;虽然是1年前的论文&#xff0c;但是其attention的设计还是很有借鉴意义&#xff0c;同时&#xff0c;mask2former参考了detr的query设计&#xff0c;实现了语义和实例分割任务的统一。 1.背景 1.1 detr简介 detr算是第…

Build a Large Language Model (From Scratch)附录A(gpt-4o翻译版)

来源&#xff1a;https://github.com/rasbt/LLMs-from-scratch?tabreadme-ov-file https://www.manning.com/books/build-a-large-language-model-from-scratch

GBU2510-ASEMI储能专用整流桥GBU2510

编辑&#xff1a;ll GBU2510-ASEMI储能专用整流桥GBU2510 型号&#xff1a;GBU2510 品牌&#xff1a;ASEMI 封装&#xff1a;GBU-4 正向电流&#xff08;Id&#xff09;&#xff1a;25A 反向耐压&#xff08;VRRM&#xff09;&#xff1a;1000V 正向浪涌电流&#xff1a…