Java8文档阅读——工具篇

监控 Java 应用程序

jconsole

在这里插入图片描述

启动一个图形化控制台,用于监控和管理 Java 应用程序。

jconsole [ options ] [ connection ... ]

jconsole的参数如下:
-interval=n:设置更新间隔为n秒(默认为4秒)。
-notile:初始时不平铺窗口(适用于两个或更多连接)。
-pluginpath plugins:指定要搜索JConsole插件的目录或JAR文件列表。插件路径应包含一个名为META-INF/services/com.sun.tools.jconsole.JConsolePlugin的provider-configuration文件,其中包含每个插件的一行。该行指定实现com.sun.tools.jconsole.JConsolePlugin类的完全限定类名。
-version:显示发布信息并退出。
-help:显示帮助消息。
-Jflag:将标志传递给运行jconsole命令的JVM。

jvisualvm

在这里插入图片描述
JavaVisualVM是一个图形用户界面工具,用于监控和分析在指定Java虚拟机(JVM)上运行的Java应用程序。它提供了关于JVM软件的直观信息。JavaVisualVM集成了多个监视、故障排除和分析实用程序,如jmap、jinfo、jstat和jstack。此外,它还可以通过插件扩展功能,例如jconsole命令提供的一些功能可以作为可选插件添加。

JavaVisualVM对于Java应用程序开发人员来说非常有用,因为它可以帮助他们进行故障排除、监控和改进应用程序的性能。它可以生成和分析堆转储,跟踪内存泄漏,执行和监控垃圾回收机制,以及执行轻量级内存和CPU分析。

要使用JavaVisualVM,您需要选择工具,然后在JavaVisualVM菜单中选择插件。您可以从标准JavaVisualVM插件库中进行选择,以扩展其功能。例如,jconsole命令的大部分功能可以通过MBeans选项卡和JConsole Plug-in Wrapper插件获得。

使用以下命令启动JavaVisualVM:

jvisualvm [ options ]

在启动Java VisualVM时,可以使用以下选项:

-Jjvm_option
将此jvm_option传递给JVM软件

Java VisualVM官网介绍:https://docs.oracle.com/javase/8/docs/technotes/guides/visualvm/intro.html

监控 JVM

jps♥♥♥♥♥

命令格式:

jps [ options ] [ hostid ]

jps命令用于列出目标系统上的Java HotSpot虚拟机(JVM)。该命令仅限于报告它具有访问权限的JVM信息。

如果在运行jps命令时没有指定hostid,它会在本地主机上搜索已检测到的JVM。如果指定了hostid,它会使用指定的协议和端口在指定的主机上搜索JVM,假设目标主机上运行着jstatd进程。

对于在目标系统上找到的每个已检测的JVM,jps命令会报告本地JVM标识符(lvmid)。lvmid通常是操作系统对JVM进程的进程识别号,但并不总是这样。在没有选项的情况下,jps会列出每个Java应用程序的lvmid,后面跟着应用程序类名或jar文件名的缩写形式。类名或JAR文件名的缩写形式省略了类的包信息或JAR文件路径信息。

使用jps命令,Java启动器可以查找传递给main方法的类名和参数。如果使用自定义启动器启动目标JVM,则类名或JAR文件名以及main方法的参数可能不可用。在这种情况下,jps命令会输出字符串"Unknown"作为类名或JAR文件名以及main方法的参数。

由jps命令生成的JVM列表可能受到运行该命令的主体所拥有的权限的限制。该命令仅列出主体具有访问权限的JVM,访问权限由操作系统特定的权限机制确定。

在这里插入图片描述

jstat♥♥♥♥♥

jstat 是一个用于监控 Java 虚拟机(JVM)统计信息的命令行工具。它提供了关于 JVM 运行时状态的实时数据,包括垃圾收集、类加载、即时编译等信息。

以下是 jstat 命令的基本语法:

jstat [ generalOption | outputOptions vmid [ interval[s|ms] [ count ] ]

其中:

  • generalOption 是可选的一般选项,例如 -help-options
  • outputOptions 指定要显示的统计信息类型。
  • vmid 是要监控的 Java 虚拟机进程的标识符。
  • interval 是采样间隔,可以是秒(s)或毫秒(ms)。
  • count 是采样次数,表示要收集多少次样本。

一些常用的 outputOptions 包括:

  • gcutil:显示垃圾收集统计信息。
  • class:显示类加载器相关的统计信息。
  • compiler:显示即时编译器相关的统计信息。
  • gc:显示垃圾收集器的详细信息。
  • gccapacity:显示各个内存区域的容量和已使用空间。
  • gccause:显示最后一次垃圾收集的原因。
  • gcnew:显示新生代垃圾收集的统计信息。
  • gcnewcapacity:显示新生代内存区域的容量和已使用空间。
  • gcold:显示老年代垃圾收集的统计信息。
  • gcoldcapacity:显示老年代内存区域的容量和已使用空间。
  • gcpermcapacity:显示永久代内存区域的容量和已使用空间。
  • threads:显示线程相关的统计信息。

例如,要每隔1秒钟收集一次垃圾收集统计信息,可以使用以下命令:

jstat -gcutil <vmid> 1000 1

这将显示垃圾收集器的使用情况,包括新生代、老年代和永久代的使用百分比。

jstatd

jstatd 是一个用于监控 Java 虚拟机(JVM)的守护进程,它允许远程监控工具附加到 JVM 进程并收集性能数据。jstatd 启动后,可以在本地或远程机器上运行 jstat 命令来连接到 jstatd 进程并获取 JVM 统计信息。

以下是 jstatd 命令的基本语法:

jstatd [ options ]

其中,options 是可选的参数,可以用来配置 jstatd 的行为。一些常用的选项包括:

  • -p <port>:指定 jstatd 监听的端口号。默认情况下,jstatd 使用 1748 端口。
  • -n <host>:指定 jstatd 监听的主机名或 IP 地址。默认情况下,jstatd 只接受来自本地主机的连接。
  • -Xmx<size>:设置 jstatd 的最大堆大小。
  • -Xms<size>:设置 jstatd 的初始堆大小。
  • -Xss<size>:设置 jstatd 的线程堆栈大小。
  • -J<flag>:将 <flag> 传递给 JVM,例如 -J-Xmx256m

要启动 jstatd 进程并允许远程监控工具连接到 JVM,可以使用以下命令:

jstatd -p 1748 -n myhost

这将在端口 1748 上启动 jstatd 进程,并允许来自主机名为 myhost 的远程监控工具连接到 JVM。

请注意,jstatd 命令是实验性的,不受官方支持。在使用 jstatd 进行远程监控时,请确保了解其潜在风险,并在生产环境中谨慎使用。

jmc

Java任务控制(JMC)是一个用于分析、监控和诊断 Java 应用程序的工具套件。它提供了一套集成的工具,可以帮助开发人员在开发和生产环境中对 Java 应用程序进行性能分析和故障排除。

JMC 的主要特点包括:

  1. CPU 分析器:收集 CPU 使用情况数据,帮助识别应用程序中的性能瓶颈。
  2. 内存分析器:监视内存使用情况,检测内存泄漏和其他内存问题。
  3. 线程分析器:分析线程行为,诊断线程死锁和同步问题。
  4. Java 飞行记录器(JFR):记录 Java 应用程序的详细运行信息,包括垃圾收集、线程状态、异常等。
  5. 事件分析器:分析 JFR 记录的事件数据,提供可视化的报告和诊断信息。
  6. 堆栈跟踪:生成线程的堆栈跟踪,帮助诊断线程阻塞和死锁问题。
  7. JMX 控制台:通过 Java Management Extensions(JMX)连接到正在运行的 Java 进程,实时查看和管理应用程序的状态。

JMC 可以通过命令行启动,基本语法如下:

jmc[选项]

一些常用的选项包括:

  • -console-c:启动 JMC 控制台。
  • -launch <url>:指定要分析的 Java 进程的 JMX 连接 URL。
  • -port <port>:指定 JMC 控制台监听的端口号。
  • -noheader:在启动时不显示欢迎页面。
  • -vm <path>:指定 Java 虚拟机的路径。

例如,要启动 JMC 控制台并连接到本地主机上运行的 Java 进程,可以使用以下命令:

jmc -console -launch jmx://localhost:1748

这将启动 JMC 控制台,并尝试连接到本地主机上的 Java 进程。

故障排除

jcmd

jcmd命令用于向正在运行的Java虚拟机(JVM)发送诊断命令请求。它必须在运行JVM的同一台机器上使用,并且具有用于启动JVM的相同有效用户和组标识符。

以下是一些常用的jcmd命令示例:

  1. 列出所有正在运行的Java进程及其主类和命令行参数:
jcmd
  1. 向指定的Java进程发送PerfCounter.print命令,以打印性能计数器信息:
jcmd <pid> PerfCounter.print
  1. 将指定的命令输出到指定的文件中:
jcmd <pid> -f <filename> <command> [arguments]
  1. 向指定的Java进程发送其他诊断命令:
jcmd <pid> <command> [arguments]

例如,要获取指定进程的线程转储,可以使用以下命令:

jcmd <pid> Thread.print

jinfo

jinfo命令用于打印指定Java进程或核心文件或远程调试服务器的Java配置信息。配置信息包括Java系统属性和Java虚拟机(JVM)命令行标志。如果指定的进程在64位JVM上运行,则可能需要指定选项,例如:

jinfo -J-d64 -sysprops pid

请注意,此实用程序不受支持,可能在JDK的未来版本中不可用。

jhat

jhat(Java Heap Analysis Tool)是JDK提供的一个命令行工具,专用于分析Java堆转储文件。这个工具可以帮助开发人员理解和诊断可能的内存问题,比如内存泄漏。使用jhat,用户可以解析堆转储文件并启动一个Web服务器,通过Web界面查看分析结果。这种方式便于深入理解应用程序在运行时的内存状态。

jhat的使用场景主要集中在以下方面:

  • 诊断内存相关问题:当Java应用程序出现OutOfMemoryError或者需要优化内存使用时,jhat可以提供帮助。
  • 分析对象实例:通过分析堆转储文件,可以查看特定对象类型的实例数量,从而发现潜在的内存问题。
  • 学习内存分配情况:了解哪些对象占用了大量内存,帮助开发者优化内存使用。

使用jhat时需要注意以下几点:

  • jhat的分析功能相对基础,对于复杂的内存分析任务,可能需要更专业的工具如Eclipse Memory Analyzer或VisualVM[2]。
  • 由于jhat内置了一个简单的HTTP服务器,因此在启动jhat后,可以访问指定端口上的Web界面来查看堆分析的结果。
  • 随着JDK的发展,jhat工具可能会被更新或替换,建议关注JDK的最新版本信息和相关工具的更新。

jmap♥♥♥♥♥

jmap(Java Memory Map)是JDK提供的一个命令行工具,用于打印指定进程、核心文件或远程调试服务器的共享对象内存映射或堆内存详细信息。它可以帮助开发人员诊断和分析Java应用程序的内存使用情况,包括查找内存泄漏等问题。

以下是jmap命令的用法:

  1. 打印指定进程ID(pid)的内存映射:
jmap [options] pid

其中,pid是Java进程的ID。要获取正在运行的Java进程列表,可以使用jps命令。

  1. 打印从特定可执行文件生成的核心转储文件的内存映射:
jmap [options] executable core

其中,executable是Java可执行文件,core是核心转储文件。

  1. 打印远程调试服务器上的内存映射:
jmap [options] [pid] server-id@remote-hostname-or-IP

其中,pid是可选的Java进程ID,server-id是远程调试服务器的唯一ID,remote-hostname-or-IP是远程主机名或IP地址。

jmap命令提供了多种选项,用于分析和诊断Java进程的内存使用情况。以下是一些常用的选项及其功能:

  1. 无选项
    当不使用任何选项时,jmap命令将打印共享对象映射。对于目标JVM中加载的每个共享对象,它将打印起始地址、映射的大小以及共享对象文件的完整路径。这种行为类似于Oracle Solaris工具的jmappmap

  2. -dump:[live,] format=b, file=filename
    将Java堆转储为hprof二进制格式的文件。live子选项是可选的,但指定时,仅转储堆中的活动对象。要查看堆转储,可以使用jhat(1)命令读取生成的文件。

  3. -finalizerinfo
    打印有关等待终结的对象的信息。

  4. -heap
    打印垃圾收集使用的堆摘要、堆配置以及按代划分的堆使用情况。此外,还打印内部字符串的数量和大小。

  5. -histo[:live]
    打印堆的直方图。对于每个Java类,打印对象数量、内存大小(以字节为单位)以及完全限定类名。JVM内部类名前带有星号(*)前缀。如果指定了子选项,则只计算活动对象。

  6. -clstats
    按类加载器打印Java堆的统计信息。对于每个类加载器,打印其名称、活跃度、地址、父类加载器以及已加载的类的数量和大小。

  7. -F
    强制模式。与-dump-histo选项一起使用时非常有用,特别是当pid不响应时。此子选项在此模式下不受支持。

  8. -h-help
    打印帮助信息。

  9. -Jflag
    传递给运行jmap命令的Java虚拟机的标志。

需要注意的是,jmap是一个实验性的工具,可能在未来的JDK版本中不再可用。此外,由于jmap依赖于目标进程的正常运行,因此在分析过程中可能会影响目标进程的性能。因此,在使用jmap时需要谨慎,并确保在不影响应用程序性能的情况下进行内存分析。

jsadebugd

jsadebugd 是一个实验性的命令行工具,用于附加到Java进程或核心文件并充当调试服务器。通过使用此工具,可以允许远程客户端如 jstack、jmap 和 jinfo 等通过 Java 远程方法调用(RMI)连接到调试服务器,从而对运行中的Java进程进行调试和诊断。

jstack♥♥♥♥♥

jstack命令用于打印Java进程、核心文件或远程调试服务器的Java线程堆栈跟踪。使用方法如下:

  1. 打印指定进程ID的堆栈跟踪:
jstack pid
  1. 打印指定可执行文件生成的核心转储的堆栈跟踪:
jstack executable core
  1. 打印指定远程调试服务器的堆栈跟踪:
jstack [options][server-id@]remote-hostname-or-IP

其中,options是命令行选项,server-id是可选的唯一ID,当多个调试服务器在同一远程主机上运行时使用。

jstack命令的选项如下:

  1. -F:当使用pid作为参数时,强制打印完整的堆栈跟踪。即使进程没有响应,也会尝试获取堆栈信息。

  2. -l:长列表。打印有关锁的其他信息,例如拥有的java.util.concurrent拥有的同步器列表。这可以帮助诊断死锁和资源争用问题。

  3. -m:混合模式。打印具有Java和本机C/C++帧的堆栈跟踪。这对于分析本地代码调用Java方法的情况非常有用。

  4. -h-help:打印帮助消息。显示所有可用选项及其描述。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吴代庄

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值