Java 8 种类型:内存分配机制探讨

云辰大大_4390

云辰大大_4390

2026-06-21

287人浏览

原创

jvm在java 8中划分为5大运行时数据区:方法区(元空间)、堆、虚拟机栈、本地方法栈、程序计数器,其中堆与元空间线程共享,其余三者线程私有;另常单列直接内存和运行时常量池(属元空间)用于实践调优。

java 8 种类型:内存分配机制探讨

Java 8 中并不存在“8种类型”的内存分配机制。这个说法容易引起误解——实际指的是 JVM 运行时内存被划分为 8 个逻辑区域或关键组成部分,但严格来说,标准 JVM(HotSpot)在 Java 8 中定义的运行时数据区是 5 大主区域,部分资料因细分方式不同(如将方法区进一步拆为元空间+运行时常量池,或把线程私有区域逐一分开)而列出 7 或 8 项。下面按主流、准确、实用的角度梳理清楚。

Java 8 JVM 内存区域划分(核心5大区 + 2个常被单列的延伸区)

Java 8 的 HotSpot 虚拟机将内存划分为以下主要区域,每个区域职责明确、生命周期和线程可见性不同:

  • 程序计数器(PC Register):线程私有,极小内存,记录当前线程执行的字节码指令地址;唯一不会发生 OutOfMemoryError 的区域。
  • Java 虚拟机栈(Java Virtual Machine Stack):线程私有,每个方法调用对应一个栈帧,存储局部变量、操作数栈、动态链接、方法出口等;栈深度超限抛 StackOverflowError,栈扩展失败抛 OutOfMemoryError。
  • 本地方法栈(Native Method Stack):线程私有,为 JNI 调用的 native 方法服务,行为类似虚拟机栈,但语言和实现依赖具体虚拟机。
  • 堆(Heap):线程共享,JVM 最大一块内存,所有对象实例和数组都在此分配;是垃圾收集器管理的核心区域;可细分为新生代(Eden、S0、S1)和老年代。
  • 元空间(Metaspace):线程共享,Java 8 替代了 Java 7 的永久代(PermGen),用于存放类的元数据(如类结构、字段/方法信息、常量池引用等);位于本地内存(物理内存),不受 -Xmx 限制,由 -XX:MaxMetaspaceSize 控制上限。

常被单独强调的两个关联区域(非独立“第6/7区”,但实践重要)

虽然不属 JVM 规范定义的“运行时数据区”,但在排查和调优中高频出现:

Java Maven Code Review
Java Maven Code Review

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

下载
  • 直接内存(Direct Memory):通过 java.nio.ByteBuffer.allocateDirect() 分配,不属于堆,但受 -XX:MaxDirectMemorySize 限制;频繁使用 NIO 时可能引发 OOM,错误堆栈常含 “OutOfMemoryError: Direct buffer memory”。
  • 运行时常量池(Runtime Constant Pool):是元空间的一部分(不是独立区域),用于存放编译期生成的各种字面量与符号引用;字符串常量池(String Table)在 Java 7 后已从永久代移入堆,Java 8 中位于堆的年轻代或老年代(取决于 GC 策略和字符串驻留时机)。

对象创建时的内存分配关键路径

当你写 new Math(),JVM 实际走的是多步协同流程:

  • 先检查 Math 类是否已加载、链接、初始化(类加载检查);未完成则触发类加载子系统。
  • 确认类信息后,在堆中为对象分配内存(采用指针碰撞或空闲列表策略,取决于 GC 器和堆规整度)。
  • 并发场景下通过 CAS 或 TLAB(Thread Local Allocation Buffer,线程本地分配缓冲)避免锁竞争,提升分配效率。
  • 内存分配后,JVM 初始化对象头(Mark Word、Klass Pointer)、零值填充,并执行构造方法()完成用户逻辑赋值。

为什么没有“8种分配机制”?重点看本质区别

所谓“8种”可能是混淆了以下几类概念:

  • 内存区域数量(5 主区 + 2 衍生区 = 7)
  • 变量类型归属(局部变量→栈、实例变量→堆、静态变量→元空间、字符串常量→堆)
  • GC 分代模型(新生代 Eden/Survivor、老年代、元空间本身不回收类数据只扩容收缩)
  • 分配策略(TLAB / 非 TLAB、指针碰撞 / 空闲列表)

真正影响开发和调优的,是搞清什么数据放哪、谁负责回收、谁可能 OOM、怎么查泄漏。比如:静态工具类里缓存大量对象 → 堆溢出;动态生成大量类(如某些 ORM 或热加载框架)→ 元空间溢出;NIO 文件传输未关闭 buffer → 直接内存耗尽。

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

9957

6

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

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

2023.07.05

7082

9

java自学难吗
java自学难吗

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

2023.07.31

6252

8

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

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

2023.08.01

1084

3

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

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

2023.08.02

888

3

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

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

2023.08.02

1296

5

java有什么用
java有什么用

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

2023.08.02

2609

5

java在线网站
java在线网站

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

2023.08.03

19931

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人学习