JVM性能分析与故障排查
引言
JVM调优
程序在上线前的测试或运行中有时会出现一些大大小小的JVM问题,比如cpu load过高、请求延迟、tps降低等,甚至出现内存泄漏(每次垃圾收集使用的时间越来越长,垃圾收集频率越来越高,每次垃圾收集清理掉的垃圾数据越来越少)、内存溢出导致系统崩溃,因此需要对JVM进行调优,使得程序在正常运行的前提下,获得更高的用户体验和运行效率。
故障排查
在Java应用中,系统内存通常会被分为几块不同的空间,了解这些不同内存区域的作用有助于更好地编写Java应用,构建更加稳定的系统。而堆空间更是Java内存中最为重要的区域,几乎所有的应用程序对象都在堆中分配,当系统出现故障时,具备Java堆的内存分析能力,也可以更加方便地诊断系统的故障。
常用分析工具
查看Java进程
jps jcmd 或linux系统命令ps -ef | grep java
查看进程详细信息 jinfo pid
[root@amyiot-local-dev test]# jps
23579 Jps
23327 jar
[root@amyiot-local-dev test]# ps -ef | grep java
root 23327 1 4 5月17 ? 00:59:35 java -server -Xms4096m -Xmx4096m -XX:+UseG1GC -Dspring.profiles.active=test -jar xxx.jar --server.port=8010
root 24834 19825 0 14:07 pts/0 00:00:00 grep --color=auto java
##查看进程详细(运行jps后)
jinfo pid
##查看启动参数
jinfo -flags pid
##查看指定参数值
jinfo -flag InitialHeapSize pid
##查看系统属性
jinfo -sysprops pid
查看进程GC情况
jstat
##查看进程pid的情况
jstat -gc pid
##每5秒输出一次
jstat -gc pid 5000
##每5秒输出一次,输出3次
jstat -gc pid 5000 3
##查看GC统计信息,每秒输出一次
jstat -gcutil pid 1000
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
0.00 0.00 100.00 99.94 90.56 87.86 875 9.307 3223 5313.139 5322.446
S0:幸存1区当前使用比例
S1:幸存2区当前使用比例
E:Eden Space(伊甸园)区使用比例
O:Old Gen(老年代)使用比例
M:元数据区使用比例
CCS:压缩使用比例
YGC:年轻代垃圾回收次数
FGC:老年代垃圾回收次数
FGCT:老年代垃圾回收消耗时间
GCT:垃圾回收消耗总时间
##最近一次gc原因
jstat -gccause pid
##查看gc容量
jstat -gccapacity pid
查看内存堆使用情况
##堆内存各区域使用情况
jmap -heap 23327
##转存堆文件heapdump.hprof
jmap -dump:format=b,file=heapdump.hprof pid
分析hprof堆信息
Windows:jvisualvm.exe 堆入hprof文件即可
Linux:jhat
jhat heapdump.hprof
##有时候堆文件可能会很大,在启动时会报堆空间不足的错误,
jhat -J-Xmx512M heapdump.hprof
通过http访问

查看类实例数量

查看线程情况
##查看线程详情信息,包括锁,状态,如果存在死锁,会在结果输出最后打印出来
jstack pid
GC日志输出
##打印GCDetails
-XX:+PrintGCDetails
##GC前输出Heap信息
-XX:+PrintHeapAtGC
##打印GC时输出时间戳
-XX:+PrintGCDateStamps
##打印GC时,输出新年代最大年龄
-XX:+PrintTenuringDistribution
##在控制台输出GC情况
-verbose:gc
##日志文件路径
-Xloggc:/home/gc/log/gc.log
##循环文件日志输出,与下面参数搭配使用
-XX:+UseGCLogFileRotation
##几个日志文件循环
-XX:NumberOfGCLogFiles=3
##输出的每个日志文件大小,如果满了,就往下一个文件写
-XX:GCLogFileSize=10K
##当发生OOM时输出dump文件,常用参数
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/tmp/heapdump.hprof
示例配置
##10个GC文件,从0开始,第0个文件写了大小100K,就使用下一个1号文件
java -server -Xms500m -Xmx500m -XX:+UseG1GC -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintHeapAtGC -XX:+PrintTenuringDistribution -Xloggc:/home/test/log/gc.log -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=10K -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/heapdump.hprof -Dspring.profiles.active=test -jar xxxx.jar --server.port=8010
GC日志可视化分析
GC easy:https://gceasy.io/
1.参数配置
-XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -XX:+PrintHeapAtGC -Xloggc:/temp/gc.log
2.将一段时间内生成的log文件上传至gc easy

JVM性能分析与故障排查的更多相关文章
- JVM性能分析与优化
JVM性能分析与优化: http://www.docin.com/p-757199232.html
- JVM命令-java服务器故障排查
一.top(Linux命令) 执行top命令: (查看进程15477的详细情况,下文用到) 系统信息(前五行): 第1行:Top 任务队列信息(系统运行状态及平均负载),与uptime命令结果相 ...
- JVM性能分析工具详解--MAT等
获得堆转储文件 巧妇难为无米之炊,我们首先需要获得一个堆转储文件.为了方便,本文采用的是 Sun JDK 6.通常来说,只要你设置了如下所示的 JVM 参数: -XX:+HeapDumpOnOutOf ...
- JVM性能分析 | 一次生产系统Full GC问题分析与排查总结
一次生产系统Full GC问题分析与排查总结 背景 最近某线上业务系统生产环境频频CPU使用率过低,频繁告警,通过重启可以缓解,但是过了一段时间又会继续预警,线上两个服务节点相继出现CPU资源紧张,导 ...
- jvm 性能分析
VM本身提供了一组管理的API,通过该API,我们可以获取得到JVM内部主要运行信息,包括内存各代的数据.JVM当前所有线程及其栈相关信息等等.各种JDK自带的剖析工具,包括jps.jstack.ji ...
- ------ 新春第一炮:阶乘算法性能分析与 double fault 蓝屏故障排查 Part I ------
-------------------------------------------------------------------------- 春节期间闲来无事想研究下算法,上机测试代码却遇到了 ...
- SQL Server 2008性能故障排查(四)——TempDB
原文:SQL Server 2008性能故障排查(四)--TempDB 接着上一章:I/O TempDB: TempDB是一个全局数据库,存储内部和用户对象还有零食表.对象.在SQLServer操作过 ...
- SQL Server 2008性能故障排查(一)——概论
原文:SQL Server 2008性能故障排查(一)--概论 备注:本人花了大量下班时间翻译,绝无抄袭,允许转载,但请注明出处.由于篇幅长,无法一篇博文全部说完,同时也没那么快全部翻译完,所以按章节 ...
- JVM 线上故障排查基本操作
# 前言 对于后端程序员,特别是 Java 程序员来讲,排查线上问题是不可避免的.各种 CPU 飚高,内存溢出,频繁 GC 等等,这些都是令人头疼的问题.楼主同样也遇到过这些问题,那么,遇到这些问题该 ...
- JVM 线上故障排查基本操作 (转)
前言 对于后端程序员,特别是 Java 程序员来讲,排查线上问题是不可避免的.各种 CPU 飚高,内存溢出,频繁 GC 等等,这些都是令人头疼的问题.楼主同样也遇到过这些问题,那么,遇到这些问题该如何 ...
随机推荐
- [PHP] Laravel-admin 模型表格-列的显示-链接: 关联关系的跳转链接
link 将字段显示为一个链接. // link方法不传参数时,链接的`href`和`text`都是当前列的值 $grid->column('homepage')->link(); // ...
- WPF 对接 Vortice 绘制 WIC 图片
本文告诉大家如何通过 Vortice 在 Direct2D 里面绘制图片,图片的来源是 WIC 加载出的图片 在上一篇博客 WPF 对接 Vortice 调用 WIC 加载图片 告诉了大家如何对接 V ...
- 超级好用的 IEC104 主站/客户端模拟器
目录 超级好用的 IEC104 主站/客户端模拟器 主要功能 软件截图 超级好用的 IEC104 主站/客户端模拟器 官网下载地址:http://www.redisant.cn/iec104clien ...
- Angular cli 组件和服务的创建, 父传子,子传父,服务的简单使用
1:Angular cli 创建组件component ng g component components\right ng g c wave 简写 需要定位到根路径下即可创建组件 Could not ...
- 好玩的vue组件
https://gitee.com/zheng_yongtao/jyeontu-component-warehouse 推荐这个大佬,很厉害悬浮按钮 评论组件 词云 瀑布流照片容器 视频动态封面 3D ...
- Lua热更学习--使用toLua中的协程
[6] C#访问调table类中的成员变量和函数 访问table中的变量和函数 lua中可以使用table作为class,因此对table中的函数访问调用是必要的根据前面对table访问和functi ...
- linux各个目录详细说明
在linux中一切皆文件,每个目录均有自己特定的作用,下面进行详细说明. 目录 说明 / 处于linux系统树形结构的最顶端,它是linux文件系统的入口,所有的目录.文件.设备都在 / 之下 /bi ...
- uniapp 配置 基座调试指定页面
在用hbuildx时,用自定义基座,调试程序时,有的页面因为基座缺少组件而进不去,这个时候就可以用指定页面的方式,我们只需要把进入页面的入参传进去,这个时候打开页面就是指定要调试的页面了. 就在pag ...
- 详解RocketMQ消息存储原理
本文基于RocketMQ 4.6.0进行源码分析 一. 存储概要设计 RocketMQ存储的文件主要包括CommitLog文件.ConsumeQueue文件.Index文件.RocketMQ将所有to ...
- #define、const和enum
enum:枚举类型(枚举变量的值只能等于枚举中定义的常量) #define:明示常量(定义真正的常量) const:限定符(名不符实,应该叫read only),限定一个变量为只读 C语言常量: 1. ...