老九java线上_java应用监测(4)-线上问题排查套路
tags: java, troubleshooting, monitor
一句话概括:java应用线上问题如CPU过高,内存溢出,IO过高等问题如何排查,本文为你详细讲述。
1 引言
java应用上线运行后,免不了会有各种问题,总的来说问题会分为四大类:
(1)CPU相关问题
(2)内存相关问题
(3)磁盘及IO相关问题
(4)业务代码问题。
针对这些问题,线上如何进行监测与问题排查,是一个java开发人员的必要技能。下面将结合前面提到的java命令行工具,对这几个问题的排查套路进行说明。
2 CPU问题排查套路
如果发现系统变慢变卡,应用响应变慢,首先要查的就是CPU使用情况,一般是进程占用CPU过高,因此需要监测CPU的占用情况,而java应用中与CPU相关的主要是线程的运行,因此具体到java应用,需要监测线程的运行状态,对应就是命令行工具jstack。因此,总结CPU占用过高问题可按下面套路:
# (1) 查询CPU占用高的进程ID(PID)
top -c
# (2) 了解此进程的启动参数
ps -ef|grep PID
或者
jinfo -flags PID
# (3) 打印线程堆栈信息并输出文件
jstack -l PID > PID.dump
# (4) 根据进程查找线程ID(TID)
top -H -p PID
# (5) 获取TID的16进制数
printf "%x\n" TID
# (6) 结合TID和线程堆栈信息文件查找问题
- 可以使用文本工具直接查看
- 可以使用 grep TID -A20 PID.dump 来查看
- 需要配合线程状态来检查
关于jstack工具和线程状态可查看文章《java应用监测(3)-这些命令行工具你掌握了吗》
3 内存问题排查套路
内存问题主要是java应用在运行过程中发生OOM(out of memory),因此需要建议在java应用启动时,添加几个参数,包括-Xloggc:file -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=logs/heapdump.hprof -XX:ErrorFile=logs/java_error_%p.log。这样当发生oom时,可以从dump出来的文件来分析oom的原因。与内存问题相关的java命令行工具包括jmap,jstat,因此内存OOM问题排查套路如下:
# (1)找到java应用进程(PID)
jps -lvm
或者
top -c
# (2)了解此进程启动参数(特别是-Xms,-Xmx等)
ps -ef|grep PID
或者
jinfo -flags PID
# (3) 确认内存情况
jmap -heap PID
# (4) 查找占内存的大对象
jmap -histo:live PID
# (5) dump出堆文件,以便使用工具分析
jmap -dump:file=./heap.hprof PID
# (6) 查看GC变化情况,如下每秒打印一次
jstat -gc PID 1000
# (7) 结合日志文件出错信息及dump出来的堆文件分析OOM和GC情况
- 内存分配小,适当调整内存
- 对象被频繁创建,且不释放,优化代码
- young gc频率太高,查看-Xmn、-XX:SurvivorRatio等参数设置是否合理
关于OOM,官方文档有关于OOM的说明(https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/memleaks002.html), 主要分为以下几大类:
java.lang.OutOfMemoryError: Java heap space,堆的内存占用已经达到-Xmx设置的最大值,无法创建新对象,简单的可以考虑通过调整-Xmx参数来解决。
java.lang.OutOfMemoryError: GC Overhead limit exceeded,表示GC一直在执行且java进程运行很慢,通常会抛出此异常,java堆的分配的空间很小以至于新数据无法放到堆中。考虑调整堆大小,如果想关闭此输出,可用参数来关闭-XX:-UseGCOverheadLimit。
java.lang.OutOfMemoryError: Requested array size exceeds VM limit,java应用尝试分配大于堆大小的数组,如堆大小是256M,却要分配512M的数组,则会报错。考虑调整堆大小或者修改代码
java.lang.OutOfMemoryError: Metaspace,当类元数据所需的本机内存量超过时MaxMetaSpaceSize时报出,考虑调整MaxMetaSpaceSize。
java.lang.OutOfMemoryError: request size bytes for reason. Out of swap space?当来自本机堆的分配失败并且本机堆可能接近耗尽时会报此错误,需要查看日志来处理。
java.lang.OutOfMemoryError: Compressed class space,JVM的非堆结构中,类指针存放空间不足,考虑使用CompressedClassSpaceSize来调整。
java.lang.OutOfMemoryError: reason stack_trace_with_native_method,JVM的本地方法区不足,在Java本机接口(JNI)或本机方法中检测到分配失败,需要查找对应堆栈信息来查询。
4 磁盘及IO问题排查套路
java应用运行过程中,会涉及日志产生,对磁盘的读写等操作,也有可能有各种问题,如磁盘不足(日志输出过多)、、磁盘读写IO比较慢、IO过于频繁等。一般来说,可以按以下套路进行排查:
# (1) 查看磁盘容量情况
df -h
# (2) 查看文件大小和目录大小
ls -l 或者直接ll
du -h --max-depth=1
# (3) 查看IO情况,找到IO读写频繁的进程PID
iotop -d 1 # 1秒打印一次
或者
iostat -d -x -k 1 #1秒打印一次
# (4) 使用stack打印线程堆栈信息,排查IO相关代码
# (5) 有时候若想测试磁盘的读写速度(特别是虚拟机),可以使用dd
# 示例:测数据卷挂载目录的纯写速度
dd if=/dev/zero of=/数据卷目录/test.iso bs=8k count=1000000
5 业务问题排查套路
业务问题,主要是涉及到代码逻辑层面的,主要是查询日志输出,方法是否按正确的逻辑执行,因此一般的排查套路如下:
# (1) 实时日志输出查询
tail -fn 100 log_file
# (2) 根据日志输出的关键字来定位问题
grep keyWord log_file # 关键字所在行
grep -C n keyWord log_file # 关键字所在前后n行
# (3) 日志文件使用可视化文本工具分析(notepad++,sublime,大文件查看如EmEditor)
# (4) 使用线上工具直接检测方法的参数、返回值,异常情况等等,如Btrace,arthas等。
关于java线上问题的诊断工具包括Btrace及arthas,本系列后续会有相应的文章进行介绍。
6 总结
本文对java应用线上遇到的问题分为四大类,分别是(1)CPU相关问题,(2)内存相关问题,(3)磁盘及IO相关问题,(4)业务代码问题。针对各种问题,按照一定的套路,结合java的命令行工具和线上诊断工具,可以很方便地给java应用进行排查。希望本文给相应的java开发人员有帮助。
参考资料
Understand the OutOfMemoryError Exception:https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/memleaks002.html
这部技术葵花宝典真的很硬核:https://mp.weixin.qq.com/s/NJPXFMgbwXWkzVLDK12Gfg
目前最全的Java服务问题排查套路:https://mp.weixin.qq.com/s/SuFPeWxtjHdXAcu6hkmBlA
JDK工具参考文档:https://docs.oracle.com/javase/8/docs/technotes/tools/unix
示例代码地址:https://github.com/mianshenglee/my-example/tree/master/java-monitor-example
相关阅读
java应用监测(1)-java程序员应该知道的应用监测技术:https://my.oschina.net/mianshenglee/blog/3096882
java应用监测(2)-java命令的秘密:https://my.oschina.net/mianshenglee/blog/3097047
java应用监测(3)-这些命令行工具你掌握了吗:https://my.oschina.net/mianshenglee/blog/3097288
老九java线上_java应用监测(4)-线上问题排查套路相关推荐
- java标量替换_JAVA逃逸分析、栈上分配、标量替换、同步消除
一.逃逸分析 逃逸分析是编译语言中的一种优化分析,而不是一种优化的手段.通过对象的作用范围的分析,为其他优化手段提供分析数据从而进行优化. 逃逸分析包括: 全局变量赋值逃逸 方法返回值逃逸 实例引用发 ...
- java applet 缺陷_Java Applet在最新JRE上的奇怪性能行为(7.55)
我们使用来自签名提供商的一些专有小程序来签署一些 XML.当我们使用JRE 6u37 applet运行没有问题 – 运行速度非常快,从不冻结.但是当我们将JRE更新为7u55或更新时,它经常开始挂起. ...
- java struts2 上传图片_Java框架Struts2实现图片上传功能
Struts 2 框架为处理文件上传提供了内置支持,它使用"在 HTML 中基于表单的文件上传".当上传一个文件时,它通常会被存储在一个临时目录中,而且它们应该由 Action 类 ...
- java实验总结_Java实验总结——初学(上)
实验一 集合(一) [实验目的与要求] 1.了解Java集合类的概念: 2.掌握常用集合类的使用方法和技巧,并能应用到实际操作中. [实验内容] 1.请编写一个程序,要求如下:1)首先生成10个1至1 ...
- java自动填充_java 如何自动填充网页上的用户名和密码?
展开全部 java 自动填充网页上的用户名和密码有两种方法: 方法一.在input 标签里面的 value属性赋值即可,如32313133353236313431303231363533e78988e ...
- java内存 海子_Java并发编程:从根源上解析volatile关键字的实现
Java并发编程:volatile关键字解析 1.解析概览 内存模型的相关概念 并发编程中的三个概念 Java内存模型 深入剖析volatile关键字 使用volatile关键字的场景 2.内存模型的 ...
- java ftp文件大小_java如何获得ftp服务器上指定文件的大小
我想获得ftp服务器上指定文件的大小 以及下载过程中文件的已完成下载的大小 求教 这个是我写的方法 code:: public static boolean downLoadFtp(String ft ...
- java 循环练习_Java 循环 编程练习题(上)
1.奇偶个数 题目内容: 你的程序要读入一系列正整数数据,输入-1表示输入结束,-1本身不是输入的数据.程序输出读到的数据中的奇数和偶数的个数. 输入格式: 一系列正整数,整数的范围是(0,10000 ...
- 文件上传 java 进度条_Java如何实现动态显示文件上传进度条
本文实例实现文件上传的进度显示,我们先看看都有哪些问题我们要解决. 1 上传数据的处理进度跟踪 2 进度数据在用户页面的显示 就这么2个问题, 第一个问题,主要是组件的选择 必须支持数据处理侦听或通知 ...
最新文章
- 检查等高线矛盾lisp_检查点线矛盾
- 基于ATMEGA8的Arduino Nano(UNO)开发板
- python猜拳游戏三局两胜制_猜拳游戏三局两胜------java实现代码
- 如何自学python到做项目-如何使用python进行第一个机器学习项目(详细教程篇)...
- 也谈Javascript的效率,createElement和innerHTML,为innerHTML平反
- Skin Demo优化之一
- vue-cli2、vue-cli3脚手架详细讲解
- about window.onload
- Qt中多个动态创建的按钮同时绑定一个槽函数,判断被点击的是哪个按钮
- Shell 编程基础之 Case 练习
- python内置高阶函数求导_Python——函数式编程、高阶函数和内置函数,及
- netty应用场景_彻底搞懂 netty 线程模型
- css3 页面翻转效果.
- 文件与Base64的互转
- 2022最新:8种常用DNA甲基化测序技术,你知道几个?|易基因
- 随身WIFI刷入debian
- Windows远程连接Linux界面的两种方法
- Python 微信公众号文章爬取
- 介绍身份证号姓名实名认证 身份证号姓名校验 身份证号验人API
- SaaS 公司融资的「22条军规」