JVM调优:根据JVM自带工具定位问题(jps、jstat、Visual VM的使用)

JVM调优步骤

发现问题、定位问题、解决问题

发现问题

常见问题如下

  • GC频繁
  • CPU负载过高
  • 内存溢出(OOM)
  • 内存泄露
  • 死锁
  • 程序响应时间较长

用JDK自带命令调优工具定位问题

jps(java process status):查看正在运行的Java进程

在这里插入图片描述

基本语法:

jps [options参数] [hostid参数]

options参数:

  • -l:输出应用程序主类的全类名或如果进程执行的是 jar 包,则输出 jar 完整路径
  • -m:输出虚拟机进程启动时传递给主类 main() 的参数
  • -v:列出虚拟机进程启动时的 JVM 参数。比如:-Xms20m -Xmx50m 是启动程序指定的 jvm 参数

在这里插入图片描述

hostid 参数:
RMI 注册表中注册的主机名。如果想要远程监控主机上的 java 程序,需要安装 jstatd
对于具有更严格的安全实践的网络场所而言,可能使用一个自定义的策略文件来显示对特定的可信主机或网络的访问,尽管这种技术容易受到 IP 地址欺诈攻击。
如果安全问题无法使用一个定制的策略文件来处理,那么最安全的操作是不运行 jstatd 服务器,而是在本地使用 jstat 和 jps 工具。

jstat(JVM Statistics Monitoring Tool)监视JVM统计信息

比较长,参考这篇博客:
http://t.csdnimg.cn/IOGRg

jsstack:打印指定进程此刻的线程快照

用于生成虚拟机指定进程当前时刻的线程快照(虚拟机堆栈跟踪)。

线程快照:该进程内每条线程正在执行的方法堆栈的集合。

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

在 thread dump 中,要留意下面几种状态

  • 死锁,Deadlock(重点关注)
  • 等待资源,Waiting on condition(重点关注)
  • 等待获取监视器,Waiting on monitor entry(重点关注)
  • 阻塞,Blocked(重点关注)
  • 执行中,Runnable
  • 暂停,Suspended
  • 对象等待中,Object.wait() 或 TIMED_WAITING
  • 停止,Parked
    在这里插入图片描述

JDK自带的可视化监视工具

  • jconsole
  • Visual VM:Visual VM可以监视应用程序的 CPU、GC、堆、方法区、线程快照,查看JVM进程、JVM 参数、系统属性

MAT分析堆转储文件

MAT简介

MAT可以解析Heap Dump(堆转储)文件dump.hprof,查看GC Roots、引用链、对象信息、类信息、线程信息。可以快速生成内存泄漏报表。
可以用于查找内存泄漏以及查看内存消耗情况。

生成dump文件方式

用jmap生成

jmap(JVM Memory Map):作用一方面是获取 dump 文件(堆转储快照文件,二进制文件),它还可以获取目标 Java 进程的内存相关信息,包括 Java 堆各区域的使用情况、堆中对象的统计信息、类加载信息等。开发人员可以在控制台中输入命令 jmap -help 查阅 jmap 工具的具体使用方式和一些标准选项配置。

基本语法
基本使用语法为:
jmap [option]
jmap [option] <executable <core>
jmap [option] [server_id@]

选项 作用
-dump 生成 dump 文件(Java 堆转储快照),-dump:live 只保存堆中的存活对象
-heap 输出整个堆空间的详细信息,包括 GC 的使用、堆配置信息,以及内存的使用信息等
-histo 输出堆空间中对象的统计信息,包括类、实例数量和合计容量,-histo:live 只统计堆中的存活对象
-J 传递参数给 jmap 启动的 jvm
-finalizerinfo 显示在 F-Queue 中等待 Finalizer 线程执行 finalize 方法的对象,仅 linux/solaris 平台有效
-permstat 以 ClassLoader 为统计口径输出永久代的内存状态信息,仅 linux/solaris 平台有效
-F 当虚拟机进程对-dump 选项没有任何响应时,强制执行生成 dump 文件,仅 linux/solaris 平台有效
-h -help
-j 传递参数给 jmap 启动的 JVM

Visual VM

  • 需要保持程序一致在运行中

  • 在jdk的bin目录下启动Visual VM在这里插入图片描述

  • 打开对应的程序进程
    在这里插入图片描述

  • 点击堆Dump
    在这里插入图片描述

  • 选择刚才导出的Dump
    在这里插入图片描述

  • 就可以看类对于实例数和大小,选中类右击在实例图中显示
    在这里插入图片描述

  • 监视CPU、类、堆、线程信息
    在这里插入图片描述

  • 查看CPU使用情况
    在这里插入图片描述

  • 线程使用情况
    在这里插入图片描述

  • 内存使用情况
    在这里插入图片描述

参考博客:
https://blog.csdn.net/qq_40991313/article/details/132382094
https://blog.csdn.net/qq_33204709/article/details/132126351

相关推荐

  1. jvm 方式

    2024-07-19 21:02:02       32 阅读
  2. JVM 21 指南:如何进行JVMJVM参数

    2024-07-19 21:02:02       57 阅读
  3. 基础 | JVM - [JVM ]

    2024-07-19 21:02:02       49 阅读
  4. jvm 参数

    2024-07-19 21:02:02       41 阅读
  5. <span style='color:red;'>JVM</span><span style='color:red;'>调</span><span style='color:red;'>优</span>

    JVM

    2024-07-19 21:02:02      52 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-19 21:02:02       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-19 21:02:02       72 阅读
  3. 在Django里面运行非项目文件

    2024-07-19 21:02:02       58 阅读
  4. Python语言-面向对象

    2024-07-19 21:02:02       69 阅读

热门阅读

  1. 计算机视觉10 总结

    2024-07-19 21:02:02       16 阅读
  2. 什么是RPC

    2024-07-19 21:02:02       19 阅读
  3. 《Exploring Orthogonality in Open World Object Detection》

    2024-07-19 21:02:02       19 阅读
  4. 电商B2B2C模式详细介绍

    2024-07-19 21:02:02       19 阅读
  5. ubuntu 22.04安装Eigen

    2024-07-19 21:02:02       20 阅读
  6. 【手撕数据结构】把玩顺序表

    2024-07-19 21:02:02       21 阅读
  7. 链表(Linked List)-Python实现-使用类和使用函数

    2024-07-19 21:02:02       24 阅读
  8. HTML语义化

    2024-07-19 21:02:02       22 阅读
  9. CSS 计数器:WebKit 的样式增强术

    2024-07-19 21:02:02       25 阅读