Java 内存区域划分怎么理解与排查

阿辰吖_2334

阿辰吖_2334

2026-09-02

315人浏览

原创

jvm内存划分为线程私有区(程序计数器、虚拟机栈、本地方法栈)和线程共享区(堆、方法区/元空间、运行时常量池),另含不受规范约束的直接内存;程序计数器不抛oom,栈异常多因递归过深或线程过多,堆oom需分析对象分布,元空间oom常由动态类加载引发,直接内存oom则关联nio资源未释放。

java 内存区域划分怎么理解与排查

Java 内存区域划分是理解 JVM 行为和定位内存问题的底层基础。不是背下几个名词,而是要清楚每个区域“谁在用、存什么、出错时表现为什么”。排查问题时,错误类型(比如 OutOfMemoryError 或 StackOverflowError)往往直接指向具体区域。

线程私有区:程序计数器、虚拟机栈、本地方法栈

这三个区域生命周期与线程一致,线程结束即释放,不涉及跨线程共享。

  • 程序计数器:每个线程独有一块极小空间,只存当前执行的字节码地址;它不会溢出,是 JVM 中唯一不会抛 OutOfMemoryError 的区域。
  • 虚拟机栈:每次方法调用生成一个栈帧,存放局部变量、操作数栈等。递归过深或单次方法局部变量过多,会触发 StackOverflowError;若线程数过多且栈容量设得太大,可能报 OutOfMemoryError: unable to create new native thread。
  • 本地方法栈:作用类似虚拟机栈,但服务于 JNI 调用。排查时可先关注是否大量使用了 native 方法(如某些加密库、图像处理 SDK),异常表现与虚拟机栈接近。

线程共享区:堆、方法区(元空间)、运行时常量池

这些区域被所有线程共用,也是 GC 和内存溢出的主战场。

Java Maven Code Review
Java Maven Code Review

审查Java Maven项目(ZIP压缩包或GitLab仓库URL),检查代码规范、命名、模块边界、可维护性问题以及重复代码。

下载
  • Java 堆:对象实例和数组的唯一归属地。GC 主要在这里工作。出现 java.lang.OutOfMemoryError: Java heap space,说明堆内存耗尽且无法扩展——这时要结合堆转储(heap dump)分析对象分布,常见原因包括缓存未清理、大对象长期持有、集合类误用(如 static Map 不断 put)。
  • 方法区 / 元空间:JDK 8+ 使用元空间(Metaspace),直接分配在本地内存。存储类元信息、常量、静态变量等。报 OutOfMemoryError: Metaspace,多因动态类加载(如热部署、Groovy/SpEL 解析、大量代理类生成)未卸载,或 -XX:MaxMetaspaceSize 设置过小。
  • 运行时常量池:属于方法区的一部分,但具备动态性(如 String.intern())。若频繁调用 intern 且字符串内容不可控,可能撑爆元空间。

容易忽略的非规范区域:直接内存

它不属于 JVM 运行时数据区定义,但实际影响很大。

  • 通过 ByteBuffer.allocateDirect() 或 NIO 文件映射(MappedByteBuffer)分配,绕过堆,直连操作系统内存。
  • 不受 -Xmx 控制,但受物理内存和 -XX:MaxDirectMemorySize 限制。
  • 报 OutOfMemoryError: Direct buffer memory 时,检查是否 NIO 使用后未调用 cleaner 或未显式 free()(尤其在 Netty 等框架中需注意资源释放逻辑)。

排查思路:从异常信息反推区域

看到 OOM 或栈异常,先看错误消息中的关键词:

  • Java heap space → 查堆,用 jstat -gc 观察 GC 频率和回收效果,再用 jmap -dump + MAT 分析对象引用链。
  • Metaspace → 查类加载数量(jstat -class),确认是否有类泄漏;检查是否启用了 CGLIB/ASM 动态代理且未清理。
  • unable to create new native thread → 不一定是堆问题,可能是系统级线程数超限(ulimit -u)或 JVM 栈内存(-Xss)设置过大导致线程创建失败。
  • Direct buffer memory → 检查 NIO 使用模式,确认 ByteBuffer 是否及时释放,或调整 -XX:MaxDirectMemorySize。

Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南

相关文章

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

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

下载

相关标签:

java

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

相关专题

更多
java
java

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

2023.06.15

9477

6

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

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

2023.07.05

6622

9

java自学难吗
java自学难吗

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

2023.07.31

5892

8

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

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

2023.08.01

1044

3

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

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

2023.08.02

868

3

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

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

2023.08.02

1236

5

java有什么用
java有什么用

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

2023.08.02

2489

5

java在线网站
java在线网站

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

2023.08.03

19831

3

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

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

2023.08.03

1115

8

热门下载

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

精品课程

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

共0课时 | 0人学习

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

共0课时 | 0人学习