Java系列-JVM调优

一、jmap详解

1.1概念

jmap -heap 是一个Java 命令行工具,用于获取Java 进程的堆内存信息。它会输出 Java 进程的整体堆内存使用情况,包括 heap 总大小、已使用大小、空闲大小等。

在使用 jmap -heap 命令时,需要注意以下几点:

  • jmap -heap 命令会暂停 Java 进程的执行并进行内存快照,可能会对应用程序的性能产生一定的影响
  • jmap -heap 命令只能用于 HotSpot 虚拟机,不适用于其他虚拟机实现。
  • jmap -heap 命令可能会产生较大的输出,建议将输出重定向到文件中以便后续分析。

1.2参数

  • -dump:导出 Java 堆内存中的内容到文件中。
  • -file:指定导出文件的文件名,如果不指定则默认为 java_pid[进程 ID].hprof。
  • -F:强制执行指令,即使 JVM 正在退出或者已经退出。
  • -histo:打印 Java 堆内存中各个对象类型的实例数目和大小。
  • -J:传递参数给 JVM,例如“-J-Xms512m”。

1.3查看内存使用情况

1.3.1 查看java的进程

  • windows:通过任务管理器
  • Linux:ps -ef |grep java 注意看路径

1.3.2 查看对应进程的堆内存使用情况

shell>jmap -heap 5960
# 查看 5960进程的堆内存使用情况
jmap -heap 5960
# 表示 jmap 正在尝试连接并附加到一个进程ID为 24126 的Java进程
Attaching to process ID 5960, please wait...
# 表示 jmap 已经成功附加到了该进程并成功连接了调试器
Debugger attached successfully.
# 表示该 Java 进程正在运行 Server 模式的编译器
Server compiler detected.
# 表示该 Java 程序的版本号为 25.121-b13
JVM version is 25.151-b12

# 表示 Java 进程正在使用线程本地对象分配的方式
using thread-local object allocation.
# 表示 Java 进程正在使用 13 个线程来进行并行垃圾回收
Parallel GC with 13 thread(s)

# 堆内存配置信息
Heap Configuration:
   MinHeapFreeRatio         = 0                       # 表示在堆内存达到最大值之前,堆内存中不允许有任何自由空间
   MaxHeapFreeRatio         = 100                     # 表示在堆内存达到最大值之后,堆内存中允许全部是自由空间
   MaxHeapSize              = 5368709120 (5120.0MB)   # 表示堆内存的最大容量为 5GB
   NewSize                  = 2684354560 (2560.0MB)   # 表示新生代(Young Generation)的初始容量为 2.5GB
   MaxNewSize               = 2684354560 (2560.0MB)   # 表示新生代的最大容量为 2.5GB
   OldSize                  = 2684354560 (2560.0MB)   # 表示老年代(Old Generation)的初始容量为 2.5GB
   NewRatio                 = 1                       # 表示新生代与老年代内存大小的比例为 1:1
   SurvivorRatio            = 8                       # 表示 Eden 区域与 Survivor 区域之间内存大小的比例为 8:1
   MetaspaceSize            = 21807104 (20.796875MB)  # 表示元数据区域的大小为 20.8MB
   CompressedClassSpaceSize = 1073741824 (1024.0MB)   # 表示压缩类空间的大小为 1GB
   MaxMetaspaceSize         = 17592186044415 MB       # 表示元数据区域的最大容量为 16 EB(exabytes)
   G1HeapRegionSize         = 0 (0.0MB)               # 表示 G1 垃圾回收器使用的内存段的大小为 0

# 堆内存的使用情况
Heap Usage:
PS Young Generation                                   # 表示使用了 Parallel Scavenge(PS)年轻代内存的信息
Eden Space:                                           # 表示 Eden 区域的使用情况
   capacity = 1009254400 (962.5MB)                    # 表示 Eden 区域的最大容量为 962.5MB
   used     = 474955488 (452.9528503417969MB)         # 表示 Eden 区域已使用的内存大小为 452.95MB
   free     = 534298912 (509.5471496582031MB)         # 表示 Eden 区域尚未使用的内存大小为 509.55MB
   47.06003639914773% used
From Space:                                           # 表示 Survivor 0 区域的使用情况
   capacity = 834142208 (795.5MB)                     # 表示 Survivor 0 区域的最大容量为 795.5MB
   used     = 326834600 (311.69376373291016MB)        # 表示 Survivor 0 区域已使用的内存大小为 311.69MB
   free     = 507307608 (483.80623626708984MB)        # 表示 Survivor 0 区域尚未使用的内存大小为 483.81MB
   39.182119891000646% used
To Space:                                             # 表示 Survivor 1 区域的使用情况
   capacity = 793247744 (756.5MB)                     # 表示 Survivor 1 区域的最大容量为 756.5MB
   used     = 0 (0.0MB)                               # 表示 Survivor 1 区域尚未使用任何内存
   free     = 793247744 (756.5MB)                     # 表示 Survivor 1 区域尚未使用的内存大小为 756.5MB
   0.0% used
PS Old Generation                                     # 表示使用了 Parallel Scavenge(PS)老年代内存的信息
   capacity = 2684354560 (2560.0MB)                   # 表示老年代的最大容量为 2.5GB
   used     = 1371482032 (1307.9471893310547MB)       # 表示老年代已使用的内存大小为 1307.95MB
   free     = 1312872528 (1252.0528106689453MB)       # 表示老年代尚未使用的内存大小为 1252.05MB
   51.091687083244324% used                           # 表示老年代已使用内存占总内存的比例为 51.09%

53559 interned Strings occupying 6180024 bytes.

二、dump文件分析

2.1生成dump文件

shell>jmap -dump:file=dump.hprof,format=b 5960
Dumping heap to E:\oa\dump.hprof ...
Heap dump file created

深入理解JVM虚拟机12:JVM性能管理神器VisualVM介绍与实战 – 掘金 (juejin.cn)