通常情况下, JVM占用的内存不仅仅是-Xmx, -Xms等指定的大小, 因为JVM也是一个应用, 它需要额外的空间去完成它的工作, 除了堆外, JVM会分配内存的地方包括以下这些:

Metaspace: 元数据区, 存储类, 及方法的元数据信息

Threads: 线程, 线程里的栈还是比较耗内存的, 在64位操作系统上, 默认栈的大小为1MB, 当然可以通过-Xss配置。

因为一般情况下线程的数量是没有限制的, 因此可能会占用极其多的内存。

Code Cache: JVM通过JIT把字节码转换成机器指令, 然后把这些指令放到一个非堆区域Code Cache。

配置参数:

-XX:InitialCodeCacheSize: 初始大小

-XX:ReservedCodeCacheSize: 最大的空间大小

Garbage Collection: JVM的垃圾回收器需要使用到一个空间去完成它们的任务, 一些运行时的数据等等, 这个空间使用的更多的是本地内存(native memory)

符号表

String Pool: JVM复用字面量字符串的地方。

配置参数:

-XX:StringTableSize: 常量池大小

运行时常量池,JVM用来存储编译时的字面量或方法以及属性地址(reference)。

Native Byte Buffers:

开发者可以直接使用本地内存, 如通过JNI的malloc或者NIO的ByteBuffers等。

 

Native Memory Tracking

那么怎么监控JVM使用到的这些内存吗, 答案就是通过NMT(Native Memory Tracking), 但是使用它之前需要设置JVM的启动参数:

-XX:NativeMemoryTracking, 可能的值为off, 关闭,也为默认值, summary, 显示汇总信息, detail, 显示详细信息。

使用方法:

首先通过jps找到对应的Java程序的pid,然后使用如下命令:

jcmd <pid> VM.native_memory

 

我在本地运行jcmd后输出结果为:

11132:

Native Memory Tracking:

Total: reserved=3517807KB, committed=548183KB
- Java Heap (reserved=2045952KB, committed=366080KB)
(mmap: reserved=2045952KB, committed=366080KB) - Class (reserved=1089619KB, committed=46803KB)
(classes #8341)
(malloc=6227KB #11407)
(mmap: reserved=1083392KB, committed=40576KB) - Thread (reserved=29820KB, committed=29820KB)
(thread #30)
(stack: reserved=29696KB, committed=29696KB)
(malloc=89KB #152)
(arena=35KB #59) - Code (reserved=251467KB, committed=10383KB)
(malloc=1867KB #4673)
(mmap: reserved=249600KB, committed=8516KB) - GC (reserved=80655KB, committed=74803KB)
(malloc=5775KB #218)
(mmap: reserved=74880KB, committed=69028KB) - Compiler (reserved=149KB, committed=149KB)
(malloc=18KB #478)
(arena=131KB #3) - Internal (reserved=6719KB, committed=6719KB)
(malloc=6655KB #11664)
(mmap: reserved=64KB, committed=64KB) - Symbol (reserved=11371KB, committed=11371KB)
(malloc=9477KB #85817)
(arena=1894KB #1) - Native Memory Tracking (reserved=1880KB, committed=1880KB)
(malloc=72KB #1130)
(tracking overhead=1807KB) - Arena Chunk (reserved=176KB, committed=176KB)
(malloc=176KB)

11132是进程号pid

然后出现的很多reserved是指总共可用的内存大小, 而commited是指已经使用的内存大小。

 

追踪本地内存的变化

NMT可以让我们看到随时间增长本地内存的变化。

首先需要设置一个对照的内存状态:

jcmd <pid> VM.native_memory baseline

然后过一段时间如果需要查看变化状态即:

jcmd <pid> VM.native_memory detail.diff

NMT通过+和-来显示内存的变化:

Total: reserved=1771487KB +3373KB, committed=491491KB +6873KB
- Java Heap (reserved=307200KB, committed=307200KB)
(mmap: reserved=307200KB, committed=307200KB) - Class (reserved=1084300KB +2103KB, committed=39356KB +2871KB)

Refer: https://www.baeldung.com/native-memory-tracking-in-jvm

JDK本地内存追踪NMT的更多相关文章

  1. 十三、jdk命令之Java内存之本地内存分析神器:NMT 和 pmap

    目录 一.jdk工具之jps(JVM Process Status Tools)命令使用 二.jdk命令之javah命令(C Header and Stub File Generator) 三.jdk ...

  2. 第05篇. Tomcat和JDK的内存配置

    站在人群,我毫不起眼:活在世上,我不玩心眼! 没有那么远大的目标,但是也不要把我当成傻子! --胖先生 放在前面要说的话:JVM内存分配设置的参数有四个 -Xmx Java Heap最大值,默认值为物 ...

  3. Linux Kernel 本地内存损坏漏洞

    漏洞名称: Linux Kernel 本地内存损坏漏洞 CNNVD编号: CNNVD-201310-663 发布时间: 2013-11-05 更新时间: 2013-11-05 危害等级:    漏洞类 ...

  4. 2、MyEclipse和Eclipse调优,MyEclipse配置(tomcat和jdk的内存设置),jar引入相关知识点,将Java项目编程web项目的办法

    1.WindowàPreferenceàGeneralàWorkspaceàText file encoding都改成UTF-8 2.WindowàPreferenceàGeneralàEdito ...

  5. 【转】哪个更快:Java堆还是本地内存

    译文出处: shenzhang   原文出处:原文链接 使用Java的一个好处就是你可以不用亲自来管理内存的分配和释放.当你用new关键字来实例化一个对象时,它所需的内存会自动的在Java堆中分配.堆 ...

  6. Java内存模型(JMM)是什么?JMM 通过控制主内存与每个线程的本地内存之间的交互,来提供内存可见性保证

    Java内存模型就是一种符合内存模型规范的,屏蔽了各种硬件和操作系统的访问差异的,保证了Java程序在各种平台下对内存的访问都能保证效果一致的机制及规范. Java内存模型是根据英文Java Memo ...

  7. jdk outMemory内存溢出

    参数的含义: -vmargs -Xms256M -Xmx768M -Xss256k -XX:PermSize=256M -XX:MaxPermSize=768M -vmargs 说明后面是vm的参数 ...

  8. Tomcat和JDK的内存配置

    1.jvm内存管理机制: 1)堆(Heap)和非堆(Non-heap)内存 按照官方的说法:"Java 虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配.堆是在 Ja ...

  9. git跟踪远程分支,查看本地分支追踪和远程分支的关系

    跟踪远程分支 如果用git push指令时,当前分支没有跟踪远程分支(没有和远程分支建立联系),那么就会git就会报错 There is no tracking information for the ...

随机推荐

  1. Docker部署ngnix静态网站

    Hello World 首先获取ngnix镜像(默认的是最新版. docker pull nginx 先来编写一个最简单的Dockerfile,一个Dockerfile修改该Nginx镜像的首页 Do ...

  2. XCOPY——目录复制命令

    XCOPY——目录复制命令 1.功能:复制指定的目录和目录下的所有文件连同目录结构. 2.类型:外部命令 3.格式:XCOPY [源盘:]〈源路径名〉[目标盘符:][目标路径名][/S][/V][/E ...

  3. vue项目开发期间,配置webpack解决后台接口在不同服务器上的问题 之 二 ( node搭建服务 )

    由于今天上午 后端人员把接口都整合都一个服务器了,所以就没有硬关注 上一篇文章的问题, 晚上回来,用node搭了一个简单服务器,测试了下,是没有问题的.代码如下: 一. 自己初始化项目, 1.pack ...

  4. [PHP] Laravel 5.5 的 BCrypt对密码进行加密及密码验证

    Laravel 5.5 的 BCrypt对密码进行加密及密码验证 一.加密 方法1) $password= Hash::make('密码'); 方法2) /也可直接使用 bcrypt 的 functi ...

  5. 64位下的InlineHook

    目录 x64下手工HOOK的方法 一丶HOOK的几种方法之远跳 1. 远跳 不影响寄存器 + 15字节方法 2.远跳 影响寄存器 + 12字节方法 3.影响寄存器,恢复寄存器 进行跳转. 4. 常用 ...

  6. nginx.conf 配置解析之 http配置

    官方文档 http://nginx.org/en/docs/参考链接: https://segmentfault.com/a/1190000012672431参考链接: https://segment ...

  7. vsftp上传553 Could not create file错误解决

    可以正常连接,可是上传文件是提示553 Could not create file无法创建文件. 权限不足,从根目录开始检查保证每个文件夹都有777的权限,就可以正常上传.

  8. java并发编程(八) CAS & Unsafe & atomic

    参考文档:https://www.cnblogs.com/xrq730/p/4976007.html CAS(Compare and Swap) 一个CAS方法包含三个参数CAS(V,E,N).V表示 ...

  9. mstar 平台I2C 配置

    芯片的pin 脚可以用作不同的功能,总结一句就是外设进行状态和数据交换. 最常用的是作为GPIO,设置为输出模式时,通过高低电平来控制一些外围设置:// 如LED,屏的电源,背光的开关,功放的静音等等 ...

  10. Kibana数据可视化

    Kibana数据可视化 1,3.1使用logstash导入数据的问题 会出现错误提示: [location] is defined as an object in mapping [doc] but ...