当前位置: 首页 > news >正文

Jvm之NativeMemoryTracking 使用

开启 Native Memory Tracking

通过 -XX:NativeMemoryTracking 开启:

-XX:NativeMemoryTracking=off:这是默认值,即关闭 Native Memory Tracking
-XX:NativeMemoryTracking=summary: 开启 Native Memory Tracking,但是仅仅按照各个 JVM 子系统去统计内存占用情况
-XX:NativeMemoryTracking=detail:开启 Native Memory Tracking,从每次 JVM 中申请内存的不同调用路径的维度去统计内存占用情况。

注意,开启 detail 比开启 summary 的消耗要大不少,因为 detail 每次都要解析 CallSite 分辨调用位置。

查看 Native Memory Tracking 的信息

开启之后,我们可以通过 jcmd 命令去查看 Native Memory Tracking 的信息,即jcmd VM.native_memory:

jcmd <pid> VM.native_memory或者jcmd <pid> VM.native_memory summary:

两者是等价的,即查看 Native Memory Tracking 的 summary 信息。默认单位是 KB,可以指定单位为其他,例如 jcmd <pid> VM.native_memory summary scale=MB
jcmd VM.native_memory detail:

查看 Native Memory Tracking 的 detail 信息,包括 summary 信息,以及按照虚拟内存映射分组的内存使用信息,还有按照不同 CallSite 调用分组的内存使用情况。默认单位是 KB,可以指定单位为其他,例如 jcmd <pid> VM.native_memory detail scale=MB

Native Memory Tracking 的使用

一般地,只有遇到问题的时候,我们才会考虑开启 Native Memory Tracking,并且在定位出问题后,我们想把它关闭,可以通过 jcmd <pid> VM.native_memory shutdown 进行关闭并清理掉之前 Native Memory tracking 使用的埋点以及占用的内存。
我们无法动态开启 Native Memory tracking,所以只要关闭了,这个进程就无法再开启了。
jcmd 本身提供了简单的对比功能,例如:

jcmd <pid> VM.native_memory baseline 记录当前内存占用信息

之后过一段时间

 jcmd <pid> VM.native_memory summary.diff

会输出当前 Native Memory Tracking 的 summary 信息,如果与第一步 baseline 的有差异,会在对应位将差异输出

但是这个工具本身比较粗糙,我们有时候并不知道何时调用 jcmd VM.native_memory summary.diff 合适,因为我们不确定什么时候会有我们想看到的内存使用过大的问题。所以我们一般做成一种持续监控的方式

Native Memory Tracking 的 summary 信息每部分含义

Native Memory Tracking:Total: reserved=5226MB, committed=4044MB
-                 Java Heap (reserved=2688MB, committed=2688MB)(mmap: reserved=2688MB, committed=2688MB) -                     Class (reserved=1122MB, committed=110MB)(classes #17824)(malloc=2MB #35027) (mmap: reserved=1120MB, committed=108MB) -                    Thread (reserved=539MB, committed=539MB)(thread #535)(stack: reserved=536MB, committed=536MB)(malloc=2MB #2708) (arena=1MB #1068)-                      Code (reserved=258MB, committed=89MB)(malloc=15MB #18512) (mmap: reserved=244MB, committed=74MB) -                        GC (reserved=78MB, committed=78MB)(malloc=69MB #945) (mmap: reserved=9MB, committed=9MB) -                  Compiler (reserved=1MB, committed=1MB)-                  Internal (reserved=441MB, committed=441MB)(malloc=441MB #27828) -                    Symbol (reserved=23MB, committed=23MB)(malloc=20MB #222966) (arena=3MB #1)-    Native Memory Tracking (reserved=5MB, committed=5MB)(tracking overhead=5MB)-               Arena Chunk (reserved=11MB, committed=11MB)(malloc=11MB) -                   Unknown (reserved=59MB, committed=59MB)(mmap: reserved=59MB, committed=59MB) 

以下是各个部分的内存使用情况:

Java Heap(堆内存):

保留(reserved):2688MB
承诺(committed):2688MB
通过 mmap 方式分配的内存为保留和承诺的相同值。
Class(类元数据):

保留:1122MB
承诺:110MB
包含 17824 个类。
通过 malloc 分配了 2MB,35027 个对象。
通过 mmap 方式分配的内存保留为 1120MB,承诺为 108MB。
Thread(线程):

保留:539MB
承诺:539MB
有 535 个线程。
线程栈通过 mmap 方式分配,保留和承诺均为 536MB。
通过 malloc 分配了 2MB,2708 个对象。
arena 管理的内存为 1MB,1068 个对象。
Code(代码):

保留:258MB
承诺:89MB
通过 malloc 分配了 15MB,18512 个对象。
通过 mmap 方式分配的内存保留为 244MB,承诺为 74MB。
GC(垃圾收集器):

保留:78MB
承诺:78MB
通过 malloc 分配了 69MB,945 个对象。
通过 mmap 方式分配的内存保留和承诺均为 9MB。
Compiler(编译器):

保留:1MB
承诺:1MB
Internal(内部):

保留:441MB
承诺:441MB
通过 malloc 分配了 441MB,27828 个对象。
Symbol(符号表):

保留:23MB
承诺:23MB
通过 malloc 分配了 20MB,222966 个对象。
arena 管理的内存为 3MB,1 个对象。
Native Memory Tracking(NMT 本身):

保留:5MB
承诺:5MB
跟踪开销为 5MB。
Arena Chunk:

保留:11MB
承诺:11MB
通过 malloc 分配了 11MB。
Unknown(未知):

保留:59MB
承诺:59MB
通过 mmap 方式分配的内存保留和承诺均为 59MB。

过一段时间执行jcmd 7 VM.native_memory summary.diff 查看变化如下

Native Memory Tracking:Total: reserved=5344386KB -2372KB, committed=4136894KB -1332KB-                 Java Heap (reserved=2752512KB, committed=2752512KB)(mmap: reserved=2752512KB, committed=2752512KB)-                     Class (reserved=1151599KB +2132KB, committed=115055KB +2260KB)(classes #18263 +376)(malloc=2671KB +84KB #37745 +1690)(mmap: reserved=1148928KB +2048KB, committed=112384KB +2176KB)-                    Thread (reserved=551959KB -2065KB, committed=551959KB -2065KB)(thread #535 -2)(stack: reserved=548952KB -2056KB, committed=548952KB -2056KB)(malloc=1742KB -7KB #2708 -10)(arena=1265KB -2 #1068 -4)-                      Code (reserved=265074KB +119KB, committed=94126KB +1031KB)(malloc=15474KB +119KB #19137 +474)(mmap: reserved=249600KB, committed=78652KB +912KB)-                        GC (reserved=79435KB +2KB, committed=79435KB +2KB)(malloc=70595KB +2KB #1043 +65)(mmap: reserved=8840KB, committed=8840KB)-                  Compiler (reserved=756KB +38KB, committed=756KB +38KB)(malloc=625KB +38KB #943 +90)(arena=131KB #3)-                  Internal (reserved=452580KB +640KB, committed=452580KB +640KB)(malloc=452580KB +640KB #28587 +557)-                    Symbol (reserved=23694KB +293KB, committed=23694KB +293KB)(malloc=20841KB +261KB #227524 +4499)(arena=2853KB +32 #1)-    Native Memory Tracking (reserved=5656KB +279KB, committed=5656KB +279KB)(malloc=546KB +136KB #8148 +1887)(tracking overhead=5110KB +143KB)-               Arena Chunk (reserved=233KB -3810KB, committed=233KB -3810KB)(malloc=233KB -3810KB)-                   Unknown (reserved=60888KB, committed=60888KB)(mmap: reserved=60888KB, committed=60888KB)

有时需要结合执行进程监控文件

cat /proc/[pid]/smaps_rollup

执行cat /proc/23/smaps_rollup

00400000-7fff957e1000 ---p 00000000 00:00 0                              [rollup]
Rss:             3642320 kB
Pss:             3626824 kB
Pss_Anon:        3625332 kB
Pss_File:           1492 kB
Pss_Shmem:             0 kB
Shared_Clean:      16932 kB
Shared_Dirty:          0 kB
Private_Clean:        56 kB
Private_Dirty:   3625332 kB
Referenced:      3642320 kB
Anonymous:       3625332 kB
LazyFree:              0 kB
AnonHugePages:         0 kB
ShmemPmdMapped:        0 kB
FilePmdMapped:         0 kB
Shared_Hugetlb:        0 kB
Private_Hugetlb:       0 kB
Swap:                  0 kB
SwapPss:               0 kB
Locked:                0 kB
http://www.lryc.cn/news/503390.html

相关文章:

  • PKCS#7、Bit padding(位填充)、Byte padding(字节填充)、Zero padding(零填充)
  • R语言学习笔记-1
  • 我在广州学 Mysql 系列之 数据“表”的基本操作
  • auto-gptq安装以及不适配软硬件环境可能出现的问题及解决方式
  • 【R语言】基础知识
  • 【一本通】虫洞
  • python爬虫--小白篇【爬虫实践】
  • Unity背包道具拖拽(极简版实现)
  • spark读取普通文件
  • MySQL SQL语句性能优化
  • 【蓝桥杯每日一题】技能升级
  • css 实现在一条线上流动小物体(offset-path)
  • 探索 Robyn 框架 —— 下一代高性能 Web 框架
  • STL容器-map P3613【深基15.例2】寄包柜 普及-
  • 【MySQL 进阶之路】了解 性能优化 与 设计原则
  • MySQL之数据库三大范式
  • [大数据]Hudi
  • jenkins harbor安装
  • JavaScript 高级特性与 ES6 新特性:正则表达式的深度探索
  • 正则表达式——参考视频B站《奇乐编程学院》
  • 【FFmpeg】FFmpeg 内存结构 ⑥ ( 搭建开发环境 | AVPacket 创建与释放代码分析 | AVPacket 内存使用注意事项 )
  • 【多模态文档智能】OCR-free感知多模态大模型技术链路及训练数据细节
  • Mybatis动态sql执行过程
  • leetcode 31 Next Permutation
  • 每日一练 | 华为 eSight 创建的缺省角色
  • PyTorch基本使用-自动微分模块
  • libevent-Reactor设计模式【1】
  • 奇奇怪怪的错误-Tag和space不兼容
  • 29.攻防世界ics-06
  • 强化学习路径规划:基于SARSA算法的移动机器人路径规划,可以更改地图大小及起始点,可以自定义障碍物,MATLAB代码