当前位置: 首页 > news >正文

【Java】JDK 命令行工具

JDK 命令行工具

文章目录

Java Platform, Standard Edition Tools Reference

https://docs.oracle.com/javase/8/docs/technotes/tools/unix/toc.html

jinfo

jinfo是 JDK 提供的一个命令行工具,用于查看和修改正在运行的 Java 虚拟机(JVM)的配置信息。它可以帮助你检查 JVM 的运行参数、系统属性、环境变量等,并在运行时修改某些配置。

jinfo 的工作原理

jinfo的工作原理主要涉及以下几个关键部分:

• Attach Mechanism(连接机制)

• JVM Tool Interface(JVM TI)

• HotSpot VM(HotSpot 虚拟机)

1.Attach Mechanism(连接机制)
jinfo使用 JDK 提供的 Attach API 与目标 JVM 进程建立连接。Attach API 允许外部工具(如jinfo)连接到正在运行的 JVM,并执行各种操作,如查看和修改配置信息。

• Attach Listener 线程:

• JVM 启动时,默认会启动一个名为Attach Listener的线程,用于监听来自外部工具的连接请求。

• 如果 JVM 启动时没有启用Attach Listener,可以通过发送特定信号(如SIGBREAK)来触发其初始化。

2.JVM Tool Interface(JVM TI)
jinfo通过 JVM Tool Interface(JVM TI)与 JVM 交互。JVM TI 是一个本地接口,允许调试器和监控工具与 JVM 进行交互。jinfo使用 JVM TI 提供的函数来获取和修改 JVM 的配置信息。

• JVM TI 环境:

jinfo通过 Attach API 连接到 JVM 后,会初始化一个 JVM TI 环境。

• 通过这个环境,jinfo可以调用 JVM TI 提供的函数来获取和修改 JVM 的配置信息。

3.HotSpot VM(HotSpot 虚拟机)
jinfo主要与 HotSpot 虚拟机交互。HotSpot VM 提供了一系列的内部函数和数据结构,用于存储和管理 JVM 的配置信息。jinfo通过 JVM TI 调用这些内部函数来获取和修改配置信息。

• HotSpot VM 的内部数据结构:

• HotSpot VM 使用JavaThreadJavaValue等内部数据结构来存储线程和系统属性的信息。

jinfo通过 JVM TI 调用这些数据结构来获取和修改 JVM 的配置信息。

jinfo 的常见用法

1.查看 JVM 的运行参数

jinfo -flags <pid>

-flags:显示 JVM 的运行参数,如-Xmx-Xms等。

2.查看 JVM 的系统属性

jinfo -sysprops <pid>

-sysprops:显示 JVM 的系统属性,如java.versionjava.home等。

3.修改 JVM 的系统属性

jinfo -sysprops <property>=<value> <pid>

-sysprops:修改 JVM 的系统属性。

<property>:要修改的系统属性名称。

<value>:新的属性值。

4.查看 JVM 的环境变量

jinfo -env <pid>

-env:显示 JVM 的环境变量。

示例

1.查找 Java 进程 ID

jps -l

2.查看 JVM 的运行参数

jinfo -flags 12345

3.查看 JVM 的系统属性

jinfo -sysprops 12345

4.修改 JVM 的系统属性

jinfo -sysprops java.awt.headless=true 12345

5.查看 JVM 的环境变量

jinfo -env 12345

注意事项

• 权限问题:

• 确保你有权限访问目标 JVM 进程。在某些系统上,可能需要使用sudo

• JDK 版本:

• 确保使用与目标 JVM 相同的 JDK 版本,以避免兼容性问题。

• 运行时修改:

• 修改 JVM 的配置信息可能会影响应用程序的运行,建议在修改前进行充分的测试。

• Attach Listener:

• 如果 JVM 启动时没有启用Attach Listener,可以通过发送特定信号(如SIGBREAK)来触发其初始化。

总结
jinfo通过 Attach API 与目标 JVM 建立连接,使用 JVM TI 与 JVM 交互,获取和修改 JVM 的配置信息。通过合理使用jinfo,你可以快速查看和修改 JVM 的运行参数、系统属性和环境变量,帮助你更好地管理和优化 Java 应用程序。

jinfo是 JDK 提供的一个命令行工具,用于查看和修改正在运行的 Java 虚拟机(JVM)的配置信息。它通过与 JVM 的内部机制交互,实现对 JVM 配置的实时监控和调整。以下是jinfo的工作原理和技术实现的详细分析。

jinfo 的工作原理

1.Attach Mechanism(连接机制)
jinfo使用 JDK 提供的 Attach API 与目标 JVM 进程建立连接。Attach API 允许外部工具(如jinfo)连接到正在运行的 JVM,并执行各种操作,如查看和修改配置信息。

• Attach Listener 线程:

• JVM 启动时,默认会启动一个名为Attach Listener的线程,用于监听来自外部工具的连接请求。

• 如果 JVM 启动时没有启用Attach Listener,可以通过发送特定信号(如SIGBREAK)来触发其初始化。

2.JVM Tool Interface(JVM TI)
jinfo通过 JVM Tool Interface(JVM TI)与 JVM 交互。JVM TI 是一个本地接口,允许调试器和监控工具与 JVM 进行交互。jinfo使用 JVM TI 提供的函数来获取和修改 JVM 的配置信息。

• JVM TI 环境:

jinfo通过 Attach API 连接到 JVM 后,会初始化一个 JVM TI 环境。

• 通过这个环境,jinfo可以调用 JVM TI 提供的函数来获取和修改 JVM 的配置信息。

3.HotSpot VM(HotSpot 虚拟机)
jinfo主要与 HotSpot 虚拟机交互。HotSpot VM 提供了一系列的内部函数和数据结构,用于存储和管理 JVM 的配置信息。jinfo通过 JVM TI 调用这些内部函数来获取和修改配置信息。

• HotSpot VM 的内部数据结构:

• HotSpot VM 使用JavaThreadJavaValue等内部数据结构来存储线程和系统属性的信息。

jinfo通过 JVM TI 调用这些数据结构来获取和修改 JVM 的配置信息。

jinfo 的技术实现

1.查找目标 JVM
jinfo首先通过目标 JVM 的进程 ID(PID)找到对应的 JVM 进程。如果目标 JVM 是远程的,jinfo会通过网络连接到远程 JVM。

2.初始化 Attach API
jinfo使用 Attach API 与目标 JVM 建立连接。Attach API 提供了VirtualMachine类,用于与目标 JVM 交互。

import com.sun.tools.attach.VirtualMachine;public class JInfoExample {public static void main(String[] args) throws Exception {String pid = "12345"; // 替换为你的 JVM 进程 IDVirtualMachine vm = VirtualMachine.attach(pid);// 进一步操作vm.detach();}
}

3.初始化 JVM TI 环境
jinfo通过 Attach API 连接到 JVM 后,会初始化一个 JVM TI 环境。通过这个环境,jinfo可以调用 JVM TI 提供的函数来获取和修改 JVM 的配置信息。

JNIEXPORT void JNICALL
Java_com_sun_tools_attach_linux_NativeVirtualMachine_initialize(JNIEnv *env, jobject vm) {// 初始化 JVM TI 环境jvmtiEnv *jvmti;jint res = (*jvm)->GetEnv(jvm, (void**)&jvmti, JVMTI_VERSION_1_2);if (res != JNI_OK) {// 处理错误}// 进一步操作
}

4.获取和修改配置信息
jinfo通过 JVM TI 提供的函数来获取和修改 JVM 的配置信息。例如,获取 JVM 的运行参数和系统属性:

// 获取 JVM 的运行参数
jvmtiError GetFlagValue(jvmtiEnv *jvmti, const char *name, char **value) {jvmtiError error;error = (*jvmti)->GetFlagValue(jvmti, name, value);return error;
}// 修改 JVM 的运行参数
jvmtiError SetFlagValue(jvmtiEnv *jvmti, const char *name, const char *value) {jvmtiError error;error = (*jvmti)->SetFlagValue(jvmti, name, value);return error;
}

jinfo 的常见用法

1.查看 JVM 的运行参数

jinfo -flags <pid>

2.查看 JVM 的系统属性

jinfo -sysprops <pid>

3.修改 JVM 的系统属性

jinfo -sysprops <property>=<value> <pid>

4.查看 JVM 的环境变量

jinfo -env <pid>

示例

1.查找 Java 进程 ID

jps -l

2.查看 JVM 的运行参数

jinfo -flags 12345

3.查看 JVM 的系统属性

jinfo -sysprops 12345

4.修改 JVM 的系统属性

jinfo -sysprops java.awt.headless=true 12345

5.查看 JVM 的环境变量

jinfo -env 12345

注意事项

• 权限问题:

• 确保你有权限访问目标 JVM 进程。在某些系统上,可能需要使用sudo

• JDK 版本:

• 确保使用与目标 JVM 相同的 JDK 版本,以避免兼容性问题。

• 运行时修改:

• 修改 JVM 的配置信息可能会影响应用程序的运行,建议在修改前进行充分的测试。

• Attach Listener:

• 如果 JVM 启动时没有启用Attach Listener,可以通过发送特定信号(如SIGBREAK)来触发其初始化。

总结
jinfo通过 Attach API 与目标 JVM 建立连接,使用 JVM TI 与 JVM 交互,获取和修改 JVM 的配置信息。通过合理使用jinfo,你可以快速查看和修改 JVM 的运行参数、系统属性和环境变量,帮助你更好地管理和优化 Java 应用程序。

jstat

jstat:Java统计工具

jstat(Java统计工具)是JDK自带的一个命令行工具,用于监控Java虚拟机(JVM)的性能和内存使用情况。它提供了关于垃圾回收(GC)、堆内存使用、类加载等详细信息,是性能调优和故障排查的有力工具。

常用参数
jstat支持多种参数,用于显示不同类型的JVM统计信息。以下是一些常用的参数及其说明:

-gc

• 显示垃圾回收(GC)相关的统计信息,包括堆内存的使用情况。

• 示例:

jstat -gc <pid> <interval> <count>

<pid>:Java进程的进程ID。

<interval>:采样间隔(单位为毫秒)。

<count>:采样次数。

-gccapacity

• 显示GC的容量信息,包括堆内存的初始容量、当前容量和最大容量。

• 示例:

jstat -gccapacity <pid> <interval> <count>

-gcutil

• 显示GC的使用率信息,包括堆内存的使用率。

• 示例:

     jstat -gcutil <pid> <interval> <count>

-gcnew

• 显示新生代(Eden区和Survivor区)的GC统计信息。

• 示例:

     jstat -gcnew <pid> <interval> <count>

-gcold

• 显示老年代的GC统计信息。

• 示例:

     jstat -gcold <pid> <interval> <count>

-gcoldcapacity

• 显示老年代的容量信息。

• 示例:

     jstat -gcoldcapacity <pid> <interval> <count>

-gcpermstat

• 显示永久代(PermGen)或元空间(Metaspace)的统计信息。

• 示例:

     jstat -gcpermstat <pid>

-printcompilation

• 显示JIT编译器的编译信息。

• 示例:

     jstat -printcompilation <pid>

示例用法

1.显示GC使用率
显示指定进程的GC使用率,每500毫秒采样一次,共采样5次:

jstat -gcutil <pid> 500 5

2.显示GC容量信息
显示指定进程的GC容量信息,每1000毫秒采样一次,共采样3次:

jstat -gccapacity <pid> 1000 3

3.显示新生代GC统计信息
显示指定进程的新生代GC统计信息,每200毫秒采样一次,共采样10次:

jstat -gcnew <pid> 200 10

4.显示老年代GC统计信息
显示指定进程的老年代GC统计信息,每300毫秒采样一次,共采样7次:

jstat -gcold <pid> 300 7

5.显示永久代或元空间统计信息
显示指定进程的永久代或元空间统计信息:

jstat -gcpermstat <pid>

6.显示JIT编译信息
显示指定进程的JIT编译信息:

jstat -printcompilation <pid>

输出说明
jstat的输出包含多个列,每列代表不同的统计信息。以下是一些常见的列及其含义:

• S0C/S1C:Survivor区0和1的容量。

• S0U/S1U:Survivor区0和1的使用量。

• EC/EU:Eden区的容量和使用量。

• OC/OU:老年代的容量和使用量。

• MC/MU:元空间的容量和使用量。

• CCSC/CCSU:压缩类空间的容量和使用量。

• YGC/YGCT:年轻代GC次数和GC时间。

• FGC/FGCT:老年代GC次数和GC时间。

• GCT:总GC时间。

注意事项

• 权限问题:运行jstat时,需要有足够的权限访问目标Java进程。

• JVM参数:某些JVM参数(如垃圾回收器类型)会影响jstat的输出内容。

• 实时监控:jstat提供的是实时监控数据,适合短期性能分析。对于长期监控,可以结合其他工具(如JMX、Prometheus等)。

总结
jstat是一个强大的JVM监控工具,可以帮助开发者和运维人员快速了解JVM的性能和内存使用情况。通过合理使用jstat的各种参数,你可以获取详细的GC统计信息,从而更好地进行性能调优和故障排查。

jstat是 JDK 提供的一个命令行工具,用于监控 Java 虚拟机(JVM)的性能和内存使用情况。它通过读取 JVM 的性能数据文件(PerfData 文件)来获取实时的垃圾回收(GC)和内存使用信息。以下是jstat的工作原理和相关机制的详细分析。

jstat 的工作原理

1.PerfData 文件
jstat的核心是通过读取 JVM 的性能数据文件(PerfData 文件)来获取实时的性能数据。PerfData 文件是一个内存映射文件,存储了 JVM 的各种性能指标,如垃圾回收信息、内存使用情况等。

• 文件位置:

• PerfData 文件通常位于/tmp/hsperfdata_<username>目录下,其中<username>是运行 JVM 的用户名。

• 文件名是目标 JVM 的进程 ID(PID)。

• 文件创建:

• JVM 启动时,会创建一个 PerfData 文件,并通过mmap将其映射到内存中。

• 这个文件的路径和名称可以通过-XX:PerfData参数进行配置。

• 文件更新:

• JVM 会定期更新 PerfData 文件中的数据,更新频率由-XX:PerfDataSamplingInterval参数控制,默认值为 50 毫秒。

• 这意味着jstat获取的数据是近实时的。

• 文件删除:

• 正常情况下,当 JVM 退出时,PerfData 文件会被自动删除。

• 如果 JVM 被强制终止(如使用kill -9),文件可能不会被删除。JVM 会在后续启动时检查并删除这些残留的文件。

2.jstat 的工作流程
jstat的工作流程可以分为以下几个步骤:

• 查找 PerfData 文件:

jstat首先根据目标 JVM 的 PID 找到对应的 PerfData 文件。

• 读取数据:

jstat使用DirectByteBuffer从 PerfData 文件中读取性能数据。

• 由于 PerfData 文件是通过mmap映射到内存的,因此jstat可以直接访问内存中的数据,而无需进行文件 I/O 操作。

• 解析数据:

jstat解析读取到的二进制数据,并将其转换为可读的格式。

• 这些数据包括垃圾回收信息、内存使用情况等。

• 输出结果:

jstat将解析后的数据以表格形式输出到控制台或指定的文件中。

3.jstat 的输出
jstat的输出包括多个列,每列代表一个特定的性能指标。以下是一些常见的输出列及其含义:

• S0C(Survivor Space 0 Capacity):

• Survivor 区 0 的容量(单位为 KB)。

• S1C(Survivor Space 1 Capacity):

• Survivor 区 1 的容量(单位为 KB)。

• S0U(Survivor Space 0 Usage):

• Survivor 区 0 的当前使用量(单位为 KB)。

• S1U(Survivor Space 1 Usage):

• Survivor 区 1 的当前使用量(单位为 KB)。

• EC(Eden Space Capacity):

• Eden 区的容量(单位为 KB)。

• EU(Eden Space Usage):

• Eden 区的当前使用量(单位为 KB)。

• OC(Old Space Capacity):

• 老年代的容量(单位为 KB)。

• OU(Old Space Usage):

• 老年代的当前使用量(单位为 KB)。

• MC(Metaspace Capacity):

• 元空间的容量(单位为 KB)。

• MU(Metaspace Usage):

• 元空间的当前使用量(单位为 KB)。

• CCSC(Compressed Class Space Capacity):

• 压缩类空间的容量(单位为 KB)。

• CCSU(Compressed Class Space Usage):

• 压缩类空间的当前使用量(单位为 KB)。

• YGC(Young Generation GC Count):

• 年轻代 GC 的次数。

• YGCT(Young Generation GC Time):

• 年轻代 GC 的总时间(单位为秒)。

• FGC(Full GC Count):

• 全 GC 的次数。

• FGCT(Full GC Time):

• 全 GC 的总时间(单位为秒)。

• GCT(Total GC Time):

• 总 GC 时间(单位为秒)。

示例
以下是一个jstat的输出示例,展示如何解读这些数据:

jstat -gc 12345 1000 5

输出示例:

  S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT
1536.0 1536.0  0.0   1536.0 12352.0   9631.4   30744.0    26250.7   42752.0 40971.8 5376.0 5014.2    141    3.107   4      1.626    4.733

• S0C(Survivor Space 0 Capacity):1536KB

• S1C(Survivor Space 1 Capacity):1536KB

• S0U(Survivor Space 0 Usage):0KB

• S1U(Survivor Space 1 Usage):1536KB

• EC(Eden Space Capacity):12352KB

• EU(Eden Space Usage):9631.4KB

• OC(Old Space Capacity):30744KB

• OU(Old Space Usage):26250.7KB

• MC(Metaspace Capacity):42752KB

• MU(Metaspace Usage):40971.8KB

• CCSC(Compressed Class Space Capacity):5376KB

• CCSU(Compressed Class Space Usage):5014.2KB

• YGC(Young Generation GC Count):141

• YGCT(Young Generation GC Time):3.107 秒

• FGC(Full GC Count):4

• FGCT(Full GC Time):1.626 秒

• GCT(Total GC Time):4.733 秒

总结
jstat通过读取 JVM 的 PerfData 文件来获取实时的性能数据。PerfData 文件是一个内存映射文件,JVM 会定期更新其中的数据。jstat通过解析这些数据并以表格形式输出,帮助开发者和运维人员监控和分析 JVM 的性能和内存使用情况。通过合理使用jstat,可以快速定位和解决垃圾回收和内存相关的问题。

jstack

jstack是 JDK 提供的一个命令行工具,用于生成 Java 虚拟机(JVM)的线程转储(Thread Dump)。线程转储是 JVM 中所有线程状态的快照,包含线程的调用栈、状态、锁信息等。通过分析线程转储,可以快速定位死锁、线程阻塞、CPU 占用过高等问题。

基本用法

1.查找 Java 进程 ID
使用jps命令快速获取目标 Java 进程的 PID:

jps -l

2.生成线程转储
将线程转储信息输出到文件:

jstack -l <pid> > thread_dump.txt

3.强制生成转储(进程无响应时)
如果进程无响应,可以使用-F选项强制生成线程转储:

jstack -F -l <pid> > thread_dump_force.txt

常用选项

-l:输出详细的锁信息(如哪些线程持有锁,哪些在等待锁)。

-F:强制生成线程转储(适用于进程无响应的情况)。

-m:混合模式(显示 Java 和本地方法的堆栈帧)。

-h-help:显示帮助信息。

示例

1.查找 Java 进程 ID

jps -l

2.生成线程转储

jstack -l 12345 > thread_dump.txt

3.强制生成转储(进程无响应时)

jstack -F -l 12345 > thread_dump_force.txt

4.查看混合模式的线程转储

jstack -m 12345 > thread_dump_mixed.txt

输出内容
jstack输出的线程转储通常包含以下信息:

• 线程名称:线程的名称。

• 线程 ID:线程的唯一标识符。

• 线程状态:线程的当前状态(如RUNNABLEWAITINGBLOCKED等)。

• 调用堆栈:线程的调用堆栈,显示线程当前执行的方法及其调用链。

• 锁信息(如果使用-l选项):线程持有的锁和等待的锁。

实战应用

1.检测死锁
如果怀疑存在死锁,可以使用-l选项来获取详细的锁信息:

jstack -l <pid>

2.分析性能问题
通过分析线程转储,可以找到占用 CPU 时间较多的线程,或者处于BLOCKEDWAITING状态的线程,从而定位性能瓶颈。

注意事项

• 权限问题:

• 确保你有权限访问目标 Java 进程。在某些系统上,可能需要使用sudo

• JDK 版本:

• 确保使用与目标 Java 进程相同的 JDK 版本,以避免兼容性问题。

• 远程调试:

• 如果需要远程调试,可以使用以下命令:

     jstack [options] [server_id@]<remote server IP or hostname>

• 核心转储文件:

• 如果有核心转储文件,可以使用以下命令分析:

     jstack /usr/bin/java file.core

总结
jstack是一个强大的工具,用于生成和分析 Java 线程转储。通过合理使用jstack,你可以快速定位和解决线程相关的问题,优化应用程序的性能。希望这些示例和注意事项对你有所帮助!

jstack是 JDK 提供的一个命令行工具,用于生成 Java 虚拟机(JVM)的线程转储(Thread Dump)。线程转储是 JVM 中所有线程状态的快照,包含线程的调用栈、状态、锁信息等。通过分析线程转储,可以快速定位死锁、线程阻塞、CPU 占用过高等问题。

jstack 的工作原理

jstack的工作原理主要涉及以下几个关键部分:

• Attach Mechanism(连接机制)

• Signal Handling(信号处理)

• Thread Dump Generation(线程转储生成)

1.Attach Mechanism(连接机制)
jstack使用 JDK 提供的 Attach API 与目标 JVM 进程建立连接。Attach API 允许外部工具(如jstack)连接到正在运行的 JVM,并执行各种操作,如生成线程转储、加载代理等。

• Attach Listener 线程:

• JVM 启动时,默认会启动一个名为Attach Listener的线程,用于监听来自外部工具的连接请求。

• 如果 JVM 启动时没有启用Attach Listener,可以通过发送特定信号(如SIGBREAK)来触发其初始化。

2.Signal Handling(信号处理)
jstack通过发送信号(如SIGBREAK)来触发 JVM 的内部处理机制。当 JVM 收到信号时,会执行以下步骤:

• Signal Dispatcher 线程:

• JVM 内部有一个Signal Dispatcher线程,负责监听和处理外部信号。

• 当收到SIGBREAK信号时,Signal Dispatcher线程会检查是否已经初始化了Attach Listener。如果没有初始化,会调用AttachListener::init()来启动Attach Listener线程。

3.Thread Dump Generation(线程转储生成)
一旦Attach Listener线程启动,jstack通过以下步骤生成线程转储:

• 建立 Socket 连接:

jstack与 JVM 的Attach Listener线程建立一个 Socket 连接。

• 通过 Socket 发送指令(如threaddump)给 JVM。

• 处理指令:

Attach Listener线程接收到指令后,会将请求放入一个队列中。

• JVM 的VM Thread线程会从队列中读取请求,并执行相应的操作。

• 生成线程转储:

VM Thread线程调用VM_PrintThreads类来生成线程转储。

VM_PrintThreads类会遍历 JVM 中的所有线程,收集每个线程的调用栈、状态、锁信息等,并将这些信息输出到指定的输出流中。

• 返回结果:

• 生成的线程转储信息会通过 Socket 返回给jstack

jstack将这些信息打印到控制台或保存到文件中。

示例代码
以下是一个简单的 Java 示例代码,展示了如何使用 Attach API 生成线程转储:

import com.sun.tools.attach.VirtualMachine;public class MyJstack {public static void main(String[] args) throws Exception {// 替换为你的 Java 进程 IDString pid = "12345";VirtualMachine virtualMachine = VirtualMachine.attach(pid);InputStream inputStream = virtualMachine.remoteDataDump(new String[]{});byte[] buff = new byte[256];int len;do {len = inputStream.read(buff);if (len > 0) {String response = new String(buff, 0, len, "UTF-8");System.out.print(response);}} while (len > 0);inputStream.close();virtualMachine.detach();}
}

总结
jstack通过以下步骤生成线程转储:

• 使用 Attach API 与目标 JVM 建立连接。

• 通过发送信号(如SIGBREAK)触发 JVM 内部的Attach Listener线程。

Attach Listener线程接收指令并将其放入队列。

VM Thread线程从队列中读取请求并执行生成线程转储的操作。

• 生成的线程转储信息通过 Socket 返回给jstack,并打印到控制台或保存到文件中。

通过理解jstack的工作原理,你可以更好地利用这个工具来诊断和解决 Java 应用程序中的线程相关问题。

jmap

jmap是 JDK 提供的一个命令行工具,用于生成 Java 虚拟机(JVM)的内存快照(heap dump)和查看内存使用情况。它可以帮助你分析内存泄漏、内存溢出等问题,并监控 JVM 的内存使用情况。

jmap 的工作原理

jmap的工作原理主要涉及以下几个关键部分:

• Attach Mechanism(连接机制)

• JVM Tool Interface(JVM TI)

• HotSpot VM(HotSpot 虚拟机)

1.Attach Mechanism(连接机制)
jmap使用 JDK 提供的 Attach API 与目标 JVM 进程建立连接。Attach API 允许外部工具(如jmap)连接到正在运行的 JVM,并执行各种操作,如生成内存快照和查看内存使用情况。

• Attach Listener 线程:

• JVM 启动时,默认会启动一个名为Attach Listener的线程,用于监听来自外部工具的连接请求。

• 如果 JVM 启动时没有启用Attach Listener,可以通过发送特定信号(如SIGBREAK)来触发其初始化。

2.JVM Tool Interface(JVM TI)
jmap通过 JVM Tool Interface(JVM TI)与 JVM 交互。JVM TI 是一个本地接口,允许调试器和监控工具与 JVM 进行交互。jmap使用 JVM TI 提供的函数来生成内存快照和查看内存使用情况。

• JVM TI 环境:

jmap通过 Attach API 连接到 JVM 后,会初始化一个 JVM TI 环境。

• 通过这个环境,jmap可以调用 JVM TI 提供的函数来生成内存快照和查看内存使用情况。

3.HotSpot VM(HotSpot 虚拟机)
jmap主要与 HotSpot 虚拟机交互。HotSpot VM 提供了一系列的内部函数和数据结构,用于存储和管理 JVM 的内存信息。jmap通过 JVM TI 调用这些内部函数来生成内存快照和查看内存使用情况。

• HotSpot VM 的内部数据结构:

• HotSpot VM 使用JavaThreadJavaValue等内部数据结构来存储线程和内存使用信息。

jmap通过 JVM TI 调用这些数据结构来生成内存快照和查看内存使用情况。

jmap 的常见用法

1.生成内存快照(Heap Dump)
生成目标 JVM 的内存快照文件,用于后续分析:

jmap -dump:format=b,file=heap_dump.hprof <pid>

-dump:指定生成内存快照的格式和文件路径。

format=b:指定生成二进制格式的内存快照文件。

file=heap_dump.hprof:指定生成的内存快照文件名。

<pid>:目标 JVM 的进程 ID。

2.查看内存使用情况
查看目标 JVM 的内存使用情况:

jmap -heap <pid>

-heap:显示 JVM 的堆内存使用情况,包括垃圾回收策略、堆内存分布等。

<pid>:目标 JVM 的进程 ID。

3.查看历史对象统计信息
查看目标 JVM 的历史对象统计信息:

jmap -histo <pid>

-histo:显示 JVM 中所有类的实例数量和占用的内存大小。

<pid>:目标 JVM 的进程 ID。

示例

1.查找 Java 进程 ID

jps -l

2.生成内存快照

jmap -dump:format=b,file=heap_dump.hprof 12345

3.查看内存使用情况

jmap -heap 12345

4.查看历史对象统计信息

jmap -histo 12345

注意事项

• 权限问题:

• 确保你有权限访问目标 JVM 进程。在某些系统上,可能需要使用sudo

• JDK 版本:

• 确保使用与目标 JVM 相同的 JDK 版本,以避免兼容性问题。

• 内存快照文件大小:

• 内存快照文件可能会非常大,特别是在内存使用较高的情况下。确保有足够的磁盘空间来保存这些文件。

• 性能影响:

• 生成内存快照可能会对 JVM 的性能产生一定影响,建议在生产环境中谨慎使用。

• 分析工具:

• 生成的内存快照文件(如heap_dump.hprof)可以使用工具(如jvisualvmMAT等)进行分析。

总结
jmap是一个强大的工具,用于生成 JVM 的内存快照和查看内存使用情况。通过合理使用jmap,你可以快速定位和解决内存泄漏、内存溢出等问题,优化 JVM 的内存使用。希望这些示例和注意事项对你有所帮助!

javadoc

jar

jdb

jvisualvm

jconsole

javap

jhat

jstatd

jfr

jmc

jshell

jlink

jdeps

相关文章:

  • WIN11+VSCODE搭建的c/c++环境调试报错解决
  • 数据要素×AI:高质量数据集如何成为智能时代的“新石油“
  • Python 中 dpkt 库的详细使用指南(强大的 Python 数据包解析库)
  • git 如何解决分支合并冲突(VS code可视化解决+gitLab网页解决)
  • 238除自身以外数组的乘积
  • Go 语言 select 语句详解
  • 【STM32开发板】接口部分
  • Oracle正则表达式学习
  • LeetCode 39.组合总和:回溯法与剪枝优化的完美结合
  • Go语言常见接口设计技巧-《Go语言实战指南》
  • 题单:最大公约数(辗转相除法)
  • 数据结构之ArrayList
  • 【C/C++】面试基础题目收集
  • 基于 Three.js 的文本粒子解体效果技术原理剖析
  • 解释程序(Python)不需要生成机器码 逐行解析 逐行执行
  • java27
  • Maven概述,搭建,使用
  • 第五篇:HTTPS 与 TLS/SSL 握手原理
  • 前端面经 两栏布局
  • 逆向入门(1)
  • 外贸b2b免费发布平台/兰州seo技术优化排名公司
  • 建自己的个人网站/深圳市网络营销推广服务公司
  • 门户网站群建设/青岛网络优化费用
  • javacms做动漫网站/短信营销
  • 魏公村网站建设/交换链接适合哪些网站
  • 特产网站设计/揭阳百度seo公司