JVM虚拟机系统性学习-JVM相关工具jps、jstat、jinfo、jmap、jhat和jstack

本文主要是介绍JVM虚拟机系统性学习-JVM相关工具jps、jstat、jinfo、jmap、jhat和jstack,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

JVM 相关工具

JDK 工具包

jps

查看 Java 进程

jps :列出Java程序进程ID和Main函数名称
jps -q :只输出进程ID
jps -m :输出传递给Java进程(主函数)的参数
jps -l :输出主函数的完整路径
jps -v :显示传递给Java虚拟机的参数
jstat

查看 Java 程序运行时相关信息,可以查看运行时堆的相关情况

jstat -<options> [-t] [-h<lines>] <vmid> [<interval> [<count>]]options:由以下值构成
-class:显示ClassLoader的相关信息
-compiler:显示JIT编译的相关信息
-gc:显示与GC相关信息
-gccapacity:显示各个代的容量和使用情况
-gccause:显示垃圾收集相关信息(同-gcutil),同时显示最后一次或当前正在发生的垃圾收集的诱发原因
-gcnew:显示新生代信息
-gcnewcapacity:显示新生代大小和使用情况
-gcold:显示老年代信息
-gcoldcapacity:显示老年代大小
-gcpermcapacity:显示永久代大小
-gcutil:显示垃圾收集信息

示例1:

# 进程 ID 515460 ,采样间隔 250 ms,采样数 4
jstat -gc 515460 250 4

在这里插入图片描述

  • S0C:年轻代中第一个survivor(幸存区)的容量 (单位kb)
  • S1C:年轻代中第二个survivor(幸存区)的容量 (单位kb)
  • S0U :年轻代中第一个survivor(幸存区)目前已使用空间 (单位kb)
  • S1U :年轻代中第二个survivor(幸存区)目前已使用空间 (单位kb)
  • EC :年轻代中Eden的容量 (单位kb)
  • EU :年轻代中Eden目前已使用空间 (单位kb)
  • OC :Old代的容量 (单位kb)
  • OU :Old代目前已使用空间 (单位kb)
  • MC:metaspace的容量 (单位kb)
  • MU:metaspace目前已使用空间 (单位kb)
  • CCSC:压缩类空间大小
  • CCSU:压缩类空间使用大小
  • YGC :从应用程序启动到采样时年轻代中gc次数
  • YGCT :从应用程序启动到采样时年轻代中gc所用时间(s)
  • FGC :从应用程序启动到采样时old代(全gc)gc次数
  • FGCT :从应用程序启动到采样时old代(全gc)gc所用时间(s)
  • GCT:从应用程序启动到采样时gc用的总时间(s)

示例2:

jstat -gcutil 515256 1s 5
# 进程ID 30108,采样间隔1s,采样数5

在这里插入图片描述

  • S0 年轻代中第一个survivor(幸存区)已使用的占当前容量百分比
  • S1 年轻代中第二个survivor(幸存区)已使用的占当前容量百分比
  • E 年轻代中Eden(伊甸园)已使用的占当前容量百分比
  • O old代已使用的占当前容量百分比
  • M metaspace已使用的占当前容量百分比
  • CCS 压缩使用比例
  • YGC 从应用程序启动到采样时年轻代中gc次数
  • YGCT 从应用程序启动到采样时年轻代中gc所用时间(s)
  • FGC 从应用程序启动到采样时old代(全gc)gc次数
  • FGCT 从应用程序启动到采样时old代(全gc)gc所用时间(s)
  • GCT 从应用程序启动到采样时gc用的总时间(s)
jinfo

查看正在运行的 Java 程序的扩展参数

jinfo [option] <pid>option 参数:
# 打印虚拟机 VM 参数
-flags 
# 打印指定虚拟机 VM 参数
-flag <name> 
# 打开或关闭虚拟机参数
-flag [+|-]<name> 
# 设置指定虚拟机参数的值
-flag <name>=<value> 
jmap

查看堆内存使用情况,一般结合 jhat 使用

# 显示 Java 堆的详细信息
jmap -heap pid
# 显示堆中对象的统计信息
jmap -histo:live pid
# 打印类加载器信息
jmap -clstats pid
# 打印等待终结的对象信息
jmap -finalizerinfo pid
# 生成堆转储快照 dump 文件,如果堆内存较大,该命令比较耗时,并且该命令执行过程中会暂停应用,线程系统慎用
jmap -dump:format=b,file=heapdump.hprof pid
jhat

jhat 命令会解析 Java 堆转储文件,并且启动一个 web server,再用浏览器就可以查看 dump 出来的 heap 二进制文件

使用 jmap -dump 可以在 jvm 运行时获取 dump

再通过 jhat ./heapdump.hprof 命令,就可以启动一个 web server,用浏览器访问即可

jstack

用于生成 Java 虚拟机当前时刻的线程快照,生成线程快照的主要目的是定位线程出现长时间停顿的原因

生成的线程快照中,需要主要留意以下几种状态:

  • 死锁,Deadlock
  • 等待资源,Waiting on condition
  • 等待获取管程,Waiting on monitor entry
  • 阻塞,Blokced
# 查看当前时间点,指定进程的dump堆栈信息
jstack [ option ] pid 
# 将当前时间点的指定进程的dump堆栈信息,写入到指定文件中
jstack [ option ] pid > 文件 
# 注:若该文件不存在,则会自动生成; 若该文件存在,则会覆盖源文件
# 查看当前时间点,core文件的dump堆栈信息
jstack [ option ] executable core 
# 查看当前时间点,远程机器的dump堆栈信息
jstack [ option ] [server_id@]<remote server IP or hostname> # options 说明
-F # 当进程挂起了,此时'jstack [-l] pid'是没有相应的,这时候可使用此参数来强制打印堆栈信息,强制jstack),一般情况不需要使用。
-m # 打印 java 和 native c/c++ 框架的所有栈信息。可以打印 JVM 的堆栈,以及Native的栈帧,一般应用排查不需要使用。
-l # 长列表. 打印关于锁的附加信息。例如属于java.util.concurrent的ownable synchronizers列表,会使得JVM停顿得长久得多(可能会差很多倍,比如普通的jstack可能几毫秒和一次GC没区别,加了-l 就是近一秒的时间),-l 建议不要用。一般情况不需要使用。
-h or -hel # 打印帮助信息# 使用示例:统计线程数
jstack -l 513792 | grep 'java.lang.Thread.State' | wc -l

JVM 调试工具

JVM 常用调试工具有:visualvm 以及 Arthas

这篇关于JVM虚拟机系统性学习-JVM相关工具jps、jstat、jinfo、jmap、jhat和jstack的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Java中流式并行操作parallelStream的原理和使用方法

《Java中流式并行操作parallelStream的原理和使用方法》本文详细介绍了Java中的并行流(parallelStream)的原理、正确使用方法以及在实际业务中的应用案例,并指出在使用并行流... 目录Java中流式并行操作parallelStream0. 问题的产生1. 什么是parallelS

Java中Redisson 的原理深度解析

《Java中Redisson的原理深度解析》Redisson是一个高性能的Redis客户端,它通过将Redis数据结构映射为Java对象和分布式对象,实现了在Java应用中方便地使用Redis,本文... 目录前言一、核心设计理念二、核心架构与通信层1. 基于 Netty 的异步非阻塞通信2. 编解码器三、

SpringBoot基于注解实现数据库字段回填的完整方案

《SpringBoot基于注解实现数据库字段回填的完整方案》这篇文章主要为大家详细介绍了SpringBoot如何基于注解实现数据库字段回填的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以了解... 目录数据库表pom.XMLRelationFieldRelationFieldMapping基础的一些代

一篇文章彻底搞懂macOS如何决定java环境

《一篇文章彻底搞懂macOS如何决定java环境》MacOS作为一个功能强大的操作系统,为开发者提供了丰富的开发工具和框架,下面:本文主要介绍macOS如何决定java环境的相关资料,文中通过代码... 目录方法一:使用 which命令方法二:使用 Java_home工具(Apple 官方推荐)那问题来了,

Java HashMap的底层实现原理深度解析

《JavaHashMap的底层实现原理深度解析》HashMap基于数组+链表+红黑树结构,通过哈希算法和扩容机制优化性能,负载因子与树化阈值平衡效率,是Java开发必备的高效数据结构,本文给大家介绍... 目录一、概述:HashMap的宏观结构二、核心数据结构解析1. 数组(桶数组)2. 链表节点(Node

Java AOP面向切面编程的概念和实现方式

《JavaAOP面向切面编程的概念和实现方式》AOP是面向切面编程,通过动态代理将横切关注点(如日志、事务)与核心业务逻辑分离,提升代码复用性和可维护性,本文给大家介绍JavaAOP面向切面编程的概... 目录一、AOP 是什么?二、AOP 的核心概念与实现方式核心概念实现方式三、Spring AOP 的关

详解SpringBoot+Ehcache使用示例

《详解SpringBoot+Ehcache使用示例》本文介绍了SpringBoot中配置Ehcache、自定义get/set方式,并实际使用缓存的过程,文中通过示例代码介绍的非常详细,对大家的学习或者... 目录摘要概念内存与磁盘持久化存储:配置灵活性:编码示例引入依赖:配置ehcache.XML文件:配置

Java 虚拟线程的创建与使用深度解析

《Java虚拟线程的创建与使用深度解析》虚拟线程是Java19中以预览特性形式引入,Java21起正式发布的轻量级线程,本文给大家介绍Java虚拟线程的创建与使用,感兴趣的朋友一起看看吧... 目录一、虚拟线程简介1.1 什么是虚拟线程?1.2 为什么需要虚拟线程?二、虚拟线程与平台线程对比代码对比示例:三

Java中的.close()举例详解

《Java中的.close()举例详解》.close()方法只适用于通过window.open()打开的弹出窗口,对于浏览器的主窗口,如果没有得到用户允许是不能关闭的,:本文主要介绍Java中的.... 目录当你遇到以下三种情况时,一定要记得使用 .close():用法作用举例如何判断代码中的 input

基于Python开发Windows自动更新控制工具

《基于Python开发Windows自动更新控制工具》在当今数字化时代,操作系统更新已成为计算机维护的重要组成部分,本文介绍一款基于Python和PyQt5的Windows自动更新控制工具,有需要的可... 目录设计原理与技术实现系统架构概述数学建模工具界面完整代码实现技术深度分析多层级控制理论服务层控制注