JVM调优篇-07

举报
kwan的解忧杂货铺 发表于 2024/08/29 19:56:25 2024/08/29
【摘要】 1. jps 作用与使用?可以列出正在运行的虚拟机进程,并显示虚拟机执行主类 Main Class, main()函数所在的类名称以及这些进程的本地虚拟机唯一 ID (LVMID, Local Virtual Machine Identifier)。虽然功能比较单一,但它绝对是使用频率最高的 JDK 命令行工具,因为其他的 JDK 工具大多需要输入它查询到的 LVMID 来确定要监控的是哪...

1. jps 作用与使用?

可以列出正在运行的虚拟机进程,并显示虚拟机执行主类 Main Class, main()函数所在的类名称以及这些进程的本地虚拟机唯一 ID (LVMID, Local Virtual Machine Identifier)。虽然功能比较单一,但它绝对是使用频率最高的 JDK 命令行工具,因为其他的 JDK 工具大多需要输入它查询到的 LVMID 来确定要监控的是哪一个虚拟机进程。对于本地虚拟机进程来说, LVMID 与操作系统的进程 ID (PID, Process Identifier)是一致的,使用 Windows 的任务管理器或者 UNIX 的 ps 命令也可以查询到虚拟机进程的 LVMID,但如果同时启动了多个虚拟机进程,无法根据进程名称定位时,那就必须依赖 jps 命令显示主类的功能才能区分了。

  • -q:只输出进程 id
  • -m:输出虚拟机启动时传递给 main()方法的参数
  • -l:输出主类的全名,如果执行的是 jar 包,输出 jar 包的路径
  • -v:输出启动虚拟机的参数

2.jstat 作用与使用?

jstat (JVM Statistics Monitoring Tool)是用于监视虚拟机各种运行状态信息的命令行工具。它可以显示本地或者远程虚拟机进程中的类加载、内存、垃圾收集、即时编译等运行时数据,在没有 GUI 图形界面、只提供了纯文本控制台环境的服务器上,它将是运行期定位虚拟机性能问题的常用工具。

#参数interval和count代表查询间隔和次数,如果省略这2个参数,说明只查询一次。假设需要每1000毫秒查询一次进程42339垃圾收集状况,一共查询10次,那命令应当是:
jstat -gc 42339 1000 10

image-20240117173946072

上图显示了各个区以及垃圾回收的情况,具体代表含义如下(C 代表 Capacity,U 代表 Used 已使用大小)

  • S0C 和 S1C 代表 Survivor 区的 S0 和 S1 的大小
  • S0U 和 S1U 表示已使用空间
  • EC 表示 Eden 区大小,EU 表示 Eden 区已使用容量
  • OC 表示老年代大小,OU 代表老年代已使用容量
  • MC 表示方法区大小,MU 表示方法区已使用容量
  • CCSC 表示压缩类空间大小,CCSU 表示压缩类空间已使用大小
  • YGC 表示新生代 GC 次数,YGT 表示新生代 GC 总耗时
  • FGC 表示 Full GC 次数,FGCT 表示 FULL GC 总耗时
  • GCT 表示 GC 总耗时时间

选项 option 代表用户希望查询的虚拟机信息,主要分为三类:类加载、垃圾收集、运行期编译状况。

image-20230815105333037

image-20230815105316522

3.jstack 作用?

jstack (Stack Trace for Java)命令用于生成虚拟机当前时刻的线程快照(一般称为 threaddump 或者 javacore 文件)。线程快照就是当前虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的目的通常是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间挂起等,都是导致线程长时间停顿的常见原因。线程出现停顿时通过 jstack 来查看各个线程的调用堆栈,就可以获知没有响应的线程到底在后台做些什么事情,或者等待着什么资源。

jstack 进程号 > stack1.log

image-20230815105608257

option 选项的合法值与具体含义下图所示。

image-20230815105622014

从 JDK 5 起, java.lang.Thread 类新增了一个 getAllStackTraces()方法用于获取虚拟机中所有线程的 StackTraceElement 对象。使用这个方法可以通过简单的几行代码完成 jstack 的大部分功能,在实际项目中不妨调用这个方法做个管理员页面,可以随时使用浏览器来查看线程堆栈

4.jinfo 作用与使用?

jinfo (Configuration Info for Java)的作用是实时查看和调整虚拟机各项参数。注意,如果是修改,参数类型是 manageable 类型才能修改。

#查看某个java进程的name属性的值
jinfo -flag name PID

5.jmap 作用与使用?

jmap (Memory Map for Java)命令用于生成堆转储快照(一般称为 heapdump 或 dump 文件)。

jmap 的作用并不仅仅是为了获取堆转储快照,它还可以查询 finalize 执行队列、Java 堆和方法区的详细信息,如空间使用率、当前用的是哪种收集器等。

#打印出堆内存相关信息
jmap -heap PID

#生成dump文件
jmap -dump:format=b,file=/usr/heap.hprof  pid

#OOM时自动生成dump文件
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=heap.hprof

jmap 可以添加的参数如下:

image-20240126152301126

6.jhat 作用与使用?

JDK 提供 jhat (JVM Heap Analysis Tool)命令与 jmap 搭配使用,来分析 jmap 生成的堆转储快照。

jhat heap.hprof

然后访问地址 http://localhoust:7000/ 可以看到这款工具展示的信息比较简单。

生产上应该结合 dump 文件分析工具 MAT 或者 VisualVM 工具进行分析使用
JVM调优篇-07

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。