Java本机内存跟踪NMT实战详解

article/2025/8/26 19:37:43

JVM通常会额外分配内存。这些额外的分配,会导致java程序占用的内存,超出-Xmx的限制。让我们使用NMT查看内存的使用情况

NMT 是什么

NMT 是一种 Java Hotspot VM 功能,用于跟踪 HotSpot VM 的内部内存使用情况。您可以使用该jcmd实用程序访问 NMT 数据。NMT 不跟踪第三方本机代码和 Oracle Java Development Kit (JDK) 类库的内存分配。NMT 不包括MBeanHotSpot for Java Mission Control (JMC) 中的 NMT。

主要特征

Native Memory Tracking 与 jcmd一起使用时,可以在不同级别跟踪 Java 虚拟机 (JVM) 或 HotSpot VM 内存使用情况。NMT 仅跟踪 JVM 或 HotSpot VM 使用的内存,而不是用户的本机内存。NMT 没有提供类数据共享 (CDS) 存档使用的内存的完整信息。

NMT 支持以下功能:

  • 生成摘要和详细报告。

  • 为以后的比较建立早期基线。(基线是在特定时期的一个“快照”。)

  • 使用 JVM 命令行选项在 JVM 退出时请求内存使用报告。

使用

HotSpot VM 的 NMT 默认关闭。

启用 NMT

语法:

-XX:NativeMemoryTracking=[off | summary | detail]

参数说明:

NMT 选项描述
off

NMT默认关闭。

summary

仅收集子系统聚合的内存使用情况。

detail

收集各个调用站点的内存使用情况。

 java -XX:NativeMemoryTracking=detail -jar test.jar

注:启用 NMT 会导致 5% -10% 的性能开销。

未开启NMT,提示:

Native memory tracking is not enabled

[root@sanxingtongxue ~]# jcmd 513791 VM.native_memory
513791:
Native memory tracking is not enabled

使用 jcmd 访问 NMT 数据

jcmd收集转储数据,并可选择将数据与上一个基线进行比较。

语法:

jcmd <pid> VM.native_memory [summary | detail | baseline | summary.diff | detail.diff | shutdown] [scale= KB | MB | GB]

参数说明:

jcmd NMT 选项描述
summary

打印按类别汇总的摘要。

detail
  • 打印内存使用情况,按类别汇总
  • 打印虚拟内存映射
  • 打印内存使用情况,按调用站点汇总
baseline

创建一个新的内存使用快照进行比较。

summary.diff

根据最后一个基线打印一份新的总结报告。

detail.diff

根据最后一个基线打印一份新的详细报告。

shutdown

停止 NMT。

示例如下:

[root@sanxingtongxue ~]# jcmd 523265 VM.native_memory summary
523265:Native Memory Tracking:Total: reserved=1830732KB, committed=145464KB
-                 Java Heap (reserved=442368KB, committed=44060KB)(mmap: reserved=442368KB, committed=44060KB) -                     Class (reserved=1082480KB, committed=36464KB)(classes #6162)(malloc=1136KB #6847) (mmap: reserved=1081344KB, committed=35328KB) -                    Thread (reserved=29927KB, committed=29927KB)(thread #30)(stack: reserved=29792KB, committed=29792KB)(malloc=102KB #174) (arena=32KB #56)-                      Code (reserved=251447KB, committed=11795KB)(malloc=1847KB #3272) (mmap: reserved=249600KB, committed=9948KB) -                        GC (reserved=1473KB, committed=181KB)(malloc=25KB #126) (mmap: reserved=1448KB, committed=156KB) -                  Compiler (reserved=151KB, committed=151KB)(malloc=18KB #308) (arena=133KB #5)-                  Internal (reserved=11357KB, committed=11357KB)(malloc=11325KB #7724) (mmap: reserved=32KB, committed=32KB) -                    Symbol (reserved=9890KB, committed=9890KB)(malloc=6813KB #60966) (arena=3077KB #1)-    Native Memory Tracking (reserved=1463KB, committed=1463KB)(malloc=180KB #2549) (tracking overhead=1283KB)-               Arena Chunk (reserved=177KB, committed=177KB)(malloc=177KB) 

结果参数说明:
在这里插入图片描述

Total Allocations

NMT显示总的预留内存、已提交内存:

Total: reserved=1830732KB, committed=145464KB

预留内存表示我们的应用程序可能使用的内存总量。已提交内存表示应用程序当前使用的内存。

Java Heap

heap内存占用情况显示如下:

  Java Heap (reserved=442368KB, committed=44060KB)(mmap: reserved=442368KB, committed=44060KB) 

Thread

线程内存分配情况如下:

Thread (reserved=29927KB, committed=29927KB)(thread #30)(stack: reserved=29792KB, committed=29792KB)(malloc=102KB #174) (arena=32KB #56)

30个线程,stack内存共计29M,差不多每个线程的stack占用1M。JVM在创建线程时,同时分配stack内存,所以预留内存和提交内存是一样的。

Code Cache

JIT生成并缓存的汇编指令的内存占用情况:

Code (reserved=251447KB, committed=11795KB)(malloc=1847KB #3272) (mmap: reserved=249600KB, committed=9948KB) 

GC

GC内存占用情况如下:

 GC (reserved=1473KB, committed=181KB)(malloc=25KB #126) (mmap: reserved=1448KB, committed=156KB) 

Serial GC是一个简单的多的方法,当使用此方法时,配置方法如下:

java -XX:NativeMemoryTracking=summary -Xms300m -Xmx300m -XX:+UseSerialGC -jar test.jar

当然,我们不能仅根据内存消耗来决定选择什么GC算法,因为Serial GC的“stop-the-world”特性,可能会导致性能下降。

Symbol

symbol内存占用情况如下,如string table和constant pool:

Symbol (reserved=9890KB, committed=9890KB)(malloc=6813KB #60966) (arena=3077KB #1)

大概占用9M。

在 VM 退出时获取 NMT 数据

要在 VM 退出时获取上次内存使用情况的数据,请在启用本机内存跟踪时使用以下 VM 诊断命令行选项。详细程度基于跟踪级别。

-XX:+UnlockDiagnosticVMOptions -XX:+PrintNMTStatistics

使用 NMT 检测内存泄漏

使用本机内存跟踪检测内存泄漏的过程。
请按照以下步骤检测内存泄漏:

  1. 使用命令行选项启动 JVM 并进行摘要详细信息-XX:NativeMemoryTracking=summary跟踪:-XX:NativeMemoryTracking=detail.
  2. 建立早期基线。使用 NMT 基线功能通过运行以下命令在开发和维护期间获取要比较的基线:jcmd <pid> VM.native_memory baseline.
  3. 使用以下方法监视内存更改:jcmd <pid> VM.native_memory detail.diff
  4. 如果应用程序泄漏少量内存,则可能需要一段时间才能显示出来。

示例如下:

$ jcmd <pid> VM.native_memory baseline
Baseline succeeded

然后,过一段时间,可以将当前内存占用与基线做比较:

$ jcmd <pid> VM.native_memory summary.diff

NMT通过+ -符号,表示这段时间内,内存占用的变化情况:

[root@sanxingtongxue ~]# jcmd 523265 VM.native_memory summary.diff
523265:Native Memory Tracking:Total: reserved=1831059KB +359KB, committed=146815KB +1383KB-                 Java Heap (reserved=442368KB, committed=44060KB)(mmap: reserved=442368KB, committed=44060KB)-                     Class (reserved=1082518KB +38KB, committed=37526KB +1062KB)(classes #6372 +210)(malloc=1174KB +38KB #7083 +236)(mmap: reserved=1081344KB, committed=36352KB +1024KB)-                    Thread (reserved=29927KB, committed=29927KB)(thread #30)(stack: reserved=29792KB, committed=29792KB)(malloc=102KB #174)(arena=32KB #56)-                      Code (reserved=251480KB +34KB, committed=11828KB +34KB)(malloc=1880KB +34KB #3409 +137)(mmap: reserved=249600KB, committed=9948KB)-                        GC (reserved=1473KB, committed=181KB)(malloc=25KB #126)(mmap: reserved=1448KB, committed=156KB)-                  Compiler (reserved=161KB +10KB, committed=161KB +10KB)(malloc=28KB +10KB #334 +26)(arena=133KB #5)-                  Internal (reserved=11398KB +41KB, committed=11398KB +41KB)(malloc=11366KB +41KB #7936 +212)(mmap: reserved=32KB, committed=32KB)-                    Symbol (reserved=10046KB +156KB, committed=10046KB +156KB)(malloc=6969KB +156KB #62913 +1947)(arena=3077KB #1)-    Native Memory Tracking (reserved=1511KB +81KB, committed=1511KB +81KB)(malloc=187KB +33KB #2645 +469)(tracking overhead=1325KB +47KB)-               Arena Chunk (reserved=177KB, committed=177KB)(malloc=177KB)

在这里插入图片描述
三四更雪风不减吹袭一夜


http://chatgpt.dhexx.cn/article/TQdIjlva.shtml

相关文章

fastText模型

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 目标一、fastText的模型架构1. N-gram的理解1.1 bag of word 2. fastTex模型中层次化的softmax2.1 哈夫曼树和哈夫曼编码2.1.1 哈夫曼树的定义2.1.2 哈夫曼树的相关…

fastText Python 教程

诸神缄默不语-个人CSDN博文目录 fastText Python官方GitHub文件夹网址&#xff1a;fastText/python at main facebookresearch/fastText 本文介绍fastText Python包的基本教程&#xff0c;包括安装方式和简单的使用方式。 我看gensim也有对fasttext算法的支持&#xff08;ht…

玩转Fasttext

Fasttext是Facebook AI Research最近推出的文本分类和词训练工具&#xff0c;其源码已经托管在Github上。Fasttext最大的特点是模型简单&#xff0c;只有一层的隐层以及输出层&#xff0c;因此训练速度非常快&#xff0c;在普通的CPU上可以实现分钟级别的训练&#xff0c;比深度…

FastText详解

词向量对比word2vec https://zhuanlan.zhihu.com/p/75391062 0、实战经验 word2vec vs fastText区别&#xff1f; 思想&#xff1a;将整篇文档的词及n-gram向量叠加平均得到文档向量&#xff0c;然后使用文档向量做softmax多分类。 word2vec vs fastText区别&#xff1f; …

FastText原理

一、简介 fasttext是facebook开源的一个词向量与文本分类工具&#xff0c;在2016年开源&#xff0c;典型应用场景是“带监督的文本分类问题”。提供简单而高效的文本分类和表征学习的方法&#xff0c;性能比肩深度学习而且速度更快。 fastText结合了自然语言处理和机器学习中最…

Fasttext

Fasttext Paper Fasttext特点 模型简单&#xff0c;只有一层的隐层以及输出层&#xff0c;因此训练速度非常快不需要训练词向量&#xff0c;Fasttext自己会训练两个优化&#xff1a;Hierarchical Softmax、N-gram Fasttext模型架构 fastText模型架构和word2vec中的CBOW很相…

[NLP]文本分类之fastText详解

Word2vec, Fasttext, Glove, Elmo, Bert, Flair pre-train Word Embedding 一、fastText简介 fastText是一个快速文本分类算法&#xff0c;与基于神经网络的分类算法相比有两大优点&#xff1a; 1、fastText在保持高精度的情况下加快了训练速度和测试速度 2、fastText不需要预…

FastText:高效的文本分类工具

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️ &#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…

FastText的简单介绍

0、引言 FastText是facebook开源的一款集word2vec、文本分类等一体的机器学习训练工具。在之前的论文中&#xff0c;作者用FastText和char-CNN、deepCNN等主流的深度学习框架&#xff0c;在同样的公开数据集上进行对比测试&#xff0c;在保证准确率稳定的情况下&#xff0c;Fa…

快速文本分类(FastText)

&#x1f50e;大家好&#xff0c;我是Sonhhxg_柒&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f4dd;个人主页&#xff0d;Sonhhxg_柒的博客_CSDN博客 &#x1f4c3; &#x1f381;欢迎各位→点赞…

FastText:快速的文本分类器

转载请注明作者和出处&#xff1a;http://blog.csdn.net/john_bh/ 一、简介二、FastText原理 2.1 模型架构2.2 层次SoftMax2.3 N-gram特征 三、 基于fastText实现文本分类 3.1 fastText有监督学习分类3.2 fastText有监督学习分类 三、总结 3.1 fastText和word2vec的区别3.2 小…

DCGAN的PyTorch实现

DCGAN 1.什么是GAN GAN是一个框架&#xff0c;让深度模型可以学习到数据的分布&#xff0c;从而通过数据的分布生成新的数据(服从同一分布)。 其由一个判别器和一个生成器构成&#xff0c;生成器负责生成“仿造数据”&#xff0c;判别器负责判断“仿造数据”的质量。两者一起…

GAN论文阅读——DCGAN

论文标题&#xff1a;Unsupervised Representation Learning with Deep Convolutional Generative Adversarial Networks 论文链接&#xff1a;https://arxiv.org/abs/1511.06434 参考资料&#xff1a;http://blog.csdn.net/liuxiao214/article/details/73500737      …

DCGAN整理总结

DCGAN整理总结 GAN什么是GAN&#xff1f;GAN重要参数及损失函数 DCGAN什么是DCGAN&#xff1f;DCGAN结构TensorFlow版本MINIST手写体生成模型Pytorch版本人脸生成模型 GAN 什么是GAN&#xff1f; GAN是一个教深度学习模型捕捉训练数据的布局来从该布局中生成新数据的框架。最早…

DCGAN论文翻译

UNSUPERVISED REPRESENTATION LEARNING WITH DEEP CONVOLUTIONAL GENERATIVE ADVERSARIAL NETWORKS &#xff08;使用DCGAN的无监督表示学习&#xff09; ABSTRACT&#xff08;摘要&#xff09; In recent years, supervised learning with convolutional networks (CNNs) h…

机器学习中的DCGAN-Tensorflow:用于更稳定的训练

https://www.toutiao.com/a6666031263536644621/ 自从Ian Goodfellow的论文以来&#xff0c;GAN已应用于许多领域&#xff0c;但其不稳定性一直存在问题。GAN必须解决极小极大&#xff08;鞍点&#xff09;问题&#xff0c;因此这个问题是固有的。 马鞍点的滑稽表示 许多研究人…

DCGAN 源码解析

为什么写Blog现在还没找到理由。不过用心看下去你会觉得更有意义。 我们以生成图片为例子: G就是一个生成图片的网络&#xff0c;它接受一个随机的噪声z&#xff0c;然后通过这个噪声生成图片&#xff0c;生成的数据记做G(z)。D是一个判别网络&#xff0c;判别一张图片是不是…

pytorch搭建DCGAN

我们知道gan的过程是对生成分布拟合真实分布的一个过程&#xff0c;理想目标是让判别器无法识别输入数据到底是来源于生成器生成的数据还是真实的数据。 当然这是一个博弈的过程并且相互促进的过程&#xff0c;其真实的过程在于首先判别器会先拟合真实数据的分布&#xff0c;然…

tensorflow实现DCGAN

1、DCGAN的简单总结 【Paper】 &#xff1a; http://arxiv.org/abs/1511.06434 【github】 : https://github.com/Newmu/dcgan_code theano https://github.com/carpedm20/DCGAN-tensorflow tensorflow https://github.com/jacobgil/keras-dcgan keras https://github.c…

DCGAN TUTORIAL

Introduction 本教程将通过一个示例对DCGAN进行介绍。在向其展示许多真实名人的照片之后&#xff0c;我们将训练一个生成对抗网络&#xff08;GAN&#xff09;来产生新名人。此处的大多数代码来自pytorch / examples中的dcgan实现 &#xff0c;并且本文档将对该实现进行详尽的…