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)-线上问题排查套路相关推荐

  1. java标量替换_JAVA逃逸分析、栈上分配、标量替换、同步消除

    一.逃逸分析 逃逸分析是编译语言中的一种优化分析,而不是一种优化的手段.通过对象的作用范围的分析,为其他优化手段提供分析数据从而进行优化. 逃逸分析包括: 全局变量赋值逃逸 方法返回值逃逸 实例引用发 ...

  2. java applet 缺陷_Java Applet在最新JRE上的奇怪性能行为(7.55)

    我们使用来自签名提供商的一些专有小程序来签署一些 XML.当我们使用JRE 6u37 applet运行没有问题 – 运行速度非常快,从不冻结.但是当我们将JRE更新为7u55或更新时,它经常开始挂起. ...

  3. java struts2 上传图片_Java框架Struts2实现图片上传功能

    Struts 2 框架为处理文件上传提供了内置支持,它使用"在 HTML 中基于表单的文件上传".当上传一个文件时,它通常会被存储在一个临时目录中,而且它们应该由 Action 类 ...

  4. java实验总结_Java实验总结——初学(上)

    实验一 集合(一) [实验目的与要求] 1.了解Java集合类的概念: 2.掌握常用集合类的使用方法和技巧,并能应用到实际操作中. [实验内容] 1.请编写一个程序,要求如下:1)首先生成10个1至1 ...

  5. java自动填充_java 如何自动填充网页上的用户名和密码?

    展开全部 java 自动填充网页上的用户名和密码有两种方法: 方法一.在input 标签里面的 value属性赋值即可,如32313133353236313431303231363533e78988e ...

  6. java内存 海子_Java并发编程:从根源上解析volatile关键字的实现

    Java并发编程:volatile关键字解析 1.解析概览 内存模型的相关概念 并发编程中的三个概念 Java内存模型 深入剖析volatile关键字 使用volatile关键字的场景 2.内存模型的 ...

  7. java ftp文件大小_java如何获得ftp服务器上指定文件的大小

    我想获得ftp服务器上指定文件的大小 以及下载过程中文件的已完成下载的大小 求教 这个是我写的方法 code:: public static boolean downLoadFtp(String ft ...

  8. java 循环练习_Java 循环 编程练习题(上)

    1.奇偶个数 题目内容: 你的程序要读入一系列正整数数据,输入-1表示输入结束,-1本身不是输入的数据.程序输出读到的数据中的奇数和偶数的个数. 输入格式: 一系列正整数,整数的范围是(0,10000 ...

  9. 文件上传 java 进度条_Java如何实现动态显示文件上传进度条

    本文实例实现文件上传的进度显示,我们先看看都有哪些问题我们要解决. 1 上传数据的处理进度跟踪 2 进度数据在用户页面的显示 就这么2个问题, 第一个问题,主要是组件的选择 必须支持数据处理侦听或通知 ...

最新文章

  1. 检查等高线矛盾lisp_检查点线矛盾
  2. 基于ATMEGA8的Arduino Nano(UNO)开发板
  3. python猜拳游戏三局两胜制_猜拳游戏三局两胜------java实现代码
  4. 如何自学python到做项目-如何使用python进行第一个机器学习项目(详细教程篇)...
  5. 也谈Javascript的效率,createElement和innerHTML,为innerHTML平反
  6. Skin Demo优化之一
  7. vue-cli2、vue-cli3脚手架详细讲解
  8. about window.onload
  9. Qt中多个动态创建的按钮同时绑定一个槽函数,判断被点击的是哪个按钮
  10. Shell 编程基础之 Case 练习
  11. python内置高阶函数求导_Python——函数式编程、高阶函数和内置函数,及
  12. netty应用场景_彻底搞懂 netty 线程模型
  13. css3 页面翻转效果.
  14. 文件与Base64的互转
  15. 2022最新:8种常用DNA甲基化测序技术,你知道几个?|易基因
  16. 随身WIFI刷入debian
  17. Windows远程连接Linux界面的两种方法
  18. Python 微信公众号文章爬取
  19. 介绍身份证号姓名实名认证 身份证号姓名校验 身份证号验人API
  20. SaaS 公司融资的「22条军规」

热门文章

  1. Prettier Fomatter
  2. PHP 局部和全局变量
  3. linux alias命令路径,Linux alias命令
  4. Dlubal RFEM 5.25.02 x64 Multilingual
  5. 外呼系统可提供多种呼叫模式
  6. 【codevs2293】山海经 线段树
  7. 【深入浅出Spring原理及实战】「技术原理」Spring Security的核心功能和加载运行流程的原理分析
  8. letex中如何缩小页眉前面的留白
  9. 【SAP】复制-粘贴 小技巧
  10. 【新的开始,新的征程】