JVM 性能分析——jdk 自带命令分析工具(jps/jstat/jinfo/jmap/jhat/jstack)

2024-06-16 12:44

本文主要是介绍JVM 性能分析——jdk 自带命令分析工具(jps/jstat/jinfo/jmap/jhat/jstack),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

    • jps(Java Process Status):查看正在运行的Java进程
    • `jstat(JVM Statistics Monitoring Tool):查看 JVM 的统计信息`
    • jinfo(Configuration Info for Java):实时查看和修改JVM配置参数
    • `jmap(JVM Memory Map):导出内存映像文件`和查看内存使用情况
    • jhat(JVM Heap Analysis Tool):堆分析工具
    • jstack(JVM Stack Trace):打印 JVM 中线程快照

在 windows 环境下演示

jps(Java Process Status):查看正在运行的Java进程

1、查看正在运行的Java进程:jps(Java Process Status)

在这里插入图片描述

jstat(JVM Statistics Monitoring Tool):查看 JVM 的统计信息

查看内存使用情况,分析堆中各部分使用情况、过程变化、GC 时间等。

在生产环境中,可以执行 jstat 命令,快速收集应用程序的运行数据,可以快速了解应用程序的运行状况,有助于在线上问题发生时进行快速诊断和分析。通过查看内存区域的容量和利用率,可以发现内存泄漏和溢出等问题以及优化应用程序的内存管理;还可以帮助开发者快速定位 GC 相关的性能瓶颈。通常结合其他监控工具(如 JConsole、VisualVM、Jprofiler 等)使用。

jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]参数解释:<option>:指定要显示的性能指标,如 -gc、-gccapacity、-gcutil 等-t:在输出中显示时间戳,显示程序运行的时间-h<lines>:每隔多少行输出一个表头<vmid>:Java 虚拟机进程 ID<interval>:输出间隔,单位为毫秒,每隔多长时间输出一次<count>:指定输出的总次数常用选项及含义:-gc:显示与GC相关的堆信息,Eden、Suvivor、老年代等空间使用情况及GC次数、时间相关信息-gccapacity:与-gc基本相同,但关注Java堆各个区域使用的最大、最小空间,可以查看内存池的配置和使用情况。-gcutil:与-gc基本相同,但关注空间使用百分比-class:类加载统计相关信息-compiler:JIT 编译器统计-printcompilation:方法编译统计如:jstat -gc 12345 1000 10:每秒输出一次,共输出10次,PID 为 12345 的 Java 进程的垃圾收集统计信息。

帮助:
在这里插入图片描述
示例:
在这里插入图片描述

jstat -gc 29336 的输出字段:S0C、S1C:Survivor 0 和 Survivor 1 区域的当前容量(KB)S0U、S1U:Survivor 0 和 Survivor 1 区域的已使用空间(KB)EC:Eden 区域的当前容量(KB)EU:Eden 区域的已使用空间(KB)OC:Old 区域的当前容量(KB)OU:Old 区域的已使用空间(KB)MC:元空间的当前容量(KB)MU:元空间的已使用空间(KB)CCSC:压缩类空间的当前容量(KB)CCSU:压缩类空间的已使用空间(KB)YGC:Young GC 事件的次数YGCT:Young GC 事件的总时间(秒)FGC:Full GC 事件的次数FGCT:Full GC 事件的总时间(秒)GCT:GC 总时间(秒)
jstat -gccapacity 29336 的输出字段:NGCMN、NGCMX、NGC:新生代最小容量、最大容量和当前容量S0C、S1C、EC:Survivor 0、Survivor 1 和 Eden 区域的当前容量OGCMN、OGCMX、OGC、OC:Old 代最小容量、最大容量、当前容量和容量MCMN、MCMX、MC:元空间最小容量、最大容量和当前容量CCSMN、CCSMX、CCSC:压缩类空间最小容量、最大容量和当前容量YGC、FGC:Young GC 和 Full GC 事件的次数
jstat -gcutil 29336 的输出字段:S0、S1、E、O、M、CCS:Survivor 0、Survivor 1、Eden、Old、元空间、压缩类空间 区域的利用率YGC、YGCT:Young GC 事件的次数和总时间FGC、FGCT:Full GC 事件的次数和总时间GCT:GC 总时间

jinfo(Configuration Info for Java):实时查看和修改JVM配置参数

可以在生产环境中远程执行 jinfo 命令,收集应用程序的配置信息,查看正在运行的虚拟机配置参数;也可以用于部分虚拟机参数的在线调整,在不重启应用程序的情况下,动态地修改 Java 虚拟机参数。

帮助:
在这里插入图片描述
示例:
在这里插入图片描述

扩展查看命令:

  • java -XX:+PrintFlagsInitial —— 查看所有JVM参数启动的初始值

  • java -XX:+PrintFlagsFinal —— 查看所有JVM参数的最终值

  • java -XX:+PrintCommandLineflags —— 查看那些已经被用户或者VM设置过的详细的XX参数的名称和值

    如:java -XX:+PrintFlagsFinal > output.txt,这里为了方便查看,将查询结果输出到指定的文件中。
    在这里插入图片描述

jmap(JVM Memory Map):导出内存映像文件和查看内存使用情况

可以在应用程序运行时生成内存快照文件(xx.hprof 文件),这些快照可用于离线分析应用程序的内存使用情况。可以看看这篇文章 使用 JProfiler 工具分析 dump.hprof 堆内存快照文件排查内存溢出问题。

  1. 导出 dump 文件(堆转储快照文件,.hprof),(重点关注)
  2. 查看内存的相关信息

1、导出 dump 文件(堆转储快照文件,.hprof)

手动的方式,通过命令调用实时触发导出。jmap -dump:format=b,file=<filename.hprof> <pid>,导出所有对象。jmap -dump:live,format=b,file=<filename.hprof> <pid>,只导出存活的对象。自动的方式,配置对应的 JVM 参数,会在内存溢出的时候自动触发导出。-XX:+HeapDumponOutOfMemoryError,开启内存溢出时导出 dump 文件。-XX:HeapDumpPath= <filename.hprof>,dump 文件导出路径。

帮助:
在这里插入图片描述
示例:
只导出存活的对象,导出路径为 F:\logs\jmap_dump.hprof
在这里插入图片描述
在这里插入图片描述

2、查看内存的相关信息

jmap -heap pid —— 查看堆内存相关信息,和 jstat 的功能有点类似。

为了方便查看,这里将打印的堆内存信息输出到指定的文件中,F:\logs\heap.txt
在这里插入图片描述
在这里插入图片描述

jmap -histo pid —— 当前对象集的相关信息,类、类的实例个数、占用内存大小。

在这里插入图片描述
为了方便查看,这里将打印的堆内存信息输出到指定的文件中,F:\logs\histo.txt。可以查看到各个类的实例对象个数、各类的所有实例对象占用的内存大小。
在这里插入图片描述

jhat(JVM Heap Analysis Tool):堆分析工具

jhat 命令与 jmap 命令搭配使用,用于分析 jmap 生成的 heap dump 文件,通过 jhat 提供的 Web 界面,可以对内存快照进行交互式的分析和浏览。可以生成内存快照中的对象统计报告、分析内存快照中对象之间的引用关系、支持 Java 对象查询语言(OQL)等,可以帮助开发者快速定位内存泄漏等问题。

使用这个命令分析起来比较麻烦,jhat 令在 JDK9、JDK10 中已经被删除,官方建议用 visualVM 代替,visualVM 是一个图形化界面分析更方便;也可以使用其他工具,如 jprofiler,可以看看这篇文章 使用 JProfiler 工具分析 dump.hprof 堆内存快照文件排查内存溢出问题,是如何使用工具分析 dump 堆内存快照文件来分析排查问题。
帮助:
在这里插入图片描述
示例:打开指定 dump 文件。
在这里插入图片描述
上述命令运行,服务启动完后,进入 http://localhost:7000/ 页面可以查看指定类、实例对象相关信息,端口号默认为 7000
在这里插入图片描述

jstack(JVM Stack Trace):打印 JVM 中线程快照

jstack 用于生成虚拟机指定进程当前时刻的线程快照(虚拟机堆栈跟踪)。线程快照就是当前虚拟机内指定进程的每一条线程正在执行的方法堆栈的集合。

生成线程快照可用于定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等问题。这些都是导致线程长时间停顿的常见原因。当线程出现停顿时,就可以用 jstack 显示各个线程调用的堆栈情况以及线程运行状态。

帮助:
在这里插入图片描述
示例:
在这里插入图片描述

这篇关于JVM 性能分析——jdk 自带命令分析工具(jps/jstat/jinfo/jmap/jhat/jstack)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1066489

相关文章

Vue3 的 shallowRef 和 shallowReactive:优化性能

大家对 Vue3 的 ref 和 reactive 都很熟悉,那么对 shallowRef 和 shallowReactive 是否了解呢? 在编程和数据结构中,“shallow”(浅层)通常指对数据结构的最外层进行操作,而不递归地处理其内部或嵌套的数据。这种处理方式关注的是数据结构的第一层属性或元素,而忽略更深层次的嵌套内容。 1. 浅层与深层的对比 1.1 浅层(Shallow) 定义

JVM 的类初始化机制

前言 当你在 Java 程序中new对象时,有没有考虑过 JVM 是如何把静态的字节码(byte code)转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇文章首先介绍 JVM 类初始化的机制,然后给出几个易出错的实例来分析,帮助大家更好理解这个知识点。 JVM 将字节码转化为运行时对象分为三个阶段,分别是:loading 、Linking、initialization

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

浅析Spring Security认证过程

类图 为了方便理解Spring Security认证流程,特意画了如下的类图,包含相关的核心认证类 概述 核心验证器 AuthenticationManager 该对象提供了认证方法的入口,接收一个Authentiaton对象作为参数; public interface AuthenticationManager {Authentication authenticate(Authenti

Spring Security--Architecture Overview

1 核心组件 这一节主要介绍一些在Spring Security中常见且核心的Java类,它们之间的依赖,构建起了整个框架。想要理解整个架构,最起码得对这些类眼熟。 1.1 SecurityContextHolder SecurityContextHolder用于存储安全上下文(security context)的信息。当前操作的用户是谁,该用户是否已经被认证,他拥有哪些角色权限…这些都被保

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式Factory工厂模式Singleton单例模式Delegate委派模式Strategy策略模式Prototype原型模式Template模板模式 Spring5 beans 接口实例化代理Bean操作 Context Ioc容器设计原理及高级特性Aop设计原理Factorybean与Beanfactory Transaction 声明式事物

性能测试介绍

性能测试是一种测试方法,旨在评估系统、应用程序或组件在现实场景中的性能表现和可靠性。它通常用于衡量系统在不同负载条件下的响应时间、吞吐量、资源利用率、稳定性和可扩展性等关键指标。 为什么要进行性能测试 通过性能测试,可以确定系统是否能够满足预期的性能要求,找出性能瓶颈和潜在的问题,并进行优化和调整。 发现性能瓶颈:性能测试可以帮助发现系统的性能瓶颈,即系统在高负载或高并发情况下可能出现的问题

Java进阶13讲__第12讲_1/2

多线程、线程池 1.  线程概念 1.1  什么是线程 1.2  线程的好处 2.   创建线程的三种方式 注意事项 2.1  继承Thread类 2.1.1 认识  2.1.2  编码实现  package cn.hdc.oop10.Thread;import org.slf4j.Logger;import org.slf4j.LoggerFactory