上篇文章对Java进程的内存进行了总体的介绍,本文将介绍JVM管理内存的分析方法
jvm命令方式分析
JVM内存概览和镜像
内存概览:jmap -heap <pid>
内存镜像:对这部分内存可以通过 jmap -dump:live,format=b,file=heap.hprof <pid>
命令打印出内存镜像进行具体分析。堆内存镜像的分析就比较常见了,本文就不过多讲述。
Metaspace和CompressedClassSpace
查看Metaspace和CompressedClassSpace的申请和使用内存大小。
通过jcmd <pid> GC.heap_info
查看
获取线程内存总内存
通过jstack <pid> | grep -e "^\"\S" | wc -l
命令获取线程数量,线程数 * Xss就是所有线程的总内存
Code Cache和DirectByteBuffer的内存
这两块内存不能通过命令查询到,下面我们通过其他方式获取这两块内存的使用大小
arthas分析
- 下载arthas:arthas.aliyun.com/download/la…
- 通过
java -jar arthas-boot.jar
命令启动arthas - 切入进程后,通过memory/dashboard命令就可以看到内存情况
通过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{}