【Java JVM】JVM 分析工具
在 $JAVA_HOME/bin 的目录下, 存在着许多小工具, 除了编译和运行 Java 程序外, 打包, 部署, 签名, 调试, 监控, 运维等各种场景都可能会用到它们。
1 常用的命令行工具
1.1 jps (JVM Process Status Tool) - 虚拟机进程状况工具
列出正在运行的虚拟机进程, 并显示虚拟机执行主类 (Main Class, 也就是 main 方法所在的类) 的名称以及这些进程的本地虚拟机唯一 ID (LVMID,Local Virtual Machine Identifier)。
命令格式
jps [options] [<hostid>]
options 列表
选项 | 作用 |
---|---|
-q | 只输出 LVMID, 省略主类的名称 |
-m | 输出虚拟机进程启动时, 传递给 main 方法的参数 |
-l | 输出主类的全名称, 如果进程执行的是 jar 包, 输出 jar 包路径 |
-v | 输出 JVM 进程启动时的 JVM 参数 |
-V | 输出 LVMID 和主类的类名, 不带任何参数的 jps, 默认就是这个格式 |
jps 还可以查询开启了 RMI 服务的远程虚拟机进程状态, 参数 hostId 为 RMI 注册表中注册的主机名。开启 RMI 的步骤, 可以看这里。
1.2 jstat (JVM Statistics Monitoring Tool) - 虚拟机统计信息监视工具
用于监视虚拟机各种运行状态信息的命令行工具。它可以显示本地或者远程虚拟机进程中的类加载, 内存, 垃圾收集, 即时编译等运行时数据。
命令格式
jstat -<options> [-t] [-h<lines>] <vmid> [<interval> [<count>]]
options 列表
选项 | 作用 |
---|---|
-class | 监视类加载/卸载数量, 总空间和类装载消耗时间 |
-gc | 监视堆状况, 包括 Eden 区/ 2 个 Survivor 区/老年代/永久代 等容量, 已用空间, 垃圾收集时间合计等信息 |
-gccapacity | 监视内容和 -gc 差不多, 但输出内容主要关注的是 Java 堆各个区域的使用到的最大, 最小空间 |
-gcutil | 监视内容和 -gc 差不多, 但输出内容主要关注的是 Java 堆各个区域已使用空间占总空间的百分比 |
-gccause | 和 -gcutil 功能一样, 但是会多输出导致上一次垃圾回收产生的原因 |
-gcnew | 监视新生代垃圾回收情况 |
-gcnewcapacity | 监视内容和 -gcnew 基本一样, 输出主要关注使用到的最大, 最小空间 |
-gcold | 监视老年代垃圾回收情况 |
-gcoldcapacity | 监视内容和 -gcold 基本一样, 输出主要关注使用到的最大, 最小空间 |
-gcpermcapacity | 输出永久代使用到的最大, 最小空间 |
-compiler | 输出即时编译器编译过的方法, 耗时等信息 |
-printcompilation | 输出已经被即时编译的方法 |
-t: 用于在最前面输出一个时间戳
-h: 格式 -h数字, 需要搭配后面的循环打印使用, 比如 5, 每个标题头下面输出 5 次结果后, 再次输出标题头, 再 5 次结果
vmid: 如果是本地的话, 就是 LVMID, 如果是远程的服务器的话, 则是类似于这样的格式 [protocol:][//]lvmid[@hostname[:port]/servername]
interval: 间隔多少毫秒查询 1 次, 如果为 数字 + s, 则是多少秒查询 1 次
count: 循环查询的次数
例子:
jstat -gcutil 2764S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
0.00 29.95 22.24 0.01 94.34 82.22 1 0.011 0 0.000 0.011
查询结果表明: 这台服务器的新生代 Eden 区 (E, 表示Eden) 使用了 22.24% 的空间, 2 个 Survivor 区 (S0, S1表示 Survivor0 和 Survivor1) 里面都是空的, 分别为空的和占了 29.95% 的空间, 老年代 (O, 表示 Old) 和 元空间 (M, 表示 Metaspace) 则分别使用了 0.01% 和 94.34% 的空间。
程序运行以来共发生 Minor GC (YGC, 表示 Young GC) 1次, 总耗时0.011秒; 发生 Full GC (FGC, 表示 Full GC) 0 次, 总耗时 (FGCT,表示 Full GC Time) 为 0.472 秒; 所有 GC 总耗时 (GCT, 表示 GC Time) 为 0.577 秒
1.3 jinfo (Configuration Info for Java) - Java 配置信息工具
实时查看和调整虚拟机各项参数
命令格式
jinfo -<options> <pid>
options 列表
选项 | 作用 |
---|---|
-flag name | 输出指定的 JVM 参数的值 |
-flag +/- name | 动态的启用/关闭指定的 JVM 参数 |
-flag name=value | 动态的设置 JVM 参数为给定的值 |
-flags | 输出所有的 JVM 参数 |
-sysprops | 输出当前的 Java 系统属性, 内容等同与 Java 内部的 System.getProperties() |
1.4 jmap (Memory Map for Java) - Java 内存映像工具
jmap 的作用并不仅仅是为了获取堆转储快照 (一般称为 heapdump 或 dump 文件), 它还可以查询 finalize 执行队列, Java 堆和方法区的详细信息, 如空间使用率, 当前用的是哪种收集器等
命令格式
jmap -<options> <pid>
options 列表
选项 | 作用 |
---|---|
-dump | 生成 Java 堆转储快照, 格式为 -dump:[live,]format=b,file=<文件名>, live 参数用于控制是否只 dump 出存活的对象 |
-finalizerinfo | 显示在 F-Queue 中等待 Finalizer 线程执行 finalize 方法的对象, 只在 Linux/Solaris 平台有效 |
-heap | 显示 Java 堆的详细信息, 如使用的是哪种收集器, 参数配置, 分代状况等, 只在 Linux/Solaris 平台有效 |
-histo | 显示堆中对象统计信息, 包含类/实例数量, 合集容量, 格式为 -histo[:live,][file=<文件名>], live 参数用于控制统计活对象, 同样的也可以直接把内容输出为文件 |
-permstat | 以 ClassLoader 为统计口径显示永久代内存状态, 只在 Linux/Solaris 平台有效 |
-F | 当虚拟机对 -dump 选项没有任何反应, 可使用这个参数强制 dump 出快照, 只在 Linux/Solaris 平台有效 |
除了手动生成快照的方式, 也可以通过配置 JVM 参数 XX: +HeapDumpOnOutOfMemoryError, 当程序内存溢出时, 生成 dump 文件
也可以通过设置 -XX: +HeapDumpOnCtrlBreak 参数, 然后通过 [Ctrl]+[Break] 键让虚拟机生成堆转储快照文件
在 Linux 中也可以通过 “Kill -3” 来获取堆转储快照
1.5 jhat (JVM Heap Analysis Tool) - 虚拟机堆转储快照分析工具
jhat 内置了一个微型的HTTP/Web服务器, 可以用来分析 jmap 生成的 dump 文件, 同时生成堆转储快照的分析结果后。
但是实际中很少会使用这个来分析 dump 文件, 有很多更智能的图形化工具可以使用。
命令格式
jhat dump文件
通过上面的命令, 当显示 “Server is Ready” 的提示后, 通过输入 localhost:7000 就能查看分析信息。
1.6 jstack (Stack Trace for Java) - Java 堆栈跟踪工具
用于生成虚拟机当前时刻的线程快照 (一般称为 threaddump 或者 javacore 文件)。
线程快照就是当前虚拟机内每一条线程正在执行的方法堆栈的集合, 生成线程快照的 目的通常是定位线程出现长时间停顿的原因, 如线程间死锁, 死循环, 请求外部资源导致的长时间挂起等, 都是导致线程长时间停顿的常见原因。
线程出现停顿时通过 jstack 来查看各个线程的调用堆栈, 就可以获知没有响应的线程到底在后台做些什么事情, 或者等待着什么资源。
命令格式
jstack -<options> vmid
options 列表
选项 | 作用 |
---|---|
-F | 当正常的输出请求无响应时, 强制输出线程堆栈信息 |
-l | 除堆栈信息外, 显示锁的附加信息 |
-m | 如果调用到了本地方法的话, 输出 C/C++ 的堆栈 |
在 $JAVA_HOME/bin 下除了列出的这几个常用的工具外, 还有许多有用的工具, 如 javap 字节码分析工具, javac java 类文件转字节码文件等。
2 JVM 可视化工具
2.1 JHSDB - JDK 自带的工具
JHSDB 是一款基于服务性代理 (Serviceability Agent, SA) 实现的进程外调试工具。
服务性代理是 HotSpot 虚拟机中一组用于映射Java虚拟机运行信息的, 主要基于 Java 语言 (含少量 JNI 代码) 实现的 API 集合。
服务性代理以 HotSpot 内部的数据结构为参照物进行设计, 把这些 C++ 的数据抽象出 Java 模型对象, 相当于 HotSpot 的 C++ 代码的一个镜像。
通过服务性代理的 API, 可以在一个独立的 Java 虚拟机的进程里分析其他 HotSpot 虚拟机的内部数据, 或者从 HotSpot 虚拟机进程内存中 dump 出来的转储快照里还原出它的运行状态细节。
基于 JHSDB 的特点一般用于分析处于静止不变的程序, 比如卡在 debug 或者 dump 文件。
使用 JHSDB 的步骤
- 当前你有一个卡在 debug 的程序或者一份 dump 文件
- 启动 JHSDB, JDK8 中通过 java -cp $JAVA_HOME/lib/sa-jdi.jar sun.jvm.hotspot.HSDB, 启动 JHSDB 的图形化界面, 通过
java -cp $JAVA_HOME/lib/sa-jdi.jar sun.jvm.hotspot.CLHSDB 启动 JHSDB 的命令行界面, JDK9 及以后可以转到 $JAVA_HOME/bin,
执行 jhsdb hsdb (本人在 Mac 一直失败, 貌似 JDK8 在 Mac 上有 bug, 可以尝试升级 JDK 的版本, 在 Window10 成功关联上了)- 获取当前执行的中的 Java 程序的进程 ID
- 打开图形化界面, 左上角的 File, 选择关联进程 ID / dump 文件 / 服务地址
后面就是分析相关的操作了
操作可以看这里
2.2 JConsole
JConsole (Java Monitoring and Management Console) 是一款基于 JMX (Java Management Extensions) 的可视化监视,管理工具。它的主要
功能是通过 JMX 的 MBean (Managed Bean) 对系统进行信息收集和参数动态调整。
在 $JAVA_HOME/bin 下面有一个 jconsole 的脚本, 直接执行它, 就会出现一个图形化界面, 在首页选中自己的进程, 就能进入分析。
2.3 VisualVM
VisualVM (All-in-One Java Troubleshooting Tool) 是功能最强大的运行监视和故障处理程序之一, 着它除了常规的运行监视, 故障处理外,还将提
供其他方面的能力, 譬如性能分析 (Profiling)。
在 $JAVA_HOME/bin 下面有一个 jvisualvm 的脚本, 直接执行它, 就会出现一个图形化界面, 在左侧的应用程序选中自己的程序即可。
VisualVM 可以做到:
- 显示虚拟机进程以及进程的配置, 环境信息 (jps, jinfo)
- 监视应用程序的处理器, 垃圾收集, 堆, 方法区以及线程的信息 (jstat, jstack)
- dump 以及分析堆转储快照 (jmap, jhat)
- 方法级的程序运行性能分析, 找出被调用最多, 运行时间最长的方法
- 离线程序快照: 收集程序的运行时配置, 线程 dump, 内存 dump 等信息建立一个快照, 可以将快照发送开发者处进行 Bug 反馈
- VisualVM 只提供了基础的功能, 同时支持大量的插件, 通过安装插件, 可以带来的无限可能性
2.4 商业版工具
Oracle 公司还开辟过带商业技术支持的工具
- 用于企业 JRE 定制管理的 AMC (Java Advanced Management Console) 控制台
- 系统跟踪的 JUT (Java Usage Tracker)
- 用于持续收集数据的飞行记录仪 JFR (Java Flight Recorder)
- 用于监控 Java 虚拟机的JMC (Java Mission Control)
3 第三方工具
通过 jmap 生成的 dump 文件, 除了可以通过 jhat 来分析外, 还可以通过其他的工具来分析, 如下面的这些工具
- MAT
- JProfiler
- 第三方的网站, 如 HeapDump
通过配置 JVM 启动参数生成的 GC 文件分析工具
- GCViewer
- 第三方的网站, 如 Ycrash GCeasy
相关文章:
【Java JVM】JVM 分析工具
在 $JAVA_HOME/bin 的目录下, 存在着许多小工具, 除了编译和运行 Java 程序外, 打包, 部署, 签名, 调试, 监控, 运维等各种场景都可能会用到它们。 1 常用的命令行工具 1.1 jps (JVM Process Status Tool) - 虚拟机进程状况工具 列出正在运行的虚拟机进程, 并显示虚拟机执行…...
融资项目——vue之双向数据绑定
上一篇文章中使用的v-bind是单向绑定方法,即数据改变,网页相应的视图发生改变,但是网页视图发生改变其相关联的数据不会发生改变。但是双向数据绑定不同之处在于网页视图发生改变其相关联的数据也会发生改变。Vue可以使用v-model进行双向数据…...
『番外篇五』SwiftUI 进阶之如何动态获取任意视图的 tag 和 id 值
概览 在某些场景下,我们需要用代码动态去探查 SwiftUI 视图的信息。比如任意视图的 id 或 tag 值: 如上图所示:我们通过动态探查技术在运行时将 SwiftUI 特定视图的 tag 和 id 值显示在了屏幕上。 这是如何做到的呢? 在本篇博文,您将学到如下内容: 概览1. “如意如意,…...
姿态识别、目标检测和跟踪的综合应用
引言: 近年来,随着人工智能技术的不断发展,姿态识别、目标检测和跟踪成为了计算机视觉领域的热门研究方向。这三个技术的综合应用为各个行业带来了巨大的变革和机遇。本文将分别介绍姿态识别、目标检测和跟踪的基本概念和算法,并探…...
数据结构考试测试编程题
作者前言 🎂 ✨✨✨✨✨✨🍧🍧🍧🍧🍧🍧🍧🎂 🎂 作者介绍: 🎂🎂 🎂 🎉🎉🎉…...
力扣每日一题day37[113.路径总和ii]
给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。 叶子节点 是指没有子节点的节点。 示例 1: 输入:root [5,4,8,11,null,13,4,7,2,null,null,5,1], targetSum 22 输出&a…...
Keras使用sklearn中的交叉验证和网格搜索
Keras是Python在深度学习领域非常受欢迎的第三方库,但Keras的侧重点是深度学习,而不是所以的机器学习。事实上,Keras力求极简主义,只专注于快速、简单地定义和构建深度学习模型所需要的内容。Python中的scikit-learn是非常受欢迎的…...
docker--Prometheus、Grafana、node_exporter的安装配置及Springboot集成Prometheus示例
1. 安装Prometheus Prometheus一个系统和服务监控系统。它以给定的时间间隔从配置的目标收集指标,计算规则表达式,显示结果,并在观察到某些条件为真时触发警报。 可观察性侧重于根据系统产生的数据了解系统的内部状态,这有助于确定基础设施是否健康。Prometheus是用于监视…...
数据结构和算法笔记2:二分法
二分法网上有两种写法,一种左闭右闭,一种左闭右开,个人习惯左闭右闭的写法, 有序数组查找数 这是标准二分法,对应力扣的704. 二分查找: 求值为target的索引 int search(vector<int>& nums, i…...
Mybatis3系列课程8-带参数查询
简介 上节课内容中讲解了查询全部, 不需要带条件查, 这节我们讲讲 带条件查询 目标 1. 带一个条件查询-基本数据类型 2.带两个条件查询-连个基本数据类型 3.带一个对象类型查询 为了实现目标, 我们要实现 按照主键 查询某个学生信息, 按照姓名和年级编号查询学生信息 按照学生…...
IDEA shorten command line介绍和JAR manifest 导致mybatis找不到接口类处理
如果类路径太长,或者有许多VM参数,程序就无法启动。原因是大多数操作系统都有命令行长度限制。在这种情况下,IntelliJIDEA将试图缩短类路径。最好选中 classpath file模式。 shorten command line 选项提供三种选项缩短类路径。 none&#x…...
泽攸科技SEM台式扫描电子显微镜
泽攸科技是一家国产的科学仪器公司,专注于研发、生产和销售原位电镜解决方案、扫描电镜整机、台阶仪、探针台等仪器。目前台式扫描电镜分为三个系列:ZEM15、ZEM18、ZEM20。 ZEM15台式扫描电镜: ZEM18台式扫描电镜: ZEM20台式扫描…...
华为交换机配置BGP的基本示例
BGP简介 定义 边界网关协议BGP(Border Gateway Protocol)是一种实现自治系统AS(Autonomous System)之间的路由可达,并选择最佳路由的距离矢量路由协议。早期发布的三个版本分别是BGP-1(RFC1105࿰…...
数据分析基础之《numpy(4)—ndarry运算》
一、逻辑运算 当我们要操作符合某一条件的数据时,需要用到逻辑运算 1、运算符 满足条件返回true,不满足条件返回false # 重新生成8只股票10个交易日的涨跌幅数据 stock_change np.random.normal(loc0, scale1, size(8, 10))# 获取前5行前5列的数据 s…...
分享一个项目——Sambert UI 声音克隆
文章目录 前言一、运行ipynb二、数据标注三、训练四、生成总结 前言 原教程视频 项目链接 运行一个ipynb,就可操作 总共四步 1)运行ipynb 2)数据标注 3)训练 4)生成 一、运行ipynb 等运行完毕后,获得该…...
ES6 语法精粹简读
本文旨在记录 ES6 的核心常用语法,略去一些细节。 文章目录 1 var 函数作用域与 let/const 块作用域2 解构赋值数组结构赋值对象结构赋值3 ES6 中字符串的新语法模板字符串模板编译标签模板4 ES6 中的函数默认值rest 参数箭头函数this 指向问题部署管道机制尾调用优化...
uniapp整合echarts(目前性能最优、渲染最快方案)
本文echarts示例如上图,可扫码体验渲染速度及loading效果,下文附带本小程序uniapp相关代码 实现代码 <template><view class="source...
解决Electron应用中的白屏问题的实用方法
在使用Electron构建应用程序时,一些开发者可能会面临窗口加载过程中出现的白屏问题。这种问题主要分为两个方面: Electron未加载完毕HTML: 这时Electron自身产生的白色背景可能导致用户在启动应用时看到一片空白。HTML加载渲染过程中的短暂白…...
大数据---34.HBase数据结构
一、HBase简介 HBase是一个开源的、分布式的、版本化的NoSQL数据库(即非关系型数据库),依托Hadoop分布式文件系统HDFS提供分布式数据存储,利用MapReduce来处理海量数据,用Zookeeper作为其分布式协同服务,一…...
【工具使用-有道云笔记】如何在有道云笔记中插入目录
一,简介 本文主要介绍如何在有道云笔记中插入目录,方便后续笔记的查看,供参考。 二,具体步骤 分为两个步骤:1,设置标题格式;2,插入标题。非常简单~ 2.1 设置标题格式 鼠标停在标…...
用户管理第2节课-idea 2023.2 后端一删除表,从零开始---【本人】
一、清空model文件夹下,所有文件 1.1.1效果如下: 1.1代码内容 package com.daisy.usercenter.model;import lombok.Data;Data public class User {private Long id;private String name;private Integer age;private String email; }二、清空mapper文件…...
如何添加jar包到本地Maven项目中
在 Maven 中添加一个外部 JAR 包的依赖,你需要使用 Maven 的 <dependency> 元素来指定该 JAR 包的坐标信息。以下是具体的步骤: 将 JAR 包手动添加到 Maven 本地仓库: 首先,确保将外部 JAR 包手动添加到 Maven 本地仓库。可…...
智能优化算法应用:基于学校优化算法3D无线传感器网络(WSN)覆盖优化 - 附代码
智能优化算法应用:基于学校优化算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于学校优化算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.学校优化算法4.实验参数设定5.算法结果6.…...
【MATLAB第85期】基于MATLAB的2023年智能进化算法/元启发式算法合集(持续更新)
【MATLAB第85期】基于MATLAB的2023年智能进化算法/元启发式算法合集(持续更新) 1.海象进化算法(Walrus Optimization Algorithm) 作者:Pavel Trojovsk and Mohammad Dehghani 2.暴龙优化算法(Tyrannosa…...
[Realtek sdk-3.4.14b]RTL8197FH-VG+RTL8812F WiFi使用功率限制功能使用说明
sdk说明 ** Gateway/AP firmware v3.4.14b – Aug 26, 2019** Wireless LAN driver changes as: Refine WiFi Stability and Performance Add 8812F MU-MIMO Add 97G/8812F multiple mac-clone Add 97G 2T3R antenna diversity Fix 97G/8812F/8814B MP issu…...
Vue中为什么data属性是一个函数而不是一个对象?(看完就会了)
文章目录 一、实例和组件定义data的区别二、组件data定义函数与对象的区别三、原理分析四、结论 一、实例和组件定义data的区别 vue实例的时候定义data属性既可以是一个对象,也可以是一个函数 const app new Vue({el:"#app",// 对象格式data:{foo:&quo…...
Linux中一些知识积累(持续补充)
如何安装Eigen3库? 在linux中直接命令安装。Eigen/Dense 是 Eigen 库中的一个模块,提供了对密集矩阵(Dense Matrix)的支持。 sudo apt install libeigen3-devLinux 中VScode中运行C时,gdb 的Launch与Attach有什么区别…...
内网渗透基础
内网 内网指的是内部局域网,常说的LAN(local area network)。常见家庭wifi网络和小型的企业网络,通常内部计算机直接访问路由器设备,路由器设备接入移动电信的光纤实现上网。 内部局域网可以通过交换机/防火墙组成多个…...
【2023年网络安全优秀创新成果大赛专刊】银行数据安全解决方案(天空卫士)
在2023年网络安全优秀创新成果大赛,成都分站中,天空卫士银行数据安全方案获得优秀解决方案奖。与此同时,天空卫士受信息安全杂志邀请,编写《银行数据安全解决方案》。12月6日,天空卫士编写的《银行数据安全解决方案》做…...
嵌入式串口输入详细实例
学习目标 掌握串口初始化流程掌握串口输出单个字符掌握串口输出字符串掌握通过串口printf熟练掌握串口开发流程学习内容 需求 串口循环输出内容到PC机。 串口数据发送 添加Usart功能。 首先,选中Firmware,鼠标右键,点击Manage Project Items 接着,将gd32f4xx_usart.c添…...
400元做网站送网推/怎么做推广赚钱
http://httpsegmenter.googlecode.com/svn/...
档案网站建设对比/百度指数指的是什么
*CTF2022 oh-my-lotto&revenge 文章目录*CTF2022 oh-my-lotto&revenge简单分析下源码lottoapp非预期解修改PATH变量WGETRC预期解参考链接简单分析下源码 题目给了附件,主要看app,lotto,docker-compose.yml 这里是开了两个容器,然后通过links进行…...
深圳 b2c 网站建设/百度学术官网入口
一、AI可解释性 1.什么是可解释性? 可解释性,就是我们需要完成一件事的时候,我们能获取到的足够多的,能让我们自己理解的信息。当我们不能获得足够多的信息,来理解一件事情的时候,我们可以说这是不可解释…...
西安免费做网站公司/百度一下首页官网百度
https://blog.csdn.net/qq_36667170/article/details/79341379...
社交app开发成本预算表/优化网站的方法有哪些
实现了 出/入 分别计数; - 检测类别:行人、自行车、小汽车、摩托车、公交车、卡车。 -支持yolov5s.pt yolov5x.pt yolov5m.pt yolov5l.pt模型...
网站开发简单的框架/关键路径
当我们在进行数据分析时,除了对比现有的数据信息外,还能通过现有的数值计算出其他变量的参数。不过这就需要用到IBM SPSS Statistics中计算变量命令了。今天,我就以一组产品销售的数据为例,向大家演示一下SPSS计算变量的操作方法。…...