geektime专栏《linux性能优化实战》笔记

一、Linux问题排查命令

uptime

top

free

vmstat

iostat

ifstat

二、Sun JDK自带工具

jps(虚拟机进程状况工具)

[peng@manjaro java]$ jps -l
SynAddRunnable
sun.tools.jps.Jps
[peng@manjaro ~]$ jps -l
sun.tools.jps.Jps
[peng@manjaro ~]$ jps -v
Jps -Denv.class.path=.:/opt/jdk1..0_212lib:/opt/jdk1..0_212/jre/lib -Dapplication.home=/opt/jdk1..0_212 -Xms8m

jstat(虚拟机统计信息工具)

该工具比较常用,可以查看GC 的详细信息,比如eden ,from,to,old 等区域的内存使用情况。

例如,查询虚拟机的运行状态信息,每隔1000ms,总共5次。

[peng@manjaro ~]$ jstat -gc
S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT
5120.0 5120.0 0.0 352.0 31744.0 21905.2 84992.0 8.0 4864.0 2467.5 512.0 264.6 0.001 0.000 0.001
5120.0 5120.0 0.0 352.0 31744.0 21905.2 84992.0 8.0 4864.0 2467.5 512.0 264.6 0.001 0.000 0.001
5120.0 5120.0 0.0 352.0 31744.0 21905.2 84992.0 8.0 4864.0 2467.5 512.0 264.6 0.001 0.000 0.001
5120.0 5120.0 0.0 352.0 31744.0 21905.2 84992.0 8.0 4864.0 2467.5 512.0 264.6 0.001 0.000 0.001
5120.0 5120.0 0.0 352.0 31744.0 21905.2 84992.0 8.0 4864.0 2467.5 512.0 264.6 0.001 0.000 0.001

jmap(Java内存映射工具)

可以生成堆转储快照(一般称为heapdump或dump文件)。获取Java堆转储快照的方式有以下几种:

①(自动生成)使用-XX:+HeapDumpOnOutOfMemoryError参数,让虚拟机在OOM后自动生成dump文件

②(手动生成)使用-XX:+HeapDumpOnCtrlBreak参数,在Windows下可以使用Ctrl+Break键让虚拟机生成dump文件,

Linux下通过kill  -3命令发送进程退出信号“吓唬”一下虚拟机,也能拿到dump文件。

③使用jmap命令

jhat(虚拟机堆转储快照分析工具)

目前已经有更好的工具,比如MAT,jhat在JDK9中已正式被移除

jinfo(Java配置信息工具)

可以实时的查看当前 jvm 使用了哪些参数,并且也可以在不停机的情况下修改参数。

jstack(java堆栈跟踪工具)

替代品jcmd

官网:https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/tooldescr006.html

jcmd是jdk7中引入的,可以代替jstack。

三、可视化分析工具

JConsole

Java Visual VM

Java Visual VM (JVisualVM) 自JDK6u23开始到JDK8为止为Oracle JDK的一部分, JDK9及之后作为独立项目。

四、其它工具

Btrace

官网:https://github.com/btraceio/btrace

Arthas

阿里重磅开源在线分析诊断工具,官网地址:https://alibaba.github.io/arthas/

MAT(Memory Analyzer Tool)

官网:https://www.eclipse.org/mat/downloads.php

主要用于诊断内存泄漏和高内存占用问题。

Jprofiler

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

JProfiler是用于分析Java软件性能瓶颈并能准确定位到类或者方法有效解决性能问题的主流工具,它通常需要与性能测试工具(如LoadRunner)配合使用,因为往往只有当系统处于压力状态下才能反映出性能问题。Jprofiler是收费的。

四、常见问题排查思路

1.CPU彪高

思路:首先找到 CPU 飚高的那个 Java 进程,因为你的服务器会有多个 JVM 进程。然后找到那个进程中的 “问题线程”,最后根据线程堆栈信息找到问题代码。最后对代码进行排查。

具体步骤:

  1. 通过 top 命令找到 CPU 消耗最高的进程,并记住进程 ID。
  2. 再次通过 top -Hp [进程 ID] 找到 CPU 消耗最高的线程 ID,并记住线程 ID.
  3. 通过 JDK 提供的 jstack 工具 dump 线程堆栈信息到指定文件中。具体命令:jstack -l [进程 ID] >jstack.log。
  4. 由于刚刚的线程 ID 是十进制的,而堆栈信息中的线程 ID 是16进制的,因此我们需要将10进制的转换成16进制的,并用这个线程 ID 在堆栈中查找。使用 printf "%x\n" [十进制数字] ,可以将10进制转换成16进制。
  5. 通过刚刚转换的16进制数字从堆栈信息里找到对应的线程堆栈。就可以从该堆栈中看出端倪。

分析 dump 文件的可视化工具,MAT,Jprofile,jvisualvm 等,这些工具可以分析 jmap dump 下来的文件,看看哪个对象使用的内存较多,通常是能够查出问题的。

出现问题的常见场景:

①一般是某个业务死循环没有出口,这种情况可以根据业务进行修复。

②还有 C2 编译器执行编译时也会抢占 CPU,什么是 C2编译器呢?当 Java 某一段代码执行次数超过10000次(默认)后,就会将该段代码从解释执行改为编译执行,也就是编译成机器码以提高速度。而这个 C2编译器就是做这个的。如何解决呢?项目上线后,可以先通过压测工具进行预热,这样,等用户真正访问的时候,C2编译器就不会干扰应用程序了。如果是 GC 线程导致的,那么极有可能是 Full GC ,那么就要进行 GC 的优化。

2.内存问题排查

一种是内存泄露,一种是未泄露。

内存溢出的情况可以通过加上 -XX:+HeapDumpOnOutOfMemoryError 参数,该参数作用是在程序内存溢出时输出 dump 文件。有了 dump 文件,就可以通过 dump 分析工具进行分析了,比如常用的MAT,Jprofile,jvisualvm 等工具都可以分析,这些工具都能够看出到底是哪里溢出,哪里创建了大量的对象等等信息。

参考:Java虚拟机线上问题排查的2个基本操作,你知不知道?

总结:

GC

①gc的状况:jmap ,jcmd(oracle 官方推荐使用 jcmd 代替 jmap,因为 jcmd 确实能代替 jmap 很多功能。jmap 可以打印对象的分布信息,可以 dump 文件,注意,jmap 和 jcmd dump 文件的时候会触发 FGC ,使用的时候注意场景。)

②还有一个比较常用的工具是 jstat,该工具可以查看GC 的详细信息,比如eden ,from,to,old 等区域的内存使用情况。

③还有一个工具是 jinfo,该工具可以查看当前 jvm 使用了哪些参数,并且也可以在不停机的情况下修改参数。

分析 dump 文件的可视化工具

①MAT

②Jprofile

③jvisualvm

Linux排查问题工具汇总的更多相关文章

  1. (转)超全整理!Linux性能分析工具汇总合集

    超全整理!Linux性能分析工具汇总合集 原文:http://rdc.hundsun.com/portal/article/731.html 出于对Linux操作系统的兴趣,以及对底层知识的强烈欲望, ...

  2. Linux 性能分析工具汇总合集

    出于对Linux操作系统的兴趣,以及对底层知识的强烈欲望,因此整理了这篇文章.本文也可以作为检验基础知识的指标,另外文章涵盖了一个系统的方方面面.如果没有完善的计算机系统知识,网络知识和操作系统知识, ...

  3. [转]Linux性能分析工具汇总合集

    出于对Linux操作系统的兴趣,以及对底层知识的强烈欲望,因此整理了这篇文章.本文也可以作为检验基础知识的指标,另外文章涵盖了一个系统的方方面面.如果没有完善的计算机系统知识,网络知识和操作系统知识, ...

  4. 超全整理!Linux性能分析工具汇总合集

    转自:http://rdc.hundsun.com/portal/article/731.html?ref=myread 出于对Linux操作系统的兴趣,以及对底层知识的强烈欲望,因此整理了这篇文章. ...

  5. Linux下性能分析工具汇总

    来自:http://os.51cto.com/art/201104/253114.htm 本文讲述的是:CPU性能分析工具.Memory性能分析工具.I/O性能分析工具.Network性能分析工具. ...

  6. Linux性能分析命令工具汇总

    转自:http://rdc.hundsun.com/portal/article/731.html?ref=myread 出于对Linux操作系统的兴趣,以及对底层知识的强烈欲望,因此整理了这篇文章. ...

  7. [转载] 一共81个,开源大数据处理工具汇总(下),包括日志收集系统/集群管理/RPC等

    原文: http://www.36dsj.com/archives/25042 接上一部分:一共81个,开源大数据处理工具汇总(上),第二部分主要收集整理的内容主要有日志收集系统.消息系统.分布式服务 ...

  8. 腾讯优测干货精选| 安卓开发新技能Get -常用必备小工具汇总

    文/腾讯公司 陈江峰 优测小优有话说: 移动研发及测试干货哪里找?腾讯优测-优社区你值得拥有~ 开发同学们都知道,安卓开发路上会碰到很多艰难险阻,一不小心就被KO.这时候,没有新技能傍身怎么行?今天我 ...

  9. C#(Net)软件开发常用工具汇总,提高你的开发效率

    C#(Net)软件开发常用工具汇总,提高你的开发效率 写代码也要读书,爱全栈,更爱生活.每日更新原创IT编程技术及日常实用技术文章. 我们的目标是:玩得转服务器Web开发,搞得懂移动端,电脑客户端更是 ...

随机推荐

  1. MSSQL字符串取相应的第几个数组值

    create function Get_StrArrayStrOfIndex( @str varchar(5000), --要分割的字符串 @split varchar(10), --分隔符号 @in ...

  2. eclipse 安装TestNg

    通过eclipse安装TestNg,过程如下: 1.点击help-->Install New Software 2.打开如下窗口,点击add,name自定义输入,Location中输入http: ...

  3. Python学习之认知(一)

    第二章(一) 2.1 python介绍 2.1.1 python是一种什么样的语言 ​ 编程语⾔主要从以下几个⻆度为进行分类,编译型和解释型.静态语言和动态语⾔.强类型定义语言和弱类型定义语言. 编译 ...

  4. spring @valid 注解

    用于验证注解是否符合要求,直接加在变量之前,在变量中添加验证信息的要求,当不符合要求时就会在方法中返回message 的错误提示信息. @PostMapping public User create ...

  5. 【C/C++】对于可重入、线程安全、异步信号安全几个概念的理解

    由于前段时间,程序偶尔异常挂起不工作,检查后发现时死锁了,原因就是:在信号处理函数里面调用了fprintf. printf等io函数是需要对输出缓冲区加锁,这类函数对本身是线程安全的,但是对信号处理函 ...

  6. js继承的方式及其优缺点

    js继承方法 前因:ECMAScript不支持接口继承,只支持实现继承 一.原型链 概念:每个构造函数都有一个原型对象,原型对象都包含一个指向构造函数的指针,而实例都包含一个指向原型对象的内部指针,让 ...

  7. excel经典图表

    柱形图: 点击图表,选择数据,添加列 选择展示的列区域数据,编辑水平分类轴,选择按年份统计 效果图: 更改图表类型: 折线图或面积图: 饼图或圆环图: 散点图或气泡图: 组合图: 更改原有图表为组合图 ...

  8. 5.写一个sh脚本,可以通过一台机器控制多台机器

    先创建一个脚步文件 对这个脚本进行编辑 [hadoop@node1 ~]$ vim xcall.sh 给脚本赋予权限 执行脚本 把脚本移动到 /usr/local/bin/目录下 [hadoop@no ...

  9. [转帖]JVM总结--JVM体系结构

    JVM总结--JVM体系结构 https://blog.csdn.net/samjustin1/article/details/52215274 需要不断的学习才可以. 2016年08月15日 22: ...

  10. PostgreSQL查询数据库中包含某种类型的表有哪些

    and c.relnamespace = n.oid and nspname = 'public' and a.atttypid = t.oid and typname = 'TEXT' and c. ...