JVM之JDK 监控和故障处理工具总结

news2024/11/15 9:19:38

JDK 命令行工具

这些命令在 JDK 安装目录下的 bin 目录下:

  • jps (JVM Process Status): 类似 UNIX 的 ps 命令。用于查看所有 Java 进程的启动类、传入参数和Java 虚拟机参数等信息;
  • jstat(JVM Statistics Monitoring Tool): 用于收集 HotSpot虚拟机各方面的运行数据;
  • jinfo (Configuration Info for Java) : Configuration Info for Java,显示虚拟机配置信息;
  • jmap (Memory Map for Java) : 生成堆转储快照;
  • jhat (JVM Heap Dump Browser) : 用于分析 heapdump 文件,它会建立一个HTTP/HTML服务器,让用户可以在浏览器上查看分析结果;
  • jstack (Stack Trace for Java) :生成虚拟机当前时刻的线程快照,线程快照就是当前虚拟机内每一条线程正在执行的方法堆栈的集合。

jps:查看所有 Java 进程

jps(JVM Process Status) 命令类似 UNIX 的 ps 命令。
jps:显示虚拟机执行主类名称以及这些进程的本地虚拟机唯一 ID(Local Virtual Machine Identifier,LVMID)。jps -q :只输出进程的本地虚拟机唯一 ID。

C:\Users\SnailClimb>jps
7360 NettyClient2
17396
7972 Launcher
16504Jps
17340 NettyServer

jps -l:输出主类的全名,如果进程执行的是 Jar 包,输出 Jar 路径。

C:\Users\SnailClimb> jps -l
7360 firstNettyDemo.NettyClient2
17396
7972 org.jetbrains.jps.cmdline.Launcher
16492 sun.tools.jps.Jps
17340 firstNettyDemo.NettyServer

jps -v:输出虚拟机进程启动时 JVM 参数。

jps -m:输出传递给 Java 进程 main() 函数的参数。

jstat: 监视虚拟机各种运行状态信息

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

jstat 命令使用格式:

jstat - [-t] [-h] [ []]

比如 jstat -gc -h3 31736 1000 10表示分析进程 id 为 31736 的 gc 情况,每隔 1000ms 打印一次记录,打印 10 次停止,每 3 行后打印指标头部。

常见的 option 如下:

  • jstat -class vmid :显示 ClassLoader 的相关信息;
  • jstat -compiler vmid :显示 JIT 编译的相关信息;
  • jstat -gc vmid :显示与 GC 相关的堆信息;
  • jstat -gccapacity vmid :显示各个代的容量及使用情况;
  • jstat -gcnew vmid :显示新生代信息;
  • jstat -gcnewcapcacity vmid :显示新生代大小与使用情况;
  • jstat -gcold vmid :显示老年代和永久代的行为统计,从jdk1.8开始,该选项仅表示老年代,因为永久代被移除了;
  • jstat -gcoldcapacity vmid :显示老年代的大小;
  • jstat -gcpermcapacity vmid:显示永久代大小,从jdk1.8开始,该选项不存在了,因为永久代被移除了
  • jstat -gcutil vmid :显示垃圾收集信息;

另外,加上 -t参数可以在输出信息上加一个 Timestamp 列,显示程序的运行时间。

jinfo: 实时地查看和调整虚拟机各项参数

jinfo vmid :输出当前 jvm 进程的全部参数和系统属性 (第一部分是系统的属性,第二部分是 JVM 的参数)。

jinfo -flag name vmid :输出对应名称的参数的具体值。比如输出 MaxHeapSize、查看当前 jvm 进程是否开启打印 GC 日志 ( -XX:PrintGCDetails :详细 GC 日志模式,这两个都是默认关闭的)。

C:\Users\SnailClimb>jinfo  -flag MaxHeapSize 17340
-XX:MaxHeapSize=2124414976
C:\Users\SnailClimb>jinfo  -flag PrintGC 17340
-XX:-PrintGC

使用 jinfo 可以在不重启虚拟机的情况下,可以动态的修改 jvm 的参数。尤其在线上的环境特别有用,请看下面的例子:

jinfo -flag [+|-]name vmid 开启或者关闭对应名称的参数。

C:\Users\SnailClimb>jinfo  -flag  PrintGC 17340
-XX:-PrintGC

C:\Users\SnailClimb>jinfo  -flag  +PrintGC 17340

C:\Users\SnailClimb>jinfo  -flag  PrintGC 17340
-XX:+PrintGC

jmap:生成堆转储快照

jmap(Memory Map for Java)命令用于生成堆转储快照。 如果不使用 jmap 命令,要想获取 Java 堆转储,可以使用 “-XX:+HeapDumpOnOutOfMemoryError” 参数,可以让虚拟机在 OOM 异常出现之后自动生成 dump 文件,Linux 命令下可以通过 kill -3 发送进程退出信号也能拿到 dump 文件。

jmap 的作用并不仅仅是为了获取 dump 文件,它还可以查询 finalizer 执行队列、Java 堆和永久代的详细信息,如空间使用率、当前使用的是哪种收集器等。和jinfo一样,jmap有不少功能在 Windows 平台下也是受限制的。

示例:将指定应用程序的堆快照输出到桌面。后面,可以通过 jhat、Visual VM 等工具分析该堆文件。

C:\Users\SnailClimb>jmap
-dump:format=b,file=C:\Users\SnailClimb\Desktop\heap.hprof 17340 Dumping heap to C:\Users\SnailClimb\Desktop\heap.hprof … Heap dump
file created

jhat: 分析 heapdump 文件

jhat 用于分析 heapdump 文件,它会建立一个 HTTP/HTML 服务器,让用户可以在浏览器上查看分析结果。

C:\Users\SnailClimb>jhat C:\Users\SnailClimb\Desktop\heap.hprof
Reading from C:\Users\SnailClimb\Desktop\heap.hprof...
Dump file created Sat May 04 12:30:31 CST 2019
Snapshot read, resolving...
Resolving 131419 objects...
Chasing references, expect 26 dots..........................
Eliminating duplicate references..........................
Snapshot resolved.
Started HTTP server on port 7000
Server is ready.

访问 http://localhost:7000

jstack :

生成虚拟机当前时刻的线程快照

jstack(Stack Trace for Java)命令用于生成虚拟机当前时刻的线程快照。线程快照就是当前虚拟机内每一条线程正在执行的方法堆栈的集合.

生成线程快照的目的主要是定位线程长时间出现停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等都是导致线程长时间停顿的原因。线程出现停顿的时候通过jstack来查看各个线程的调用堆栈,就可以知道没有响应的线程到底在后台做些什么事情,或者在等待些什么资源。

下面是一个线程死锁的代码。我们下面会通过 jstack 命令进行死锁检查,输出死锁信息,找到发生死锁的线程。

public class DeadLockDemo {
    private static Object resource1 = new Object();//资源 1
    private static Object resource2 = new Object();//资源 2

    public static void main(String[] args) {
        new Thread(() -> {
            synchronized (resource1) {
                System.out.println(Thread.currentThread() + "get resource1");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread() + "waiting get resource2");
                synchronized (resource2) {
                    System.out.println(Thread.currentThread() + "get resource2");
                }
            }
        }, "线程 1").start();

        new Thread(() -> {
            synchronized (resource2) {
                System.out.println(Thread.currentThread() + "get resource2");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread() + "waiting get resource1");
                synchronized (resource1) {
                    System.out.println(Thread.currentThread() + "get resource1");
                }
            }
        }, "线程 2").start();
    }
}

Output

Thread[线程 1,5,main]get resource1
Thread[线程 2,5,main]get resource2
Thread[线程 1,5,main]waiting get resource2
Thread[线程 2,5,main]waiting get resource1

线程 A 通过 synchronized (resource1) 获得 resource1 的监视器锁,然后通过 Thread.sleep(1000);让线程 A 休眠 1s 为的是让线程 B 得到执行然后获取到 resource2 的监视器锁。线程 A 和线程 B 休眠结束了都开始企图请求获取对方的资源,然后这两个线程就会陷入互相等待的状态,这也就产生了死锁。

通过 jstack 命令分析:

C:\Users\SnailClimb>jps
13792 KotlinCompileDaemon
7360 NettyClient2
17396
7972 Launcher
8932 Launcher
9256 DeadLockDemo
10764 Jps
17340 NettyServer

C:\Users\SnailClimb>jstack 9256

输出的部分内容如下:

Found one Java-level deadlock:
=============================


"线程 2":
  waiting to lock monitor 0x000000000333e668 (object 0x00000000d5efe1c0, a java.lang.Object),
  which is held by "线程 1"
"线程 1":
  waiting to lock monitor 0x000000000333be88 (object 0x00000000d5efe1d0, a java.lang.Object),
  which is held by "线程 2"

Java stack information for the threads listed above:
===================================================
"线程 2":
        at DeadLockDemo.lambda$main$1(DeadLockDemo.java:31)
        - waiting to lock <0x00000000d5efe1c0> (a java.lang.Object)
        - locked <0x00000000d5efe1d0> (a java.lang.Object)
        at DeadLockDemo$$Lambda$2/1078694789.run(Unknown Source)
        at java.lang.Thread.run(Thread.java:748)
"线程 1":
        at DeadLockDemo.lambda$main$0(DeadLockDemo.java:16)
        - waiting to lock <0x00000000d5efe1d0> (a java.lang.Object)
        - locked <0x00000000d5efe1c0> (a java.lang.Object)
        at DeadLockDemo$$Lambda$1/1324119927.run(Unknown Source)
        at java.lang.Thread.run(Thread.java:748)

Found 1 deadlock.

可以看到 jstack 命令已经帮我们找到发生死锁的线程的具体信息。

JDK 可视化分析工具

JConsole:Java 监视与管理控制台

JConsole 是基于 JMX 的可视化监视、管理工具。可以很方便的监视本地及远程服务器的 java 进程的内存使用情况。你可以在控制台输出console命令启动或者在 JDK 目录下的 bin 目录找到jconsole.exe然后双击启动。

连接 Jconsole

在这里插入图片描述

如果需要使用 JConsole 连接远程进程,可以在远程 Java 程序启动时加上下面这些参数:

  1. -Djava.rmi.server.hostname=外网访问 ip 地址
  2. -Dcom.sun.management.jmxremote.port=60001 //监控的端口号
  3. -Dcom.sun.management.jmxremote.authenticate=false //关闭认证
  4. -Dcom.sun.management.jmxremote.ssl=false

在使用 JConsole 连接时,远程进程地址如下:

外网访问 ip 地址:60001

查看 Java 程序概况

在这里插入图片描述

内存监控

JConsole 可以显示当前内存的详细信息。不仅包括堆内存/非堆内存的整体信息,还可以细化到 eden 区、survivor 区等的使用情况,如下图所示。
点击右边的“执行 GC(G)”按钮可以强制应用程序执行一个 Full GC。

  1. 新生代 GC(Minor GC):指发生新生代的的垃圾收集动作,Minor GC 非常频繁,回收速度一般也比较快。
  2. 老年代GC(Major GC/Full GC):指发生在老年代的 GC,出现了 Major GC 经常会伴随至少一次的 MinorGC(并非绝对),Major GC 的速度一般会比 Minor GC 的慢 10 倍以上。

在这里插入图片描述

线程监控

类似我们前面讲的 jstack 命令,不过这个是可视化的。最下面有一个"检测死锁 (D)"按钮,点击这个按钮可以自动为你找到发生死锁的线程以及它们的详细信息 。
在这里插入图片描述

Visual VM:多合一故障处理工具

VisualVM 提供在 Java 虚拟机 (Java Virutal Machine, JVM) 上运行的 Java 应用程序的详细信息。在 VisualVM 的图形用户界面中,您可以方便、快捷地查看多个 Java 应用程序的相关信息。Visual VM 官网:添加链接描述。Visual VM 中文文档:添加链接描述

下面这段话摘自《深入理解 Java 虚拟机》。

VisualVM(All-in-One Java Troubleshooting Tool)是到目前为止随 JDK
发布的功能最强大的运行监视和故障处理程序,官方在 VisualVM
的软件说明中写上了“All-in-One”的描述字样,预示着他除了运行监视、故障处理外,还提供了很多其他方面的功能,如性能分析(Profiling)。VisualVM 的性能分析功能甚至比起 JProfiler、YourKit 等专业且收费的 Profiling 工具都不会逊色多少,而且 VisualVM
还有一个很大的优点:不需要被监视的程序基于特殊 Agent
运行,因此他对应用程序的实际性能的影响很小,使得他可以直接应用在生产环境中。这个优点是 JProfiler、YourKit
等工具无法与之媲美的。

VisualVM 基于 NetBeans 平台开发,因此他一开始就具备了插件扩展功能的特性,通过插件扩展支持,VisualVM 可以做到:

  1. 显示虚拟机进程以及进程的配置、环境信息(jps、jinfo)。
  2. 监视应用程序的CPU、GC、堆、方法区以及线程的信息(jstat、jstack)。
  3. dump以及分析堆转储快照(jmap、jhat)。
  4. 方法级的程序运行性能分析,找到被调用最多、运行时间最长的方法。
  5. 离线程序快照:收集程序的运行时配置、线程 dump、内存 dump 等信息建立一个快照,可以将快照发送开发者处进行 Bug 反馈。
  6. 其他 plugins 的无限的可能性…

这里就不具体介绍 VisualVM 的使用,如果想了解的话可以看:https://visualvm.github.io/documentation.htmlopen in new windowhttps://www.ibm.com/developerworks/cn/java/j-lo-visualvm/index.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/447798.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

虚拟人与娱乐传媒融合,推动综艺新模式

经过多年的更新迭代和市场的推动&#xff0c;虚拟人技术正在逐渐迈向成熟&#xff1a;3D虚拟形象的制作变得越来越精致且真实&#xff0c;并且出现了越来越多功能丰富使用便捷的动捕设备。因此&#xff0c;包括综艺影视在内的诸多领域&#xff0c;开始尝试将虚拟人技术融入行业…

DETR:end-to-end object detection with transformers

DETR 论文精读【论文精读】_哔哩哔哩_bilibili更多论文&#xff1a;https://github.com/mli/paper-reading/, 视频播放量 90699、弹幕量 493、点赞数 3566、投硬币枚数 2939、收藏人数 2564、转发人数 663, 视频作者 跟李沐学AI, 作者简介 &#xff0c;相关视频&#xff1a;在线…

【设计原则】依赖倒置原则--高层代码和底层代码到底谁该依赖谁?

文章目录 前言一、谁依赖谁二、依赖于抽象总结 前言 依赖这个词&#xff0c;程序员们都好理解&#xff0c;意思就是&#xff0c;我这段代码用到了谁&#xff0c;我就依赖了谁。依赖容易有&#xff0c;但能不能把依赖弄对&#xff0c;就需要动点脑子了。 如果依赖关系没有处理…

【红队APT】反朔源隐藏C2项目CDN域前置云函数数据中转DNS转发

文章目录 域前置-CDN隐藏C2真实IP 防止被溯源什么是域前置条件原理 完整复现域前置溯源 DNS协议-域名记录解析云函数-腾讯云操作云函数如何溯源 端口转发-Iptables中间件反向代理-Apache 域前置-CDN隐藏C2真实IP 防止被溯源 国内外云服务上大部分已经不支持域前置了&#xff0…

局域网哪些特点?快解析内网穿透实现外网访问局域网SVN

无线局域网传统是有线局域网络的补充和扩展&#xff0c;具有灵活性、可移动性及较低的投资成本等优势&#xff0c;受到了家庭网络用户、中小型办公室用户、广大企业用户及电信运营商的青睐&#xff0c;成为当前整个数据通信领域发展最快的产业之一。 局域网一般为一个单位所建&…

(20230418 SALE算法)个人模型学习笔记记录 500

写给自己: 一、先不做对称的结构试一下,上一个ALE的模型,记得有次没有做对称结构,居然需要11天才能算完,当时吓得我赶紧删除了,做了对称结构。先试一下这个S-ALE能否不做成对称的。但是我感觉或许也会计算很长时间。要不我先试一下。 写给自己: 一、先不做对称的结构…

【UE 控件蓝图】通过键盘选中要点击的按钮 通过Enter键点击

上一篇【UE 控件蓝图】菜单及功能实现博客已经完成了菜单的制作&#xff0c;但是我们只能通过鼠标来点击菜单选项&#xff0c;本篇博客实现的是能够通过键盘的上下键来选中按钮&#xff0c;然后按下“Enter”键来实现点击按钮的效果。 效果 可以看到并没有移动鼠标也可以通过…

Node【Global全局对象】之【Console】

文章目录 &#x1f31f;前言&#x1f31f;Console模块&#x1f31f;console对象方法&#x1f31f;console.log()&#x1f31f;console.dir()&#x1f31f;console.time()&#x1f31f;console.assert()&#x1f31f;console.trace()&#x1f31f;写在最后 &#x1f31f;前言 哈…

升级数智化底座领先实践:北京地铁加速财务数智化转型

近年来&#xff0c;数字经济蓬勃发展&#xff0c;正在成为重组全球要素资源、重塑全球经济结构、改变全球竞争格局的关键力量。中共中央、国务院印发的《数字中国建设整体布局规划》再次明确指出&#xff0c;做强做优做大数字经济。推动数字技术和实体经济深度融合&#xff0c;…

如何使用Postman做多接口测试【实战】

1. 摘要 本文讲解使用postman做接口测试和批量接口测试的方法。 2.实践内容 2.1 环境变量和全局变量的设置&#xff1a; a. 环境变量的设置方法如下图。点击设置一个环境变量&#xff0c;名为"user_pwd", 里面设置username 和passwd的值&#xff0c;然后在请求中…

gdb切换窗口焦点

为了辅助调试&#xff0c;一般会使用layout src&#xff0c;调起TUI显示代码&#xff1a; 然而这种情况下我们写命令很不方便&#xff0c;无法方便地使用上一条命令、退格等。 按动上下左右方向键盘只会移动代码框&#xff0c;然而在伪终端下&#xff0c;可以用鼠标滚轮来上下…

同步TMS-fMRI研究脑功能网络的指南

导读 经颅磁刺激(TMS)可直接激活人脑新皮层中的神经元&#xff0c;并已被证明是认知神经科学因果假设检验的基础。通过同时使用TMS和fMRI&#xff0c;皮层TMS对远端皮层和皮层下结构活动的影响可以通过改变TMS输出强度来量化。然而&#xff0c;TMS在fMRI时间序列中产生了显著的…

Google Earth Engine谷歌地球引擎GEE合并多个不同Asset的方法

本文介绍在GEE中&#xff0c;将多个存储有点要素的Asset加以合并&#xff0c;使得其成为一个Asset的方法。 本文是谷歌地球引擎&#xff08;Google Earth Engine&#xff0c;GEE&#xff09;系列教学文章的第十五篇&#xff0c;更多GEE文章请参考专栏&#xff1a;GEE学习与应用…

银行数字化转型导师坚鹏:商业银行数字化风控(2天)

商业银行数字化风控 课程背景&#xff1a; 数字化背景下&#xff0c;很多银行存在以下问题&#xff1a; 不清楚商业银行数字化风控发展现状&#xff1f; 不清楚对公业务数字化风控工作如何开展&#xff1f; 不知道零售业务数字化风控工作如何开展&#xff1f; 课程特色…

web攻防-通用漏洞验证码识别复用调用找回密码重定向状态值

目录 一、知识点概述 二、找回密码过程中涉及到的安全问题 三、案例演示 <验证码回显> <修改Response状态值> <验证码爆破> 四、真实案例1 <更改状态值> <验证码接口调用> 五、真实案例2 <用户名重定向> 六、安全修复方案 一、…

C语言实现栈--数据结构

魔王的介绍&#xff1a;&#x1f636;‍&#x1f32b;️一名双非本科大一小白。魔王的目标&#xff1a;&#x1f92f;努力赶上周围卷王的脚步。魔王的主页&#xff1a;&#x1f525;&#x1f525;&#x1f525;大魔王.&#x1f525;&#x1f525;&#x1f525; ❤️‍&#x1…

【半个月实践】普通人如何利用ChatGPT变现?(附镜像网站)

前言1.PPT2.百度问答3.代写文章4.设计LOGO 前言 如今ChatGPT的话题爆火各大平台&#xff0c;所谈论的方向也各不相同&#xff0c;或许是ChatGPT使用方法、应用领域、前景趋势等等。而这必然也产生了信息差&#xff0c;使得大多数人可以利用ChatGPT变现。   而在这一开始&…

嵌入式QT (使用 Qt Designer 开发)

一、使用 UI 设计器开发程序 1.1、 在 UI 文件添加一个按钮 1.2、在 UI 文件里连接信号与槽 所谓信号即是一个对象发出的信号&#xff0c;槽即是当这个对象发出这个信号时&#xff0c;对应连接的槽就发被执行或者触发。 UI 设计器里信号与槽的连接方法一&#xff1a; 在主窗…

分类预测 | MATLAB实现BO-CNN-LSTM贝叶斯优化卷积长短期记忆网络多输入分类预测

分类预测 | MATLAB实现BO-CNN-LSTM贝叶斯优化卷积长短期记忆网络多输入分类预测 目录 分类预测 | MATLAB实现BO-CNN-LSTM贝叶斯优化卷积长短期记忆网络多输入分类预测效果一览基本介绍模型搭建程序设计参考资料 效果一览 基本介绍 MATLAB实现BO-CNN-LSTM贝叶斯优化卷积长短期记…

TCP长连接的连接池、容量控制与心跳保活

一、长连接与短连接 TCP 本身并没有长短连接的区别&#xff0c;长短与否&#xff0c;完全取决于我们怎么用它。 短连接&#xff1a;每次通信时&#xff0c;创建 Socket;一次通信结束&#xff0c;调用 socket.close()。这就是一般意义上的短连接&#xff0c;短连接的好处是管理…