• 1、jstack

jstack 是 Java 提供的一个命令行工具,它用于生成 Java 虚拟机当前时刻的线程快照。这个快照包含了所有线程的调用栈信息,通常用于分析线程的状态,特别是在诊断多线程应用程序的死锁、死循环或者其他性能问题时非常有用。

jstack 命令通常具有以下几个主要用途:

  1. 查看线程堆栈jstack 可以显示所有线程的堆栈跟踪,包括线程的名称、状态(比如运行、等待、锁等待等)、以及在调用栈中的每个方法。

  2. 检测死锁jstack 可以自动检测死锁,并在输出中显示死锁的线程和造成死锁的锁信息。

  3. 分析性能问题:通过分析线程的状态和调用栈,可以帮助开发者找出程序的性能瓶颈。

使用 jstack 命令时,你需要指定要获取堆栈跟踪的 Java 进程的进程 ID(PID),或者是 Java 核心文件(core dump)的路径。以下是一些常见的 jstack 命令使用示例:

  • 获取特定 Java 进程的线程堆栈:

jstack <PID>

其中 <PID> 是 Java 进程的进程 ID。

  • 将线程堆栈输出到文件中:
jstack <PID> > stack.txt

这会将输出重定向到 stack.txt 文件中。

  • 检测死锁并输出线程信息:
jstack -l <PID>

-l 选项可以打印出关于锁的附加信息。

jstack 是 JDK 自带的工具之一,因此使用它不需要安装额外的软件,但是需要确保 jstack 命令的路径被添加到了系统的环境变量中,或者是在 JDK 的 bin 目录下执行该命令。

请注意,使用 jstack 命令时可能需要与 Java 进程具有相同的权限,尤其是在 Unix-like 系统上。如果是在生产环境中,建议谨慎使用,并且在应用的低峰时段进行,以最小化对应用性能的影响。

 

2、jmap

jmap(Java Memory Map)是 Java 开发工具包(JDK)中包含的一个命令行工具,主要用于生成 Java 应用程序内存的快照。jmap 可以帮助开发者获取运行中的 Java 应用程序的内存使用信息,用于分析堆内存(Heap)的使用情况,包括类实例的数量、内存占用、堆转储(Heap dump)等。

以下是 jmap 的一些主要用途:

  1. 生成堆转储文件(Heap Dump):可以使用 jmap 来生成堆内存的转储文件,该文件包含了内存中所有对象的信息,以及它们的类、属性、引用等。这个文件可以被内存分析工具(如 MAT、VisualVM 等)读取,用于进一步分析。

  2. 获取堆内存使用概览jmap 可以提供堆内存的概要信息,比如 Java 堆的配置参数、各个内存区域的使用情况等。

  3. 获取类加载器信息jmap 可以显示系统中所有类加载器加载的类的信息。

  4. 获取类的实例计数jmap 可以统计每个类的实例数量以及占用的内存大小。

使用 jmap 命令时,通常需要指定 Java 进程的进程 ID(PID),或者是 Java 核心文件(core dump)的路径。以下是一些常见的 jmap 命令使用示例:

  • 生成堆转储文件:

jmap -dump:format=b,file=heapdump.hprof <PID>

这会生成一个名为 heapdump.hprof 的二进制堆转储文件,其中 <PID> 是目标 Java 进程的进程 ID。

  • 获取堆内存使用概览:

jmap -heap <PID>

这会打印出堆的配置和使用情况。

  • 获取所有类加载器加载的类的信息:
jmap -clstats <PID>
  • 获取每个类的实例计数和内存占用:
jmap -histo <PID>

这会列出所有类的实例数量和内存占用,按照内存使用量排序。

在使用 jmap 时需要注意的是,对于生产环境的 Java 应用,生成完整的堆转储可能会暂停应用程序的执行,因此建议在应用的低峰时段进行操作,以减少对业务的影响。同样,执行 jmap 可能需要与 Java 进程具有相同的权限。在某些系统上,jmap 的使用可能需要配置特定的 JVM 参数来启用。

 

  • 3、jstat命令

jstat(Java Virtual Machine Statistics Monitoring Tool)是 Java 开发工具包(JDK)中的一个命令行实用程序,用于监控 Java 虚拟机(JVM)的运行时状态信息,特别是堆内存和垃圾收集(GC)统计信息。jstat 提供了对 JVM 内存池的实时监控能力,可以帮助开发者和系统管理员了解 Java 应用程序的性能和资源消耗情况。

以下是 jstat 的一些主要用途:

  1. 监控垃圾收集性能jstat 可以显示垃圾收集器的行为和性能指标,例如垃圾收集次数、垃圾收集引起的暂停时间、Eden区、Survivor区和老年代(Old Generation)的空间使用情况等。

  2. 查看堆内存使用情况jstat 提供了各个内存池(如 Eden、Survivor、老年代、永久代(PermGen,Java 8 之前)或元空间(Metaspace,Java 8 之后))的当前使用情况。

  3. 类加载统计jstat 可以显示类加载器的行为,包括加载和卸载类的数量。

使用 jstat 命令时,通常需要指定 Java 进程的进程 ID(PID),以及希望获取的统计信息类型和数据采样的时间间隔。以下是一些常见的 jstat 命令使用示例:

  • 查看垃圾收集统计信息:

jstat -gc <PID> <interval> <count>

其中 <PID> 是目标 Java 进程的进程 ID,<interval> 是采样间隔时间(毫秒),<count> 是采样次数。

  • 查看类加载统计信息:
jstat -class <PID>
  • 查看编译统计信息:
jstat -compiler <PID>

jstat 支持多种选项来监控不同类型的数据。每个选项都会显示特定的监控信息,这些信息对于调优 JVM 和解决内存相关问题非常有用。

使用 jstat 时,通常不会对 Java 应用程序的性能造成显著影响,因为它是一种轻量级的监控工具。然而,如果采样间隔非常短,对于高负载的系统,它可能会引入一定的性能开销。因此,建议根据系统负载和监控需求合理选择采样间隔。

 

  • 4、jinfo

jinfo(Java Configuration Info)是 Java 开发工具包(JDK)中的一个命令行工具,用于实时地查看和调整 Java 虚拟机(JVM)的配置信息。jinfo 可以显示 Java 进程的系统属性和 Java 虚拟机(JVM)的参数,同时它也允许我们在运行时更改某些 JVM 参数。

以下是 jinfo 的一些主要功能:

  1. 查看系统属性jinfo 可以列出目标 Java 进程的系统属性,包括类路径(classpath)、JVM 版本、库路径(library path)等。

  2. 查看和设置 JVM 参数jinfo 可以显示当前 JVM 的启动参数和默认参数。此外,对于某些可更改的参数,jinfo 还可以在运行时进行调整。

  3. 输出 JVM 配置信息jinfo 可以输出完整的 JVM 配置信息,这对于问题诊断和性能调优很有帮助。

使用 jinfo 命令时,通常需要指定目标 Java 进程的进程 ID(PID)。以下是一些常见的 jinfo 命令使用示例:

  • 显示指定 Java 进程的系统属性和 JVM 参数:

jinfo <PID>

其中 <PID> 是目标 Java 进程的进程 ID。

  • 仅显示系统属性:
jinfo -sysprops <PID>
  • 仅显示 JVM 参数:
jinfo -flags <PID>
  • 设置 JVM 参数(如果参数是可更改的):
jinfo -flag <name>=<value> <PID>

例如,可以使用 jinfo -flag MaxHeapSize=512m <PID> 来更改最大堆大小(如果 JVM 和参数支持在运行时更改)。

在使用 jinfo 时需要注意的是,并非所有 JVM 参数都可以在运行时更改,有些参数只能在 JVM 启动时设置。尝试更改不支持动态修改的参数将不会有任何效果。因此,在使用 jinfo 调整参数时,需要确保所更改的参数支持在运行时修改。

由于 jinfo 提供了实时查看和修改 JVM 配置的能力,它是一个非常有用的工具,尤其是在进行性能调优和故障排查时。然而,更改 JVM 参数可能会影响系统的稳定性和性能,因此在生产环境中使用时应该格外小心。

posted on 2023-12-25 16:24  jarsing  阅读(74)  评论(0)    收藏  举报