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

生产环境中,经常会遇到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 MemPID 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 23456top - 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 MemPID 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 runnablejava.lang.Thread.State: RUNNABLEat 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.mzph.cn/web/39712.shtml

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

相关文章

虚拟机与主机的联通

本地光纤分配地址给路由器--》连结路由器是连结局域网--》由路由器分配IP地址 因此在网站上搜索的IP与本机的IP是不一样的 1.windows查看主机IP地址 在终端输入 2.linux虚拟机查看ip 3.主机是否联通虚拟机ping加ip

Hadoop页面报错Permission denied: user=dr.who, access....

1、临时解决 hdfs dfs -chmod -R 777 /这种方法,存在一个不足,就是后面重新创建的文件夹,页面进行删除的时候,依然报这个错。 但是,对于应付紧急客户需求,可以临时用一下。 2、永久解决 查看页面的Owner…

为什么使用StartAI文生图进行AI绘画?

什么是文生图? 文生图是AIGC中一种先进的图像生成技术,它能够根据用户输入的文字描述,智能地生成相应的图像。无论是抽象的概念,还是具体的物体,文生图都能够以惊人的准确性和艺术性呈现出来。 StartAI文生图如何进行…

7 动态规划

下面的例子不错: 对于动态规划,能学到不少东西; 你要清楚每一步都在做什么,划分细致就能够拆解清楚! xk. - 力扣(LeetCode) labuladong的算法笔记-动态规划-CSDN博客 动态规划是一种强大的算法…

Rethinking Federated Learning with Domain Shift: A Prototype View

CVPR2023,针对分布式数据来自不同的域时,私有模型在其他域上表现出退化性能(具有域转移)的问题。提出用于域转移下联邦学习的联邦原型学习(FPL)。核心思想是构建集群原型和无偏原型,提供富有成效的领域知识和公平的收敛目标。将样本嵌入拉近到属于相同语义的集群原型,而…

@react-google-maps/api实现谷歌地图嵌入React项目中,并且做到点击地图任意一处,获得它的经纬度

1.第一步要加入项目package.json中或者直接yarn install它都可以 "react-google-maps/api": "^2.19.3",2.加入项目中 import AMapLoader from amap/amap-jsapi-loader;import React, { PureComponent } from react; import { GoogleMap, LoadScript, Mar…

【有哪些GPU算力租用平台值得推荐】

🌈个人主页: 程序员不想敲代码啊 🏆CSDN优质创作者,CSDN实力新星,CSDN博客专家 👍点赞⭐评论⭐收藏 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共…

徒手绘制 Android 通用进度条

拖动条&#xff08;FlexSeekBar&#xff09;&#xff0c;在Android的各个地方都非常常用&#xff0c;本文旨在自研一套通用的进度条&#xff0c;非常适合车载App使用 样式如下&#xff1a; 使用示例 <!--默认用法--> <com.max.android.ui.seekbar.FlexSeekBarandroi…

【test】小爱同学通过esp32控制电脑开关

文章目录 一、环境准备二、开关机原理数据传输框架 三、环境搭建1.巴法云平台设置2.米家设置3.windows网络唤醒设置4.搭建esp32开发环境并部署&#xff08;1&#xff09;新建项目&#xff08;2&#xff09;导入esp32库&#xff08;3&#xff09; 添加库&#xff08;4&#xff0…

fluwx插件实现微信支付

Flutter开发使用fluwx插件实现微信支付&#xff0c;代码量不多&#xff0c;复杂的是安卓和iOS的各种配置。 在 pubspec.yaml 文件中添加fluwx依赖 fluwx: ^4.5.5 使用方法 通过fluwx注册微信Api await Fluwx().registerApi(appId: wxea7a1c53d9e5849d, universalLink: htt…

基于SpringBoot的大学生租房系统

该系统主要实现了用户和房主通过系统注册用户&#xff0c;登录系统后能够编辑自己的个人信息、查看首页&#xff0c;房屋信息&#xff0c;房屋评价&#xff0c;公告资讯&#xff0c;个人中心&#xff0c;后台管理&#xff0c;意见反馈等&#xff0c;还可以对后台进行操作&#…

2024年显著性检测部分论文及代码汇总(3)

ICML Size-invariance Matters: Rethinking Metrics and Losses for Imbalanced Multi-object Salient Object Detection code Abstacrt&#xff1a;本文探讨了显著性检测中评价指标的尺寸不变性&#xff0c;尤其是当图像中存在多个大小不同的目标时。作者观察到&#xff0c;…

双指针算法:快速排序模拟实现

目录 1.思路解析 2&#xff1a;代码展示 1.思路解析 使用双指针pre和cur 指针cur用于检测符合条件的数据 cur和pre数据发生交换用于将符合条件的数据&#xff08;比key小&#xff09;向左扔 一轮循环结束时&#xff0c;以pre为分界点&#xff0c;除去key&#xff0c;pre左边的…

物联网IOT,讲的什么?

想象一下,当你早晨醒来,智能咖啡机已经根据你的习惯准备好了香浓的咖啡;家中的温度自动调节至最舒适的状态;出门前,智能冰箱提醒你哪些食材需要补充……这些场景不再是科幻电影里的虚构,而是物联网技术为我们带来的现实便利。 物联网的概念与起源 物联网,顾名思义,是指…

1.HI3559AV100 官方开发板sample运行

1.内核、文件系统部分 有关uboot&#xff0c;kernel&#xff0c;rootfs部分就不赘述&#xff0c;直接在SDK提供的镜像文件进行烧录即可。2.编译MPP下的sample运行 实验前准备&#xff1a;通过NFS方式挂载到开发板与主机通信传输文件 驱动和库的部署&#xff1a;把MPP目录下的…

单例模式详解:概念与实用技巧

目录 单例模式单例模式结构单例模式适用场景单例模式优缺点练手题目题目描述输入描述输出描述输入示例输出示例提示信息题解 单例模式 单例模式是一种创建型设计模式&#xff0c; 让你能够保证一个类只有一个实例&#xff0c; 并提供一个访问该实例的全局节点。 只有一个实例的…

震惊!运气竟能如此放大!运气的惊人作用,你了解吗?

芒格&#xff1a;得到你想要的东西&#xff0c;最保险的办法&#xff0c;就是让自己配得上你想要的那个东西。今天仔细想了想这句话&#xff0c;他其实说的是无数成功人士的心声 —— “我配得上&#xff01;” 美剧《绝命毒师》有个导演叫文斯吉里根&#xff08;Vince Gilliga…

大疆2025校招内推

需要内推码的请留言哦 期待你的加入

windows@资源管理器中的地址栏@访问共享文件夹的各种方法@管理共享文件夹

文章目录 资源管理器中的地址栏可以访问什么访问共享文件夹&#x1f47a;UNC路径资源管理器打开共享文件夹纯命令行方式访问共享文件夹 共享文件夹相关操作查看所有已经共享的文件夹&#x1f47a;停止某个文件的共享 共享文件夹的访问控制补充匿名访问问题&#x1f60a;强制启用…

吴恩达深度学习笔记:机器学习策略(2)(ML Strategy (2)) 2.5-2.6

目录 第三门课 结构化机器学习项目&#xff08;Structuring Machine Learning Projects&#xff09;第二周&#xff1a;机器学习策略&#xff08;2&#xff09;(ML Strategy (2))2.5 数据分布不匹配时的偏差与方差的分析&#xff08;Bias and Variance with mismatched data di…