JVM之性能监控与优化

jps:查看正在运行的Java进程

jstat:查看JVM统计信息

  1. 类装载相关的:

-class:显示ClassLoader的相关信息:类的装载、卸载数量、总空间、类装载所消耗的时间等

  1. 垃圾回收相关的:

    1. -gc:显示与GC相关的堆信息。包括Eden区、两个Survivor区、老年代、永久代等的容量、已用空间、GC时间合计等信息。
    2. -gccapacity:显示内容与-gc基本相同,但输出主要关注Java堆各个区域使用到的最大、最小空间。
    3. -gcutil:显示内容与-gc基本相同,但输出主要关注已使用空间占总空间的百分比。
    4. -gccause:与-gcutil功能一样,但是会额外输出导致最后一次或当前正在发生的GC产生的原因。
    5. -gcnew:显示新生代GC状况
    6. -gcnewcapacity:显示内容与-gcnew基本相同,输出主要关注使用到的最大、最小空间
    7. -geold:显示老年代GC状况
    8. -gcoldcapacity:显示内容与-gcold基本相同,输出主要关注使用到的最大、最小空间
    9. -gcpermcapacity:显示永久代使用到的最大、最小空间。
  2. JIT相关的:

● -compiler:显示JIT编译器编译过的方法、耗时等信息
● -printcompilation:输出已经被JIT编译的方法

jstat -class

请添加图片描述

jstat -compiler

请添加图片描述

jstat -printcompilation

请添加图片描述

jstat -gc

请添加图片描述

表头含义(字节)
ECEden区的大小
EUEden区已使用的大小
S0C幸存者0区的大小
S1C幸存者1区的大小
S0U幸存者0区已使用的大小
S1U幸存者1区已使用的大小
MC元空间的大小
MU元空间已使用的大小
OC老年代的大小
OU老年代已使用的大小
CCSC压缩类空间的大小
CCSU压缩类空间已使用的大小
YGC从应用程序启动到采样时young gc的次数
YGCT从应用程序启动到采样时young gc消耗时间(秒)
FGC从应用程序启动到采样时full gc的次数
FGCT从应用程序启动到采样时的full gc的消耗时间(秒)
GCT从应用程序启动到采样时gc的总时间

jinfo:实时查看和修改JVM配置参数

选项选项说明
no option输出全部的参数和系统属性
-flag name输出对应名称的参数
-flag [±]name开启或者关闭对应名称的参数 只有被标记为manageable的参数才可以被动态修改
-flag name=value设定对应名称的参数
-flags输出全部的参数
-sysprops输出系统属性

jmap:导出内存映像文件&内存使用情况

jstack:打印JVM中线程快照

JDK自带的监视工具

  1. jconsole:JDK自带的可视化监控工具。查看Java应用程序的运行概况、监控堆信息、永久区(或元空间)使用情况、类加载情况等
  2. Visual VM:Visual VM是一个工具,它提供了一个可视界面,用于查看Java虚拟机上运行的基于Java技术的应用程序的详细信息。
  3. JMC:Java Mission Control,内置Java Flight Recorder。能够以极低的性能开销收集Java虚拟机的性能数据。

其他工具

  1. Arthas :https://arthas.aliyun.com/doc/quick-start.html

rthas是Alibaba开源的Java诊断工具,。在线排查问题,无需重启;动态跟踪Java代码;实时监控JVM状态。Arthas 支持JDK 6+,支持Linux/Mac/Windows,采用命令行交互模式,同时提供丰富的 Tab 自动补全功能,进一步方便进行问题的定位和诊断。当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决:

  1. 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?
  2. 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?
  3. 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?
  4. 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!
  5. 是否有一个全局视角来查看系统的运行状况?
  6. 有什么办法可以监控到JVM的实时运行状态?
  7. 怎么快速定位应用的热点,生成火焰图?

Flame Graphs(火焰图)

在追求极致性能的场景下,了解你的程序运行过程中cpu在干什么很重要,火焰图就是一种非常直观的展示CPU在程序整个生命周期过程中时间分配的工具。火焰图对于现代的程序员不应该陌生,这个工具可以非常直观的显示出调用找中的CPU消耗瓶颈。

  1. JProfiler

MinorGC(或young GC或YGC)日志:

[GC (Allocation Failure) [PSYoungGen: 31744K->2192K (36864K) ] 31744K->2200K (121856K), 0.0139308 secs] [Times: user=0.05 sys=0.01, real=0.01 secs]

请添加图片描述

[Full GC (Metadata GC Threshold) [PSYoungGen: 5104K->0K (132096K) ] [Par01dGen: 416K->5453K (50176K) ]5520K->5453K (182272K), [Metaspace: 20637K->20637K (1067008K) ], 0.0245883 secs] [Times: user=0.06 sys=0.00, real=0.02 secs]

请添加图片描述

GC日志结构剖析

  1. 透过日志看垃圾收集器

● Serial收集器:新生代显示 “[DefNew”,即 Default New Generation
● ParNew收集器:新生代显示 “[ParNew”,即 Parallel New Generation
● Parallel Scavenge收集器:新生代显示"[PSYoungGen",JDK1.7使用的即PSYoungGen
● Parallel Old收集器:老年代显示"[ParoldGen"
● G1收集器:显示”garbage-first heap“

  1. 透过日志看GC原因

● Allocation Failure:表明本次引起GC的原因是因为新生代中没有足够的区域存放需要分配的数据
● Metadata GCThreshold:Metaspace区不够用了
● FErgonomics:JVM自适应调整导致的GC
● System:调用了System.gc()方法

GC日志分析工具

GCEasy:GCEasy(https://gceasy.io/)是一款在线的GC日志分析器,可以通过GC日志分析进行内存泄露检测、GC暂停原因分析、JVM配置建议优化等功能,大多数功能是免费的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值