java怎么查问题,java线上问题排查(日志、资源、代码定位)
linux查询日志
在linux中可以使用head、tail等命令查看日志等文本文件,例如:
#显示文件前10行
head -n 10 catalina.out
#显示文件后10行
tail -n 10 catalina.out
#持续刷新
tail -f catalina.out
那么如果我们需要进行关键字查询,则需要使用grep命令;
grep后面有三个参数:A/B/C +数字;分别代表输出后N行、前N行、上下N行;
如果字符串中有空格或者特殊符号,如:”2020-03-30 14:57:24.301 INFO 4145 -“,则需要加上双引号:
grep -A 5 需要匹配的字符串 catalina.out
# 特殊符号
grep -A 5 "2020-03-30 14:57:24.301 INFO 4145 -" catalina.out
限制输出
如果查询的匹配项过多,而我们需要进行limit,则需要进行限制(-m参数):
#只获取前N个匹配项
grep -m 3 -A 10 需要查询的字符串 catalina.out
#只获取后N个匹配项,需要结合tac命令使用
tac catalina.out | grep -m 3 -A 10 需要查询的字符串
tac命令用于将文件以行为单位的反序输出,即第一行最后显示,最后一行先显示。
如果说只限制输出条数,可以结合head、tail命令使用:
grep -A 10 需要查询的字符串 catalina.out |head -n 100
grep -A 10 需要查询的字符串 catalina.out |tail -n 100
线程数查询
在web应用程序中,tomcat线程是一个需要关注的地方。
tomcat中Connector连接器负责创建请求和返回响应,默认只有200个并发(maxThread);当maxThread占满,线程会进行等待(等待线程数量acceptCount);如果超过这个数值,tomcat会放弃线程,并返回connection Refused 异常。
假设我们需要持续性的监控tomcat的线程数,可以按照以下流程:
# 查询PID
ps -ef|grep tomcat
# 根据Pid查询线程数
ps -Lf 找到的pid|wc -l
需要注意的是,tomcat线程并不能反映实际的连接情况,毕竟一个请求可能会运行多个子线程。
CPU占用以及代码定位
可以使用top或者htop查看CPU和内存消耗,htop命令更加直观和强大
# 更改刷新频率可以加d参数,单位-秒
top -d 1
# 单独查看进程加P参数
top -p PID
#根据ID查看进程详细信息
ps -aef|grep PID
假设一个java进程导致CPU飚高,我们需要根据top命令,通过进程ID找到那些高占用的线程。
这里主要关注CPU使用率以及线程执行时长两个因素。
#查询进程中的线,H参数要大写
top -p PID -H
找到对应的线程后,需要将10进制的线程ID转换为16进制,并进行搜索
#线程ID转换为16进制得到线程标记(注意是线程ID)
printf "%x\n" 线程ID
#jstack 查询(注意jstack -l后面是进程ID,grep -A 50 匹配后50条输出)
jstack -l 26068 |grep -A 50 65f3
通过查看代码,发现的确是写了个死循环
内存占用情况以及代码定位
一般情况下,如果内存消耗线性增长,则需要考虑是否存在泄露问题导致GC无法回收造成的。
top命令同样会显示内存消耗,可以使用-a参数,或者键盘大写按下M键进行排序。
配合jvm的小工具jmap命令,可以扫描堆中对象信息,定位内存高占用的原因。
#查看内存占用排序( -ab是根据内存正排序,-n 代表执行一次)
top -ab -n 1 |head -n 20
#jmap命令输出堆信息,histo:live输出状态是live的对象
jmap -histo:live PID |head -n 20
通过下面图片可以看到,JVM中有一个自定义的实体类有500W+个实例,这显然是有问题的。
以上只是简单的查看问题,此时需要通过dump heap快照并通过mat、jprofiler等工具进行更深层次的分析。
存储空间查看
主要使用df和du命令:
df 查看文件系统内部的 inode
du 查看文件和目录磁盘使用情况
linux文件都必须有一个inode,因此有可能发生inode已经用光但硬盘还未存满的情况;这时就无法在硬盘上创建新文件。
相关blog:文件和inode关系资料
查看inode空间占用
df -h
df -h 命令默认是当前目录,可以使用 df -h /usr/ 查看指定目录
第1列是代表文件系统对应的设备文件的路径名。
第2、3、4列分别表示总共、已用、可用空间。
第3、4列之和会略小于第二列,主要是系统保留少量空间给管理员使用;当普通用户的容量占用100%时,管理员还可以登录系统操作。
查看磁盘空间占用
统计文件夹磁盘占用
#查看整体空间占用
du -sh /usr/
#当前目录-各个文件夹占用
du --max-depth=1 -h
#指定目录-各个文件夹占用
du --max-depth=1 -h /usr/
#指定目录-各个文件夹占用-并排序
du --max-depth=1 /usr/ |sort -nr
du --max-depth=1 /usr/ |sort -nr |head -n 前N行
linux文件描述符(句柄)
句柄是windows中的概念,linux中主要指文件描述符。
句柄可以大致理解为:进程打开的文件的内存地址的引用。
在linux中,操作文件、创建socket连接(尤其注意通过http访问外部接口),都会占用句柄数。
每个进程所能占用的句柄数是有上限的,当进程打开文件、socket等超过了系统设置(或者是打开后未关闭),则会出现too many open files错误。
查看句柄数
linux对每个进程设置了允许最大操作的句柄数(默认1024);使用以下命令查看
ulimit -n
或者
more /proc/sys/fs/file-max
lsof命令
lsof即:list open files,常常用来查看进程打开了多少文件
统计进程使用的句柄总数
统计所有进程:
lsof -P -n |wc -l
查看所有进程打开的句柄数,并进行倒排序,取前十个
lsof -n|awk '{print $2}'|sort|uniq -c|sort -nr |head -n 10
第一列是句柄数,第二列是进程ID
统计单个进程句柄:
lsof -p PID |wc -l
查看进程详细信息
根据上面查看到的进程ID,可以查看其对应的应用程序
ps -aef|grep 进程ID
或者根据PID查看程序运行目录
ll /proc/进程ID/cwd
查看进程打开的文件
lsof -p 进程PID
或者搜索指定文件
lsof -p 进程PID |grep 文件名
结合docker使用
查看容器的PID:
docker ps
docker top 容器ID
再根据上面的统计单个进程句柄命令进行容器句柄统计:
lsof -p PID |wc -l
java怎么查问题,java线上问题排查(日志、资源、代码定位)相关推荐
- Java开发必须掌握的线上问题排查命令
作为一个合格的开发人员,不仅要能写得一手还代码,还有一项很重要的技能就是排查问题.这里提到的排查问题不仅仅是在coding的过程中debug等,还包括的就是线上问题的排查.由于在生产环境中,一般没办法 ...
- java基础巩固-宇宙第一AiYWM:为了维持生计,做项目经验之~SSM项目错误集锦Part3(项目蹦+pg数据库坏+100%-->线上故障排查经验【业务bug第一步一定是先看日志,写好日志】)~整起
项目中遇到的一个问题:项目忽然蹦了,用我们的域名登陆不上去了. 根据之前的经验,一般比如我们项目登不上去了或者数据库不上数据了(数据不更新),直接在Xshell上远程reboot一下,再重启一下tom ...
- Java线上问题排查思路及Linux常用问题分析命令学习
前言 之前线上有过一两次OOM的问题,但是每次定位问题都有点手足无措的感觉,刚好利用星期天,以测试环境为模版来学习一下Linux常用的几个排查问题的命令. 也可以帮助自己在以后的工作中快速的排查线上问 ...
- linux 内存溢出排查_记一次JAVA 线上故障排查完整套路
JAVA线上故障排查全套路 线上故障主要会包括cpu.磁盘.内存以及网络问题,而大多数故障可能会包含不止一个层面的问题,所以进行排查时候尽量四个方面依次排查一遍.同时例如jstack.jmap等工具也 ...
- Java 线上问题排查思路与工具使用
本文来自作者 蓬蒿 在 GitChat 上分享 「Java 线上问题排查思路与工具使用」,「阅读原文」查看交流实录. 「文末高能」 编辑 | 哈比 一.前言 Java 语言是当前互联网应用最为广泛的语 ...
- JAVA线上问题排查及常用命令
前言 线上问题排查是程序员绕不开路.线上故障主要会包括 CPU.磁盘.内存以及网络问题,而大多数故障可能会包含不止一个层面的问题,所以进行排查时候尽量四个方面依次排查一遍.同时例如 jstack.jm ...
- java河南口腔医疗机构线上服务系统计算机毕业设计MyBatis+系统+LW文档+源码+调试部署
java河南口腔医疗机构线上服务系统计算机毕业设计MyBatis+系统+LW文档+源码+调试部署 java河南口腔医疗机构线上服务系统计算机毕业设计MyBatis+系统+LW文档+源码+调试部署 本源 ...
- Java线上问题排查系列--后端接口响应慢的排查方法及解决方案
原文网址:Java线上问题排查系列--后端接口响应慢的排查方法及解决方案_IT利刃出鞘的博客-CSDN博客 简介 说明 本文介绍Java后端接口响应慢的排查的方法以及如何解决. 如何发现接口响应慢了? ...
- 【面试篇】Java自带的线上问题排查工具
[面试篇]Java自带的线上问题排查工具 (1)jps命令 来查看虚拟机进程状态工具 jps是Java提供的一个显示当前所有Java进程的pid的命令,适合查看当前Java进程的一些简单情况.类似于p ...
最新文章
- 【DocFX文档翻译】DocFX 入门 (Getting Started with DocFX)
- eplise怎么连接数据库_如何通过eclipse连接到mysql数据库
- 第一天开通博客,记录自己在编程道路上的点点滴滴
- c语言指针尚观嵌入式,C语言-指针
- dhcp服务器由谁维护,DHCP服务器管理维护的心得
- 整合axis2到web项目中
- Spark入门:也可以用Java创建轻量级的RESTful应用程序
- sequelize连接mysql_node.js通过Sequelize 连接MySQL
- 配置Tomcat使用HTTP/2
- Python_面向对象_zipfile和tarfile
- php 上传文件简单实例,php文件上传的简单实例
- opencv1-加载、修改、保存图像
- edwardcmh@cnblogs
- 免费资源下载:超酷超全的PSD按钮资源
- Python和C++的混合编程(使用Boost编写Python的扩展包)
- 剖析虚幻渲染体系(16)- 图形驱动的秘密
- 计算长方体、四棱锥的表面积和体积(Java)
- Kettle 常用的转换组件都在这里
- 【CSS】用CSS画太极图
- ubuntu18.04 texstudio下使用自动化学报latex模板的坑
热门文章
- MySQL自动化审核平台部署说明
- lvs,haproxy实现负载均衡
- dotfuscator初步
- mysql explain预估剖析
- 有关Activity的Launch mode 以及Intent的setFlags(转载)
- 安装VS2008错误解决
- 孤独的个人在社会中生存应掌握的基本健康技能(个人分析)
- 其中一个页签慢_房建工程全套技术交底,720页Word版表格,各分部分项全覆盖...
- 计算机考试辽宁2020,报名辽宁2020年9月计算机考试流程
- 模型需要对特征进行归一化吗_模型融合完全手册 - 套娃的艺术:将模型作为特征进行建模...