线上内存飙升排查过程

250 阅读3分钟
1:top 查看各进程信息
2:shift + M 1结果排序
3:查看java进程ID jps -l : 显示所有java限定类名的进程
4:“jmap -histo pid” 命令是用于生成 Java 堆内存的对象直方图,其中 “pid” 代表正在运行的 Java 进程的进程 ID。

具体来说,“jmap -histo pid” 命令会输出某个 Java 进程中的每个 Java 类的对象数量和内存使用情况,这对于进行 Java 应用程序的内存分析和优化非常有用。输出的格式一般为:

num     #instances         #bytes  class name
----------------------------------------------
   1:         28760       1390656  [C
   2:         28768       1230560  java.lang.String
   3:          1127        159696  [B
   4:          4259         96432  java.lang.Class
   ...

**

其中,第一列是 Java 类的 ID 编号,第二列是该类实例的对象数量,第三列是该类实例对象占用的总内存大小,第四列是该类的完整类名。你可以根据这个直方图来分析 Java 进程如何使用内存,以及哪些 Java 对象占用了过多的内存,从而确定程序的内存瓶颈和性能问题。

5:“jmap -heap pid” 命令是用于生成 Java 堆内存的详细信息,其中 “pid” 代表正在运行的 Java 进程的进程 ID。

具体来说,“jmap -heap pid” 命令会输出某个 Java 进程的堆内存大小、使用情况、垃圾回收等信息,这对于进行 Java 应用程序的内存分析和优化非常有用。输出的格式一般为:

Attaching to process ID pid, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 11.0.x

using thread-local object allocation.
Parallel GC with 1 thread(s)

Heap Configuration:
   MinHeapFreeRatio         = 0
   MaxHeapFreeRatio         = 100
   MaxHeapSize              = 1073741824 (1024.0MB)
   NewSize                  = 130023424 (124.0MB)
   MaxNewSize               = 130023424 (124.0MB)
   OldSize                  = 716177408 (683.0MB)
   NewRatio                 = 2
   SurvivorRatio            = 8
   MetaspaceSize            = 268435456 (256.0MB)
   CompressedClassSpaceSize = 1073741824 (1024.0MB)
   MaxMetaspaceSize         = 17592186044415 MB
   G1HeapRegionSize         = 0 (0.0MB)

Heap Usage:
PS Young Generation
Eden Space:
   capacity = 86507520 (82.5MB)
   used     = 47150400 (44.96192932128906MB)
   free     = 39357120 (37.53807067871094MB)
   54.48613359228754% used
...

**

其中,第一部分是 JVM 的版本信息、Garbage Collector 信息等,第二部分是堆内存配置信息,第三部分是堆内存的使用情况。你可以根据这个信息来分析 Java 进程的内存使用情况,以及确定内存溢出的原因和解决方案。

将上述信息输出文件,下载到本地: jmap -heap pid > java-heap.txt,本地打开查找问题原因

6:"jmap -dump:format=b,file=xxxx.hprof pid"命令用于将正在运行的Java进程的堆内存转储(Dump)到指定的文件中,其中"pid"代表正在运行的Java进程的进程ID,"xxxx.hprof"为输出的堆内存转储文件名(可以任意指定)。

具体来说,"jmap -dump"命令允许你动态地保存进程堆内存的内容,生成二进制格式的 ".hprof" 文件。这个文件可以被各种内存分析工具使用,如MAT、VisualVM、Eclipse Memory Analyzer等,它们可以分析和可视化Java堆内存中的各种对象、实例和引用,从而帮助找到内存泄漏、死锁、并发问题等。

输出堆转储的命令行格式为:"jmap -dump:format=b,file=xxxx.hprof pid"。其中,"format=b"是指将转储生成的文件以二进制格式存储,"file=xxxx.hprof"是指定堆内存转储文件名(可以自定义命名),"pid"指定要生成堆内存快照的进程 ID。

生成的堆内存转储文件通常比较大,因此建议在生成转储时进程最好处于空闲状态,以避免影响系统的正常运行。生成转储时建议在路径中使用绝对路径,以避免意外的覆盖或删除操作。

7:使用 MemoryAnalizer(简称 MIT) 分析 xxxx.hprof,可以查找出占用内存较大的业务数据