当前位置: 首页 > 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

相关文章:

Jvm之NativeMemoryTracking 使用

开启 Native Memory Tracking 通过 -XX:NativeMemoryTracking 开启&#xff1a; -XX:NativeMemoryTrackingoff:这是默认值&#xff0c;即关闭 Native Memory Tracking -XX:NativeMemoryTrackingsummary: 开启 Native Memory Tracking&#xff0c;但是仅仅按照各个 JVM 子系统…...

PKCS#7、Bit padding(位填充)、Byte padding(字节填充)、Zero padding(零填充)

PKCS#7、Bit padding&#xff08;位填充&#xff09;、Byte padding&#xff08;字节填充&#xff09;、Zero padding&#xff08;零填充&#xff09;是密码学常见的填充方式。 Bit padding&#xff08;位填充&#xff09;&#xff1a; 位填充可以应用于任意长度的消息。在消息…...

R语言学习笔记-1

1. 基础操作和函数 清空环境&#xff1a;rm(list ls()) 用于清空当前的R环境。 打印输出&#xff1a;print("Hello, world") 用于输出文本到控制台。 查看已安装包和加载包&#xff1a; search()&#xff1a;查看当前加载的包。install.packages("package_na…...

我在广州学 Mysql 系列之 数据“表”的基本操作

ℹ️大家好&#xff0c;我是&#x1f606;练小杰&#xff0c;今天主要讲得是Mysql数据表的基本操作内容~~ 昨天讲了“Mysql 数据“库“的基本操作”~~ 想要了解更多&#x1f236;️MYSQL 数据库的命令行总结&#xff01;&#xff01;&#xff01; “真相永远只有一个”——工藤…...

auto-gptq安装以及不适配软硬件环境可能出现的问题及解决方式

目录 1、auto-gptq是什么&#xff1f;2、auto-gptq安装3、auto-gptq不正确安装可能会出现的问题&#xff08;1&#xff09;爆出&#xff1a;CUDA extension not installed.&#xff08;2&#xff09;没有报错但是推理速度超级慢 1、auto-gptq是什么&#xff1f; Auto-GPTQ 是一…...

【R语言】基础知识

一、对象与变量 R语言中的所有事物都是对象&#xff0c;如向量、列表、函数&#xff0c;变量、甚至环境等。它的所有代码都是基于对象object的操作&#xff0c;变量只是调用对象的手段。 1、对象 在R语言中&#xff0c;对计算机内存的访问是通过对象实现的。 # 字符型向量 …...

【一本通】虫洞

【一本通】虫洞 C语言代码C代码JAVA代码 &#x1f490;The Begin&#x1f490;点点关注&#xff0c;收藏不迷路&#x1f490; John在他的农场中闲逛时发现了许多虫洞。虫洞可以看作一条十分奇特的有向边&#xff0c;并可以使你返回到过去的一个时刻&#xff08;相对你进入虫洞之…...

python爬虫--小白篇【爬虫实践】

一、前言 1.1、王者荣耀皮肤爬虫 根据王者荣耀链接&#xff0c;将王者荣耀的全部英雄的全部皮肤图片爬取保存到本地。经过分析得到任务的三个步骤&#xff1a; 根据首页全部英雄列表连接获取全部英雄的名称hero_name以及对应的hero_id&#xff1b;根据单个英雄的hero_name和h…...

Unity背包道具拖拽(极简版实现)

&#xff08;感觉Csdn代码页面可以再大一点或者加个放大功能 不然得划着看不太舒服&#xff09; 1.关键接口&#xff0c;三个拖拽相关的 2.关键参数&#xff0c;PointerEventData 一直没仔细看过&#xff0c;其实有包含鼠标相关的很多参数&#xff0c;鼠标点击次数&#xff…...

spark读取普通文件

spark读取普通文件 txt文件 """ 将一行数据当做一个字段&#xff0c;需要自己切割 字段名称为value 表结构 可以从sql中搞 """ df spark.read.text("../../data/wordcount/input/data.txt") df spark.read.format("text"…...

MySQL SQL语句性能优化

MySQL SQL语句性能优化指南 一、查询设计优化1. 避免 SELECT *2. 使用 WHERE 进行条件过滤3. 避免在索引列上使用函数和表达式4. 使用 LIMIT 限制返回行数5. 避免使用子查询6. 优化 JOIN 操作7. 避免全表扫描 二、索引优化1. 使用合适的索引2. 覆盖索引3. 索引选择性4. 多列索引…...

【蓝桥杯每日一题】技能升级

技能升级 2024-12-10 蓝桥杯每日一题 技能升级 二分 题目大意 一个角色有 N 种可以增加攻击力的技能&#xff0c;对于第 i 个技能首次升级可以提升 A i A_i Ai​ 点攻击力&#xff0c;随后的每次升级增加的攻击力都会减少 B i B_i Bi​ 。升级 ⌈ A i B i ⌉ \lceil \frac{A…...

css 实现在一条线上流动小物体(offset-path)

直接贴代码,留几个参考网址给大家 【SVG】路径<Path>标签详解,一次搞懂所有命令参数 探秘神奇的运动路径动画 Motion Path <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><meta name="viewport&quo…...

探索 Robyn 框架 —— 下一代高性能 Web 框架

技术博客&#xff1a;探索 Robyn 框架 —— 下一代高性能 Web 框架 什么是 Robyn&#xff1f; Robyn 是一个用 Rust 编写的高性能 Web 框架&#xff0c;旨在通过极简设计和高效并发处理&#xff0c;帮助开发者快速构建可扩展的现代 Web 应用。得益于 Rust 的内存安全性和性能…...

STL容器-map P3613【深基15.例2】寄包柜 普及-

题目来源&#xff1a;洛谷题库 文章目录 map例题map知识点map使用注意&#xff1a;map的常用用法 map例题 P3613【深基15.例2】寄包柜 普及- 题意 根据数据插入/查询 思路 map键值对可以根据柜子编号查找物品&#xff0c;但是柜子又有很多个&#xff0c;考虑数组或者map数组…...

【MySQL 进阶之路】了解 性能优化 与 设计原则

1.B树的优势 “矮胖”结构&#xff1a; 矮&#xff1a;B树的每个节点存储更多的关键字&#xff0c;从而减少了树的层级&#xff08;最多三层&#xff09;&#xff0c;减少了磁盘I/O操作&#xff0c;提高了查询效率。胖&#xff1a;叶子节点存储实际的数据&#xff0c;并使用双…...

MySQL之数据库三大范式

一、什么是范式&#xff1f; 范式是数据库遵循设计时遵循的一种规范&#xff0c;不同的规范要求遵循不同的范式。 &#xff08;范式是具有最小冗余的表结构&#xff09; 范式可以 提高数据的一致性和 减少数据冗余和 更新异常的问题 数据库有六种范式&#xff08;1NF/2NF/3NF…...

[大数据]Hudi

G:\Bigdata\17.hudi\大数据技术之数据湖Hudi 第1章 Hudi概述 1.1 Hudi简介 Apache Hudi(Hadoop Upserts Delete and Incremental)是下一代流数据湖平台。Apache Hudi将核心仓库和数据库功能直接引入数据湖。Hudi提供了表、事务、高效的upserts/delete、高级索引、流摄取服…...

jenkins harbor安装

Harbor是一个企业级Docker镜像仓库‌。 文章目录 1. 什么是Docker私有仓库2. Docker有哪些私有仓库3. Harbor简介4. Harbor安装 1. 什么是Docker私有仓库 Docker私有仓库是用于存储和管理Docker镜像的私有存储库。Docker默认会有一个公共的仓库Docker Hub&#xff0c;而与Dock…...

JavaScript 高级特性与 ES6 新特性:正则表达式的深度探索

在现代 JavaScript 开发中&#xff0c;正则表达式&#xff08;Regular Expressions&#xff09;和高级特性、ES6 新特性的结合使用&#xff0c;能够极大地提升代码的简洁性、可读性和功能性。本文将深入探讨 JavaScript 中的正则表达式及其在高级特性和 ES6 新特性中的应用&…...

[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?

&#x1f9e0; 智能合约中的数据是如何在区块链中保持一致的&#xff1f; 为什么所有区块链节点都能得出相同结果&#xff1f;合约调用这么复杂&#xff0c;状态真能保持一致吗&#xff1f;本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里&#xf…...

MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例

一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...

Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器

第一章 引言&#xff1a;语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域&#xff0c;文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量&#xff0c;支撑着搜索引擎、推荐系统、…...

Linux-07 ubuntu 的 chrome 启动不了

文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了&#xff0c;报错如下四、启动不了&#xff0c;解决如下 总结 问题原因 在应用中可以看到chrome&#xff0c;但是打不开(说明&#xff1a;原来的ubuntu系统出问题了&#xff0c;这个是备用的硬盘&a…...

【C语言练习】080. 使用C语言实现简单的数据库操作

080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...

《基于Apache Flink的流处理》笔记

思维导图 1-3 章 4-7章 8-11 章 参考资料 源码&#xff1a; https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...

NFT模式:数字资产确权与链游经济系统构建

NFT模式&#xff1a;数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新&#xff1a;构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议&#xff1a;基于LayerZero协议实现以太坊、Solana等公链资产互通&#xff0c;通过零知…...

Element Plus 表单(el-form)中关于正整数输入的校验规则

目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入&#xff08;联动&#xff09;2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...

代理篇12|深入理解 Vite中的Proxy接口代理配置

在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...

Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档&#xff09;&#xff0c;如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下&#xff0c;风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...