摘要:从 OpenJDK8 起有了一个很 nice 的虚拟机内部功能: Native Memory Tracking (NMT) 。本文分享自华为云社区《Native Memory Tracking 详解(1):基础介绍》,作者:毕昇小助手 。
0.引言我们经常会好奇,我启动了一个 JVM,他到底会占据多大的内存?他的内存都消耗在哪里?为什么 JVM 使用的内存比我设置的 -Xmx 大这么多?我的内存设置参数是否合理?为什么我的 JVM 内存一直缓慢增长?为什么我的 JVM 会被 OOMKiller 等等,这都涉及到 JAVA 虚拟机对内存的一个使用情况,不如让我们来一探其中究竟 。
1.简介除去大家都熟悉的可以使用 -Xms、-Xmx 等参数设置的堆(Java Heap),JVM 还有所谓的非堆内存(Non-Heap Memory) 。
可以通过一张图来简单看一下 Java 进程所使用的内存情况(简略情况):
文章插图
非堆内存包括方法区和Java虚拟机内部做处理或优化所需的内存 。
- 方法区:在所有线程之间共享,存储每个类的结构,如运行时常量池、字段和方法数据,以及方法和构造函数的代码 。方法区在逻辑上(虚拟机规范)是堆的一部分,但规范并不限定实现方法区的内存位置和编译代码的管理策略,所以不同的 Java 虚拟机可能有不同的实现方式,此处我们仅讨论 HotSpot 。
- 除了方法区域外,Java 虚拟机实现可能需要内存用于内部的处理或优化 。例如,JIT编译器需要内存来存储从Java虚拟机代码转换的本机代码(储存在CodeCache中),以获得高性能 。
2.如何使用2.1 开启 NMT默认情况下,NMT是处于关闭状态的,我们可以通过设置 JVM 启动参数来开启:-XX:NativeMemoryTracking=[off | summary | detail] 。
经验总结扩展阅读
- SpringBoot+Vue3 AgileBoot - 手把手一步一步带你Run起全栈项目
- 带你读AI论文丨ACGAN-动漫头像生成
- 教你认识小儿和妇女病例
- 如何看待焦虑症
- 怎样查QQ好友认识几天
- 一篇文章带你掌握主流服务层框架——SpringMVC
- 一篇文章带你掌握主流基础框架——Spring
- 感悟人生的句子正能量
- 我有一辈子可以认识你是哪一部电影?
- 一代枭雄胡前宽怎么和何辅堂认识的?