通常情况下, 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. NYOJ104-最大和-(前缀和)

    题意:给一个矩阵,每个元素有正有负,求最大矩阵和. 解题: (1)对原矩阵a用前缀和处理,处理变成矩阵sum,sum[i][j]表示从左上角为a[1][1]到右下角a[i][j]的全部元素和. 矩阵必 ...

  2. centos7.2(一)vultr服务器购买和开通端口

    https://vultr.me/52.html 之前我们已经介绍了如何购买 Vultr 以及如何使用支付宝对 Vultr 进行充值,相关教程: VULTR 购买教程 2018 年最新图文版 VULT ...

  3. [Javascript] ES6 Class Constructors and the Super Keyword

    When the ES6 class shipped back in 2015, a number of additional keywords came with it. Two of these ...

  4. Django3 的服务器搭建

    进入python虚拟环境 执行以下 命令 source env/bin/active 激活并切换虚拟环境 安装 pip3 install django 创建django项目 django-admin ...

  5. 验证码破解 | Selenium模拟登陆12306

    12306官网登录的验证码破解比较简单,验证码是常规的点触类型验证码,使用超级鹰识别率比较高. 思路: (1)webdriver打开浏览器: (2)先对整个屏幕截屏,通过标签定位找到验证码图片,并定位 ...

  6. Pandas模块 -- 实操练习

    如果对序列进行数学函数的运算,首选numpy模块: 如果对序列做统计运算,首选序列的“方法”,因为序列的“方法”更加丰富,如计算序列的偏度.峰度等,而Numpy模块是没有这样的函数. 手工构造数据框D ...

  7. pg_flame postgresql EXPLAIN ANALYZE 火焰图工具

    pg_flame 是golang 编写的一个将pg的EXPLAIN ANALYZE 转换为火焰图,使用简单 以下是一个简单的demo 环境准备 docker-compose 文件   version: ...

  8. Spring Could Feign 设计原理

    什么是Feign? Feign 的英文表意为"假装,伪装,变形", 是一个http请求调用的轻量级框架,可以以Java接口注解的方式调用Http请求,而不用像Java中通过封装HT ...

  9. cf1175 D\E

    链接 成功带wxy掉分..全程0输出 D E D 题意 把序列分成连续k段,f(i)表示i这个在第几段 \(\sum\limits_{i=1}^{n}a_i*f(i)\)最大 思路 想象成从k层积木依 ...

  10. python3-django+uwsgi+supervisor+nginx跳坑指南(记录)

    首先运行django项目:在项目目录内: python manage.py runserver 0.0.0.0:8000 外部服务器访问:http://www.xxx.com:8000/ 可以正常运行 ...