JVM管理内存分析

31 阅读2分钟

上篇文章对Java进程的内存进行了总体的介绍,本文将介绍JVM管理内存的分析方法

jvm命令方式分析

JVM内存概览和镜像

内存概览:jmap -heap <pid> 内存镜像:对这部分内存可以通过 jmap -dump:live,format=b,file=heap.hprof <pid> 命令打印出内存镜像进行具体分析。堆内存镜像的分析就比较常见了,本文就不过多讲述。 image.png

Metaspace和CompressedClassSpace

查看Metaspace和CompressedClassSpace的申请和使用内存大小。 通过jcmd <pid> GC.heap_info 查看 image.png

获取线程内存总内存

通过jstack <pid> | grep -e "^\"\S" | wc -l 命令获取线程数量,线程数 * Xss就是所有线程的总内存

Code Cache和DirectByteBuffer的内存

这两块内存不能通过命令查询到,下面我们通过其他方式获取这两块内存的使用大小

arthas分析

  1. 下载arthas:arthas.aliyun.com/download/la…
  2. 通过java -jar arthas-boot.jar 命令启动arthas
  3. 切入进程后,通过memory/dashboard命令就可以看到内存情况

image.png 通过arthas可以看到堆内存、Metaspace、CompressedClassSpace、Code Cache、DirectByteBuffer。还能看到文件内存映射的空间mapped。

SpringActuator监控

通过SpringActuator采集指标,然后上报到监控平台(比如,promethues),我们可以通过工程化的方式进行内存监控。 这种方式可以看到java进程各个内存指标的变化情况,包括Eden、S0、S1、老年代、Metaspace、CompressedClassSpace、Code Cache、DirectByteBuffer、MappedBuffer、线程数。SpringActuator jvm内存相关的指标,下面是G1的内存指标,其他GC算法的指标也类似:

# G1的Eden区
jvm_memory_used_bytes{id="G1 Eden Space"}
jvm_memory_committed_bytes{id="G1 Eden Space"}
jvm_memory_max_bytes{id="G1 Eden Space"}
# G1的老年代
jvm_memory_used_bytes{id="G1 Old Gen"}
jvm_memory_committed_bytes{id="G1 Old Gen"}
jvm_memory_max_bytes{id="G1 Old Gen"}
# G1的S0+S1
jvm_memory_used_bytes{id="G1 Survivor Space"}
jvm_memory_committed_bytes{id="G1 Survivor Space"}
jvm_memory_max_bytes{id="G1 Survivor Space"}
# CodeCache
jvm_memory_used_bytes{id="Code Cache"}
jvm_memory_committed_bytes{id="Code Cache"}
jvm_memory_max_bytes{id="Code Cache"}
# Compressed Class Space
jvm_memory_used_bytes{id="Compressed Class Space"}
jvm_memory_committed_bytes{id="Compressed Class Space"}
jvm_memory_max_bytes{id="Compressed Class Space"}
# 元空间
jvm_memory_used_bytes{id="Metaspace"}
jvm_memory_committed_bytes{id="Metaspace"}
jvm_memory_max_bytes{id="Metaspace"}
# DirectBuffer
jvm_buffer_memory_used_bytes{id="direct"}
jvm_buffer_total_capacity_bytes{id="direct"}
# 文件映射
jvm_buffer_memory_used_bytes{id="mapped"}
jvm_buffer_total_capacity_bytes{id="mapped"}
# 线程数
jvm_threads_daemon_threads{}
jvm_threads_live_threads{}
jvm_threads_peak_threads{}

image.png image.png image.png