0

0

JVM内存模型简单理解_JVM内存模型通俗化入门解释

星降

星降

发布时间:2026-02-10 15:48:42

|

952人浏览过

|

来源于php中文网

原创

JVM内存模型是调优GC、排查OOM和理解多线程可见性的底层依据;堆存对象并分年轻代(Eden/S0/S1)与老年代,栈存线程私有局部变量和引用,程序计数器记录字节码地址,Metaspace存类元数据。

jvm内存模型简单理解_jvm内存模型通俗化入门解释

JVM内存模型不是“一张图背下来就行”的概念,而是你调优GC、排查OOM、理解多线程可见性问题的底层依据——它直接决定你的对象存在哪、谁能看到、什么时候被回收。

堆(Heap):所有对象的“公共仓库”,也是GC主战场

你用 new 创建的对象、数组、包装类实例(如 Integer)、甚至字符串常量池中通过 new String("abc") 生成的对象,全在堆里。堆是线程共享的,所有线程都能通过引用访问同一块堆内存。

  • 年轻代(Young Gen)占堆默认约1/3,分 EdenS0S1 三块,比例通常是 8:1:1;新对象优先分配在 Eden
  • 一次 Minor GC 后还活着的对象,会从 Eden 进入 S0;下次 GC 再挪到 S1,来回倒腾;
  • 熬过几次 Minor GC(默认15次,由 -XX:MaxTenuringThreshold 控制)或 Survivor 区放不下,就晋升到老年代(Old Gen);
  • 老年代满了触发 Full GC(也叫 Major GC),停顿时间长,是性能瓶颈高发区。

⚠️ 容易踩的坑:ArrayList 扩容、String.substring()(JDK 7u6 之前)、大量缓存未清理,都可能让对象“意外滞留”在老年代,加速 Full GC。

栈(Java Virtual Machine Stack):每个线程独享的“执行快照”

方法一调用,JVM 就给它分配一个栈帧(Stack Frame);方法返回,栈帧弹出销毁。栈里只存三类东西:局部变量(含基本类型值、对象引用地址)、操作数栈(JVM 执行指令用的临时空间)、动态链接与出口信息(用于方法调用跳转)。

PHPEIP
PHPEIP

PhpEIP企业信息化平台主要解决企业各类信息的集成,能把各种应用系统(如内容管理系统,网上商城,论坛系统等)统一到企业信息化平台中,整个系统采用简单易用的模板引擎,可自定义XML标签,系统采用开放式模块开发,符合开发接口的模块可完全嵌入到平台;内容管理模块可自定义内容模型,系统自带普通文章模型和图片集模型,用户可以定义丰富的栏目构建企业门户,全站可生成静态页面,提供良好的搜索引擎优化;会员管理模

下载
  • int x = 42; → 值 42 直接压栈;
  • String s = new String("hi"); → 引用地址存栈,"hi" 对象本身在堆;
  • 成员变量(如 private int count;)属于对象的一部分,随对象一起在堆上分配,不在栈里;
  • 栈大小受限于 -Xss 参数,默认一般 1MB;递归太深或局部变量巨多,会抛 StackOverflowError

程序计数器(PC Register)和方法区(Metaspace):小但关键的“元数据管家”

程序计数器 是唯一不会 OOM 的区域,每个线程私有,只记下一条要执行的字节码指令地址(本地方法则为 undefined)。它是线程切换后能“接着上次断点跑”的基础。

方法区 在 JDK 8+ 叫 Metaspace,存类结构、常量池、静态变量、JIT 编译后的代码。它不再受 -XX:PermSize 限制,而是直接使用本地内存;但若持续加载类(如热部署、OSGi、反射生成大量代理类),仍可能触发 OutOfMemoryError: Metaspace

  • 类的 static final String 字面量进运行时常量池(在 Metaspace);
  • static String s = new String("abc"); 中的 "abc" 对象在堆,引用变量 s 的地址也在 Metaspace 的类静态字段区;
  • -XX:MaxMetaspaceSize 必须设(否则可能吃光系统内存),建议初始值与最大值一致以避免动态扩容开销。

真正卡住人的从来不是“堆有几块”,而是当 OutOfMemoryError: Java heap space 报出来时,你得立刻判断:是缓存没清?是流没关?还是对象图里藏着不该活这么久的引用?——这些判断,全依赖你对堆、栈、Metaspace 各自职责和生命周期的肌肉记忆。

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

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

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

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

更多
string转int
string转int

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

668

2023.08.02

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

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

1541

2023.10.24

counta和count的区别
counta和count的区别

Count函数用于计算指定范围内数字的个数,而CountA函数用于计算指定范围内非空单元格的个数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

198

2023.11.20

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

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

140

2023.12.26

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

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

464

2023.08.03

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

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

213

2023.09.04

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

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

1541

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

635

2023.11.24

包子漫画网页版入口与全集阅读指南_正版免费漫画快速访问方法
包子漫画网页版入口与全集阅读指南_正版免费漫画快速访问方法

本专题汇总了包子漫画官网和网页版入口,提供最新章节抢先看方法、正版免费阅读指南,以及稳定访问方式,帮助用户快速直达包子漫画页面,无广告畅享全集漫画内容。

26

2026.02.10

热门下载

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

相关下载

更多

精品课程

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

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