百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT知识 > 正文

资深的程序员都是这样排查Java问题的,附工具单

liuian 2024-12-14 13:33 49 浏览

摘要: 平时的工作中经常碰到很多疑难问题的处理,在解决问题的同时,有一些工具起到了相当大的作用,在此书写下来,一是作为笔记,可以让自己后续忘记了可快速翻阅,二是分享,希望看到此文的同学们可以拿出自己日常觉得帮助很大的工具,大家一起进步。

平时的工作中经常碰到很多疑难问题的处理,在解决问题的同时,有一些工具起到了相当大的作用,在此书写下来,一是作为笔记,可以让自己后续忘记了可快速翻阅,二是分享,希望看到此文的同学们可以拿出自己日常觉得帮助很大的工具,大家一起进步。

Linux命令类

tail

最常用的tail -f

grep

awk

1 基础命令

2 匹配

3 内建变量

NR:NR表示从awk开始执行后,按照记录分隔符读取的数据次数,默认的记录分隔符为换行符,因此默认的就是读取的数据行数,NR可以理解为Number of Record的缩写。

FNR:在awk处理多个输入文件的时候,在处理完第一个文件后,NR并不会从1开始,而是继续累加,因此就出现了FNR,每当处理一个新文件的时候,FNR就从1开始计数,FNR可以理解为File Number of Record。

NF: NF表示目前的记录被分割的字段的数目,NF可以理解为Number of Field。

find

pgm

批量查询vm-shopbase满足条件的日志

tsar

tsar是咱公司自己的采集工具。很好用, 将历史收集到的数据持久化在磁盘上,所以我们快速来查询历史的系统数据。当然实时的应用情况也是可以查询的啦。大部分机器上都有安装。

top

top除了看一些基本信息之外,剩下的就是配合来查询vm的各种问题了

获得线程10进制转16进制后jstack去抓看这个线程到底在干啥

其他

排查利器

btrace

首当其冲的要说的是btrace。真是生产环境&预发的排查问题大杀器。 简介什么的就不说了。直接上代码干

1.查看当前谁调用了ArrayList的add方法,同时只打印当前ArrayList的size大于500的线程调用栈

2.监控当前服务方法被调用时返回的值以及请求的参数

其他功能集团的一些工具或多或少都有,就不说了。感兴趣的请移步。

https://github.com/btraceio/btrace

注意:

1.经过观察,1.3.9的release输出不稳定,要多触发几次才能看到正确的结果

2.正则表达式匹配trace类时范围一定要控制,否则极有可能出现跑满CPU导致应用卡死的情况

3.由于是字节码注入的原理,想要应用恢复到正常情况,需要重启应用。

Greys

Greys是@杜琨的大作吧。说几个挺棒的功能(部分功能和btrace重合):

sc -df xxx: 输出当前类的详情,包括源码位置和classloader结构

trace class method: 相当喜欢这个功能! 很早前可以早JProfiler看到这个功能。打印出当前方法调用的耗时情况,细分到每个方法。对排查方法性能时很有帮助,比如我之前这篇就是使用了trace命令来的:http://www.atatech.org/articles/52947。

其他功能部分和btrace重合,可以选用,感兴趣的请移步。

http://www.atatech.org/articles/26247

另外相关联的是arthas,他是基于Greys的,感兴趣的再移步http://mw.alibaba-inc.com/products/arthas/docs/middleware-container/arthas.wiki/home.html?spm=a1z9z.8109794.header.32.1lsoMc

javOSize

就说一个功能

classes:通过修改了字节码,改变了类的内容,即时生效。 所以可以做到快速的在某个地方打个日志看看输出,缺点是对代码的侵入性太大。但是如果自己知道自己在干嘛,的确是不错的玩意儿。

其他功能Greys和btrace都能很轻易做的到,不说了。

可以看看我之前写的一篇javOSize的简介http://www.atatech.org/articles/38546

官网请移步http://www.javosize.com/

JProfiler

之前判断许多问题要通过JProfiler,但是现在Greys和btrace基本都能搞定了。再加上出问题的基本上都是生产环境(网络隔离),所以基本不怎么使用了,但是还是要标记一下。

官网请移步https://www.ej-technologies.com/products/jprofiler/overview.html

大杀器

eclipseMAT

可作为eclipse的插件,也可作为单独的程序打开。

详情请移步http://www.eclipse.org/mat/

zprofiler

集团内的开发应该是无人不知无人不晓了。简而言之一句话:有了zprofiler还要mat干嘛

详情请移步zprofiler.alibaba-inc.com

java三板斧,噢不对,是七把

jps

我只用一条命令:

jstack

普通用法:

native+java栈:

jinfo

可看系统启动的参数,如下

jmap

两个用途

1.查看堆的情况

2.dump

或者

3.看看堆都被谁占了? 再配合zprofiler和btrace,排查问题简直是如虎添翼

jstat

jstat参数众多,但是使用一个就够了

jdb

时至今日,jdb也是经常使用的。

jdb可以用来预发debug,假设你预发的java_home是/opt/taobao/java/,远程调试端口是8000.那么

sudo -u admin /opt/taobao/java/bin/jdb -attach 8000.

出现以上代表jdb启动成功。后续可以进行设置断点进行调试。

具体参数可见oracle官方说明http://docs.oracle.com/javase/7/docs/technotes/tools/windows/jdb.html

CHLSDB

CHLSDB感觉很多情况下可以看到更好玩的东西,不详细叙述了。 查询资料听说jstack和jmap等工具就是基于它的。

更详细的可见R大此贴

http://rednaxelafx.iteye.com/blog/1847971

plugin of intellij idea

key promoter

快捷键一次你记不住,多来几次你总能记住了吧?

maven helper

分析maven依赖的好帮手。

VM options

1.你的类到底是从哪个文件加载进来的?

2.应用挂了输出dump文件


jar包冲突

把这个单独写个大标题不过分吧?每个人或多或少都处理过这种烦人的case。我特么下边这么多方案不信就搞不定你?

mvn dependency:tree > ~/dependency.txt

打出所有依赖

mvn dependency:tree -Dverbose -Dincludes=groupId:artifactId

只打出指定groupId和artifactId的依赖关系

-XX:+TraceClassLoading

vm启动脚本加入。在tomcat启动脚本中可见加载类的详细信息

-verbose

vm启动脚本加入。在tomcat启动脚本中可见加载类的详细信息

greys:sc

greys的sc命令也能清晰的看到当前类是从哪里加载过来的

tomcat-classloader-locate

通过以下url可以获知当前类是从哪里加载的

curl http://localhost:8006/classloader/locate?class=org.apache.xerces.xs.XSObject

ALI-TOMCAT带给我们的惊喜(感谢@务观)

列出容器加载的jar列表

curl http://localhost:8006/classloader/jars

列出当前当当前类加载的实际jar包位置,解决类冲突时有用

curl http://localhost:8006/classloader/locate?class=org.apache.xerces.xs.XSObject

其他

gpref

http://www.atatech.org/articles/33317

dmesg

如果发现自己的java进程悄无声息的消失了,几乎没有留下任何线索,那么dmesg一发,很有可能有你想要的。

去找关键字oom_killer。找到的结果类似如下:

以上表明,对应的java进程被系统的OOM Killer给干掉了,得分为854.

解释一下OOM killer(Out-Of-Memory killer),该机制会监控机器的内存资源消耗。当机器内存耗尽前,该机制会扫描所有的进程(按照一定规则计算,内存占用,时间等),挑选出得分最高的进程,然后杀死,从而保护机器。

dmesg日志时间转换公式:

log实际时间=格林威治1970-01-01+(当前时间秒数-系统启动至今的秒数+dmesg打印的log时间)秒数:

剩下的,就是看看为什么内存这么大,触发了OOM-Killer了。

相关推荐

如何使用 Crontab 在 Linux 中安排 Cron 作业?

在Linux世界中,自动化运维和任务调度是提升效率的核心技能之一。而说到定时任务调度,「Cron」几乎是无人不知的标配工具。你可以用它按分钟、小时、天、周甚至月的粒度去执行脚本、备份、监控、同步...

迅雷发布下载MCP服务:一句话让AI自动找资源并下载

IT之家6月26日消息,迅雷今日发布下载MCP服务,号称“一句话即可让AI自动帮您下载”,该项服务同时支持PC版迅雷和NAS迅雷,现所有用户均可免费使用。目前迅雷MCP支持...

Linux学习大总结(纯干货)-ubuntu的安装与Linux基础操作

一、Linux简介Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的UNIX工...

连载嵌入式Linux开发教程:初始Ubuntu

2.5创建和配置虚拟机2.5.1创建虚拟机双击桌面的VMwarePlayer启动快捷方式打开VMwarePlayer软件,运行界面如图2.15所示。点击“创建新虚拟机(N)”,可以创建一台虚拟机...

解决ubuntu关机后自动重启的问题(ubuntu 关机没反应)

1.打开/etc/apt/sources.list,把里面的所有源删除,怕有风险的话先backup;2.然后进入软件与更新,重新选择源和serverthenapt-getupdate。注:我也不...

Ubuntu 24.04设置自动登录(ubuntu设置root自动登陆)

在Ubuntu24.04中设置自动登录,可以通过修改GDM(GNOMEDisplayManager)的配置文件来实现。一、修改GDM配置文件1、打开终端:通过快捷键Ctrl+Alt+T打...

docker-compose备份数据库,在crontab定时任务中不生效解决方法

问题:数据库为PostgreSQL。由于数据库是用docker-compose运行,所以直接用docker-compose命令直接备份。测试终端直接运行备份没问题,将命令添加到crontab定时任务...

crontab定时任务执行时间与系统时间不一致解决方法

Ubuntucrontab定时任务执行时间与系统时间不一致(时区差)查看时间>#ll/etc/localtimelrwxrwxrwx1rootroot35Aug508:56...

如何在 Ubuntu 命令行中使用 Wireshark 进行抓包?

Wireshark是一个开源的网络协议分析工具,因其强大的抓包和分析功能而闻名。无论是调试网络问题、监控流量,还是进行安全审计,它都能派上用场。通常,我们会在带有图形界面的系统中,通过Wires...

Ubuntu 操作系统常用命令详解(ubuntu简单的命令)

UbuntuLinux是一款流行的开源操作系统,广泛应用于服务器、开发、学习等场景。命令行是Ubuntu的灵魂,也是高效、稳定管理系统的利器。本文按照各大常用领域,详细总结Ubuntu必学...

Linux系统如何设置开机自动运行脚本?

大家好,我是良许。在工作中,我们经常有个需求,那就是在系统启动之后,自动启动某个脚本或服务。在Windows下,我们有很多方法可以设置开机启动,但在Linux系统下我们需要如何操作呢?Linu...

【案例】Linux(Ubuntu)定时删除3天前文件夹

我公司有个OCR上传图片系统,每天会生成一个类似2025-05-10的文件夹,为了运维方便和硬盘空间的使用,我需要每天去删除之前的旧文件夹,比较麻烦。借助了Deepseek的帮助,将内容分享一下并给自...

解放你的双手,ubuntu定时自动备份MySQL数据库,亲测有效

1、新建一个文件夹存放备份的数据文件,根据个人需要放在合适的位置mkdir/home/cms_mysqlbackup2、创建脚本文件,我放在home文件夹了,命名为autobackup.shcd...

Linux 如何每 5、10、15 或 30 分钟运行一次 Cron 作业?

在Linux系统中,Cron是一个强大的工具,用于自动化重复性任务。通过合理配置Cron,用户可以轻松实现每5分钟、10分钟、15分钟或30分钟运行一次的定时任务。本文将深入探讨如...

运维实战:深度拆解Systemd定时任务原理,90%的人不知道的玩法

运维实战:深度拆解Systemd定时任务原理,90%的人不知道的高效玩法一、Systemd定时任务的核心原理Systemd定时任务是Linux系统中替代传统cron的现代化解决方案,通过...