实际开发场景中应该有发现java应用程序会消耗比设置-xms和-xmx更多的内存,究其原因其实是因为jvm中除了大家熟知的堆内存外,还有所谓的非堆内存(non-heap memory),详细来看,非堆内存包括方法区和java虚拟机内部做处理或优化所需的内存。
从图上可以看到jvm内存部分,除了堆内存外还有方法区,包括线程栈,常量池,方法和构造函数代码等。方法区在逻辑上是堆的一部分,但在hotspot中是堆外存储的,不同虚拟机可能实现有所不同。
native memory tracking (nmt)
nmt,全称为native memory tracking,是java 8u40版本引入的一项功能,用于跟踪jvm本身在本地内存中的内存使用情况。我们可以使用 nmt 来追踪了解 jvm 的内存使用详情(即上图中的 jvm memory 部分),帮助我们排查内存增长与内存泄漏相关的问题。
native memory tracking 主要是用来通过在 jvm 向系统申请内存的时候进行埋点实现的。
native memory tracking 默认是不开启的,并且无法动态开启(因为这是埋点采集统计的,如果可以动态开启那么没开启的时候的内存分配没有记录无法知晓,所以无法动态开启),目前只能通过在启动 jvm 的时候通过启动参数开启。
nativememorytracking参数使用
回到本文要说的 nativememorytracking参数,这个参数用于开启和配置nmt的。要开启配置和在需要时进行查看,需要配合jcmd的命令来实现。
配置启动nmt参数
通过设置 jvm 启动参数来开启:-xx:nativememorytracking=[off | summary | detail]
关于参数选项的解释如下
off | 不跟踪 jvm 本地内存使用情况。如果不指定 -xx:nativememorytracking 选项则默认为off。 |
summary | 仅跟踪 jvm 子系统(如:java heap、class、code、thread等)的内存使用情况。 |
detail | 除了通过 jvm 子系统跟踪内存使用情况外,还可以通过单独的 callsite、单独的虚拟内存区域及其提交区域来跟踪内存使用情况。 |
使用 jcmd <pid> vm.native_memory 查看
开启之后,我们可以通过 jcmd 命令去查看 native memory tracking 的信息,即
jcmd <pid> vm.native_memory
到此这篇关于jvm参数nativememorytracking的使用的文章就介绍到这了,更多相关jvm nativememorytracking内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论