0

0

JVM内存模型_Java虚拟机内存模型核心概念解析

煙雲

煙雲

发布时间:2026-01-12 17:56:43

|

739人浏览过

|

来源于php中文网

原创

jvm内存模型指运行时数据区的物理划分与生命周期管理,含堆(线程共享、存对象实例、gc管理)、java栈(线程私有、存局部变量和引用)、方法区(jdk8+为元空间、存类信息)、直接内存(堆外、nio使用)。

jvm内存模型_java虚拟机内存模型核心概念解析

Java虚拟机内存模型(JVM Memory Model)不是指硬件层面的内存模型(如x86或JSR-133定义的Java内存模型JMM),而是描述JVM运行时数据区的**物理划分与生命周期管理机制**。混淆这两者是绝大多数人踩坑的起点。

堆(Heap)是唯一被所有线程共享的运行时内存区域

堆用于存放对象实例和数组,由垃圾收集器(GC)统一管理。它不存储局部变量、方法参数或字面量——这些在或方法区中。

  • OutOfMemoryError: Java heap space 表示堆已满且无法扩展或回收,常见于缓存未设上限、大对象集合长期持有引用
  • 堆大小通过 -Xms(初始)和 -Xmx(最大)控制;二者设为相同值可避免GC时动态扩容带来的停顿抖动
  • G1、ZGC等现代收集器虽支持分代逻辑,但堆本身仍是连续逻辑空间,new Object() 总是在堆上分配(逃逸分析优化除外)

Java栈(Java Virtual Machine Stack)按线程隔离,每个方法调用对应一个栈帧

栈帧包含局部变量表、操作数栈、动态链接、方法出口等。局部变量表索引从0开始,this 引用(非静态方法)总在位置0,接着是方法参数,再是方法内声明的变量。

  • StackOverflowError 通常源于无限递归或过深的方法调用链,而非栈内存不足;可通过 -Xss 调整单个线程栈大小,但治标不治本
  • 基本类型(intboolean 等)和对象引用存于栈帧中,但对象本身仍在堆上
  • 栈内存不参与GC,方法退出即自动释放对应栈帧,无引用计数或标记过程

方法区(Method Area)在JDK 8+中由元空间(Metaspace)实现

方法区存储类信息、常量池、静态变量、JIT编译后的代码。JDK 7及以前用永久代(PermGen),JDK 8起改用本地内存的元空间,不再受 -XX:MaxPermSize 限制。

SumiNote
SumiNote

一款服务留学生的AI学习神器

下载

立即学习Java免费学习笔记(深入)”;

  • java.lang.OutOfMemoryError: Metaspace 多见于频繁生成类(如大量使用CGLIB代理、热部署框架未清理旧类加载器)
  • 元空间默认无上限,但可通过 -XX:MaxMetaspaceSize 限制;-XX:MetaspaceSize 是触发首次GC的阈值,非初始分配大小
  • 字符串常量池在JDK 7后从永久代移到堆中,因此 String.intern() 不再导致永久代溢出,但可能加剧堆压力

直接内存(Direct Memory)不受JVM堆参数控制,却受系统资源制约

通过 ByteBuffer.allocateDirect() 分配的内存位于JVM堆外,由操作系统管理,常用于NIO高性能读写。它的生命周期不依赖GC,而是靠 Cleaner 或显式调用 Buffer.clear() / System.gc()(不推荐)间接释放。

  • OutOfMemoryError: Direct buffer memory 表示直接内存超限,默认上限为64MB(可通过 -XX:MaxDirectMemorySize 修改)
  • NIO通道(FileChannelSocketChannel)在使用直接缓冲区时性能更高,但泄漏风险也更高——忘记释放或未正确关闭通道会导致内存持续增长
  • JVM不会主动监控直接内存使用量,jstat -gc 不显示其占用,需结合 jcmd <pid> VM.native_memory summary</pid> 查看

真正难调试的不是“哪个区满了”,而是跨区域引用导致的隐性泄漏:比如静态集合持有了本该随线程结束而销毁的栈中对象引用,或者直接内存缓冲区被某个未关闭的通道长期强引用。这类问题往往要结合 jmap -histo、堆转储分析和 native memory tracking 才能定位。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

990

2023.08.02

java中boolean的用法
java中boolean的用法

在Java中,boolean是一种基本数据类型,它只有两个可能的值:true和false。boolean类型经常用于条件测试,比如进行比较或者检查某个条件是否满足。想了解更多java中boolean的相关内容,可以阅读本专题下面的文章。

366

2023.11.13

java boolean类型
java boolean类型

本专题整合了java中boolean类型相关教程,阅读专题下面的文章了解更多详细内容。

42

2025.11.30

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1564

2023.10.24

字符串常量的表示方法
字符串常量的表示方法

字符串常量的表示方法:1、使用引号;2、转义字符;3、多行字符串;4、原始字符串;5、字符串连接;6、字符串字面量和对象;7、编码问题。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

143

2023.12.26

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

739

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

220

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1564

2023.10.24

Kotlin Android模块化架构与组件化开发实践
Kotlin Android模块化架构与组件化开发实践

本专题围绕 Kotlin 在 Android 应用开发中的架构实践展开,重点讲解模块化设计与组件化开发的实现思路。内容包括项目模块拆分策略、公共组件封装、依赖管理优化、路由通信机制以及大型项目的工程化管理方法。通过真实项目案例分析,帮助开发者构建结构清晰、易扩展且维护成本低的 Android 应用架构体系,提升团队协作效率与项目迭代速度。

24

2026.03.09

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 4.3万人学习

C# 教程
C# 教程

共94课时 | 11万人学习

Java 教程
Java 教程

共578课时 | 79.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号