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 等等,这些都是令人头疼的问题.楼主同样也遇到过这些问题,那么,遇到这些问题该如何 ...
随机推荐
- 玩转DB里的数据 — 阿里云DMS任务编排之简介和实操
1.任务编排介绍 数据库是企业IT系统里的重要基础设施,里面存储了大量有价值的数据资产,如:交易数据.客户数据.订单数据,等等.其实,数据库在企业里一直扮演着一个数据生产者(Producer)的角色, ...
- 用手机写代码:基于 Serverless 的在线编程能力探索
简介:Serverless 架构的按量付费模式,可以在保证在线编程功能性能的前提下,进一步降低成本.本文将会以阿里云函数计算为例,通过 Serverless 架构实现一个 Python 语言的在线编 ...
- [FAQ] 快速准备 windows 的 nodejs 开发环境
下载 git 版本控制系统:https://pc.qq.com/search.html#!keyword=git 下载 TortoiseGit 客户端:https://pc.qq.com/sear ...
- SpringMVC拦截器配置后端登录校验
引 创建拦截器的方法有多种,可以继承HandlerInterceptorAdapter类,也可实现HandlerInterceptor接口.接口中有三个方法: preHandle:在业务处理器处理请求 ...
- XAMPP安装与部署使用
#注:本文章资料借鉴自于Sunny王维,地址:https://blog.csdn.net/qq_36595013/article/details/80373597 [一]XAMPP介绍 XAMPP. ...
- SpringMVC学习二(日期参数/数据保存/重定向)
接受的参数为日期类型 controller进行数据保存 Controller如何进行重定向跳转 1.对于前端页面传来日期类型的数据时如何进行处理,有两种方法 1.1在对应的Controller中插入代 ...
- 特工17Agent17汉化版游戏破解金币方法修改破解金币的增加方法
又是一个renpy游戏,昨晚搞了半个小时搞定的,其实这个游戏要赚钱也不难,就是点点点就可以了,但是我觉得还是挺费劲的,因为好多道具都很贵,攒钱又不怎么容易,花钱的地方还挺多的,所以干脆不如直接破解了算 ...
- 深度Linux deepin更新,防火墙操作
获取更新 sudo apt-get update 更新系统 sudo apt-get dist-upgrade -y 清理更新缓存 sudo apt-get autoclean 防火墙操作 sudo ...
- JavaScript实现全选选项框的功能和鼠标划入出现下拉框的功能--JavaScript实例集锦(初学)
有一些论坛,文章后台编辑都会出现选择框的操作. 1.实现选项框全选和取消全选的功能: 代码实现: <!DOCTYPE html> <html> <head> < ...
- python教程1.2:变量+数据类型+运算符
一.变量 程序是从上到下依次逐⾏执⾏的,所以变量必须先定义,后调⽤, 否则会报错 变量定义规范 二.数据类型 1.数字类型 可⽤ type() ⽅法来查看数据类型 2.字符串 多引号 多引号什么作 ...