JVM 内存结构底层原理怎么用代码验证

老晨姑娘_1670

老晨姑娘_1670

2026-10-09

997人浏览

原创

jvm内存结构底层原理通过实验与工具验证:堆存对象、元空间存类元数据、虚拟机栈存线程方法调用、程序计数器记录指令地址、本地方法栈调用native代码,各区域溢出表现和监控指标可明确区分。

jvm 内存结构底层原理怎么用代码验证

JVM 内存结构的底层原理不能直接“用代码执行出来”,但可以通过标准 API、JVM 工具和可控的代码行为,间接观测和验证各内存区域(如堆、方法区、虚拟机栈、本地方法栈、程序计数器)的存在、边界、行为特征与溢出表现。关键不是“写一段代码就看到内存结构”,而是设计实验,触发特定区域的分配、增长或溢出,并结合诊断工具交叉印证。

用 MemoryMXBean 验证堆与非堆内存划分

Java 提供 java.lang.management.MemoryUsage 接口,可实时获取堆(Heap)和非堆(Non-heap)内存使用快照。非堆通常包含元空间(Metaspace)、压缩类空间(Compressed Class Space)、Code Cache 等。

示例代码:

  // 触发一次显式 GC 并打印内存使用
import java.lang.management.*;
public class MemoryLayoutDemo {
  public static void main(String[] args) {
    MemoryMXBean bean = ManagementFactory.getMemoryMXBean();
    System.out.println("Heap usage: " + bean.getHeapMemoryUsage());
    System.out.println("Non-heap usage: " + bean.getNonHeapMemoryUsage());
    System.gc(); // 建议,不保证立即执行
    System.out.println("After GC: " + bean.getHeapMemoryUsage());
  }
}

运行时配合 JVM 参数观察变化,例如:
-Xms16m -Xmx16m -XX:MetaspaceSize=8m -XX:MaxMetaspaceSize=16m
再动态加载大量类(如用 ASM 或反射反复定义类),就能看到 Non-heap(尤其是 Metaspace)用量上升,而堆内存无明显增长——这验证了方法区(元空间)独立于堆。

用递归/线程栈触发 StackOverflowError 验证虚拟机栈

每个 Java 线程有独立的虚拟机栈,用于存放局部变量、操作数栈、动态链接、方法出口等。栈深度受限于 -Xss 参数(如默认 1MB)。通过无限递归或创建大量线程,可分别验证单线程栈溢出或线程数上限。

验证单线程栈溢出:

  • 写一个无终止条件的递归方法(如 void f() { f(); })
  • 运行时加参数 -Xss128k,会更快抛出 StackOverflowError
  • 对比 -Xss1m 下的递归深度,可粗略估算每帧开销(约 1–2KB/调用)

验证线程数上限(本地方法栈 + 虚拟机栈共同作用):

Java Maven Secondary Analysis
Java Maven Secondary Analysis

分析ZIP压缩包或GitLab仓库中的Java Maven项目,确定二次开发范围、类数量、模块分布及生产相关指标。

下载
  • 循环 new Thread(() -> { while(true); }).start();
  • 当抛出 java.lang.OutOfMemoryError: unable to create new native thread,说明操作系统级线程资源或 JVM 线程栈总内存耗尽
  • 该错误不发生在堆中,说明其根源在本地方法栈与系统资源,而非 Heap

用动态类生成触发 Metaspace OOM 验证元空间

从 Java 8 开始,类的元数据(类名、字段、方法字节码、常量池等)不再存于永久代(PermGen),而是存于本地内存中的 Metaspace。它默认无上限(受物理内存限制),但可通过 -XX:MaxMetaspaceSize 限制。

验证方式(需引入字节码库如 Byte Buddy 或 ASM):

  • 使用 ByteBuddy 动态生成成百上千个唯一名称的类(避免重名导致复用)
  • 每生成一个类,就用 Class.forName() 加载并保持强引用(防止被卸载)
  • 运行时设置 -XX:MaxMetaspaceSize=32m -XX:+PrintGCDetails
  • 当出现 java.lang.OutOfMemoryError: Metaspace,即证实元空间已满,且该 OOM 不影响堆内存使用率

补充:若启用 -XX:+TraceClassLoading,还能看到每个类加载日志,确认元空间确实在持续增长。

用 jstat / jmap / jhsdb 工具链做跨层交叉验证

代码只能提供“侧面线索”,真正定位内存区域归属,必须结合 JVM 自带诊断工具:

  • jstat -gc <pid></pid>:查看 Eden、Survivor、Old、Metaspace 各区容量与使用量,区分 GC 行为是否仅影响堆
  • jmap -heap <pid></pid>:输出堆配置与使用详情;jmap -clstats <pid></pid> 显示类加载器与元空间占用关系
  • jhsdb jmap --heap --pid <pid></pid>(JDK 9+):更精准的堆直方图与元空间分析
  • 配合 -XX:+UseSerialGC 等固定 GC 算法,排除 GC 策略干扰,使内存分布更可预测

例如:某次 OOM 日志显示 java.lang.OutOfMemoryError: Metaspace,同时 jstat -gc 中 MU(Metaspace Used)接近 MC(Metaspace Capacity),而 OU(Old Used)稳定不变——即可断定问题出在元空间,而非老年代。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

2023.06.15

10097

6

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

2023.07.05

7242

9

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

2023.07.31

6352

8

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.01

1104

3

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.02

908

3

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

1336

5

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

2669

5

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

2023.08.03

19971

3

配置java环境变量
配置java环境变量

配置Java环境变量是为了让操作系统能够识别和使用Java的相关命令和功能。本专题为大家提供配置java环境变量相关文章,帮助大家解决问题。

2023.08.03

1175

8

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习