htop:查进程的内存占用
$ htop
相关名词:
VIRT:virtual memory usage 虚拟内存
- 进程“需要的”虚拟内存大小,包括进程使用的库、代码、数据等
- 假如进程申请100m的内存,但实际只使用了10m,那么它会增长100m,而不是实际的使用量
RES:resident memory usage 常驻内存
- 进程当前使用的内存大小,但不包括swap out
- 包含其他进程的共享
- 如果申请100m的内存,实际使用10m,它只增长10m,与VIRT相反
- 关于库占用内存的情况,它只统计加载的库文件所占内存大小
SHR:shared memory 共享内存
- 除了自身进程的共享内存,也包括其他进程的共享内存
- 虽然进程只使用了几个共享库的函数,但它包含了整个共享库的大小
- 计算某个进程所占的物理内存大小公式:RES – SHR
- swap out后,它将会降下来
pmap:查进程的内存分布
先使用htop找到java进程的进程id,然后:
pmap -x 30420
上面的命令的输出结果没法进行排序找出较大的内存块,建议导出成文件,下载到自己本机分析。我自己的做法是在自己本机使用IDEA打开,然后利用多行编辑功能在每一列添加英文逗号“,”
,因为这样能都对RSS
(Resident Set Size)列排序,具体操作如下:
RSS 是常驻内存集(Resident Set Size),表示该进程分配的内存大小
导出:
# 在服务器上导出
pmap -x 30420 > pmap30420.csv
# 利用lszrz下载
sz -be pmap30420.csv
然后vscode(不要用IDEA,很卡。行数多的时候vscode没那么卡)打开,利用多行编辑(快捷键alt + shift + up/down)加英文逗号:
然后就可以用Excel打开,对第三列RSS
倒序排序找出可疑的(占用多的)是哪些内存块:
NMT:查JVM内存
注意:NMT是用来看Java进程中JVM部分的内存情况,并非整个Java进程的内存情况
java -XX:NativeMemoryTracking=[detail|summary]
# 例如:
java -Xms500M -Xmx1500M -XX:NativeMemoryTracking=detail -jar ewulian-server.jar
然后使用jcmd
# 加detail是看详情
jcmd PID VM.native_memory [detail]
例如:
$ jcmd 30420 VM.native_memory > jcmd30420-summary.txt
$ cat jcmd30420-summary.txt
30420:
Native Memory Tracking:
Total: reserved=3201582KB, committed=991846KB
- Java Heap (reserved=1536000KB, committed=565760KB)
(mmap: reserved=1536000KB, committed=565760KB)
- Class (reserved=1141993KB, committed=104385KB)
(classes #15022)
(malloc=7401KB #29512)
(mmap: reserved=1134592KB, committed=96984KB)
- Thread (reserved=77490KB, committed=77490KB)
(thread #76)
(stack: reserved=77060KB, committed=77060KB)
(malloc=246KB #381)
(arena=184KB #147)
- Code (reserved=260241KB, committed=61473KB)
(malloc=10641KB #14504)
(mmap: reserved=249600KB, committed=50832KB)
- GC (reserved=61908KB, committed=58788KB)
(malloc=5784KB #490)
(mmap: reserved=56124KB, committed=53004KB)
- Compiler (reserved=365KB, committed=365KB)
(malloc=235KB #1216)
(arena=131KB #6)
- Internal (reserved=98440KB, committed=98440KB)
(malloc=98408KB #21205)
(mmap: reserved=32KB, committed=32KB)
- Symbol (reserved=20667KB, committed=20667KB)
(malloc=17590KB #178837)
(arena=3077KB #1)
- Native Memory Tracking (reserved=4353KB, committed=4353KB)
(malloc=412KB #5868)
(tracking overhead=3942KB)
- Arena Chunk (reserved=125KB, committed=125KB)
(malloc=125KB)
jcmd还有其它功能,比如查看Java进程的堆直方图
查看java进程的堆直方图
$ jcmd 30420 GC.class_histogram | less
说明:
-
GC.class_histogram
:输出的仅包含活跃对象 -
[C
:字符数组 -
[B
:字节数组 -
[Ljava.lang.Object
:Object数组
jcmd的其它功能可以通过help查看:
$ jcmd 30420 help
30420:
The following commands are available:
JFR.stop
JFR.start
JFR.dump
JFR.check
VM.native_memory
VM.check_commercial_features
VM.unlock_commercial_features
ManagementAgent.stop
ManagementAgent.start_local
ManagementAgent.start
VM.classloader_stats
GC.rotate_log
Thread.print
GC.class_stats
GC.class_histogram
GC.heap_dump
GC.finalizer_info
GC.heap_info
GC.run_finalization
GC.run
VM.uptime
VM.dynlibs
VM.flags
VM.system_properties
VM.command_line
VM.version
help