详解对象在JVM堆内存分配与引用变量栈存储关系

落枫姑娘_9454

落枫姑娘_9454

2026-03-20

632人浏览

原创

对象实例一定分配在堆内存中,引用变量根据作用域存于栈、堆或方法区,二者通过地址关联;堆存对象数据并由gc管理,栈存局部引用变量的地址值。

详解对象在jvm堆内存分配与引用变量栈存储关系

对象在JVM中创建时,实例本身一定分配在堆内存中,而引用变量(即“指向对象的变量”)则存储在栈上(或方法区、寄存器等,取决于其作用域和生命周期),二者通过内存地址关联——引用变量保存的是堆中对象的起始地址。

堆内存:对象实例的唯一归属地

JVM规范明确规定,所有通过 new、反射、克隆、反序列化等方式创建的对象实例,其数据(包括成员变量值、数组元素、对象头等)都必须分配在堆内存中。堆是线程共享区域,由垃圾收集器统一管理。

  • 即使对象很小(如只含一个int字段),也分配在堆,不会“栈上分配”(除非JIT编译器做了逃逸分析优化,但这是透明的底层行为,对Java程序员不可见)
  • 数组也是对象,同样在堆中分配;String字面量对应的字符串实例在堆中(JDK 7+后字符串常量池已移至堆)
  • 对象创建后,堆中会为其划分连续内存空间,并初始化默认值(0、null、false等)

栈内存:引用变量的典型存放位置

局部变量(包括基本类型变量和引用类型变量)默认存储在当前线程的Java虚拟机栈中。这里的“引用变量”不是对象本身,而是4字节(32位JVM)或8字节(64位JVM,开启指针压缩时仍为4字节)的地址值。

  • 例如 String s = new String("abc"); 中,变量 s 存在栈帧里,它存的只是一个地址,指向堆中那个String对象
  • 多个引用变量可指向同一对象(如 String t = s;),此时栈上有两个变量,堆中只有一个对象
  • 当方法结束,栈帧弹出,局部引用变量消失;若无其他引用指向该对象,它就可能被GC回收

其他存储位置:引用变量不一定都在栈上

引用变量的存储位置取决于其声明位置和生命周期:

  • 成员变量(实例变量):随所属对象一起存在堆中——即“引用变量本身”是对象数据的一部分,也放在堆里
  • 静态变量(类变量):引用存放在方法区(JDK 8+为元空间)的类元信息结构中
  • 参数传递:方法参数是局部变量,形参引用也压入栈帧;但传的是引用的副本,不影响原引用变量的存储位置

关键理解:赋值、传参、==比较的本质

所有操作围绕“引用变量存地址”这一事实展开:

  • 赋值(s = t;):把t中存的地址复制给s,两个变量指向同一对象
  • 方法传参:传递的是引用变量的值(即地址副本),因此可在方法内修改对象状态,但无法让外部引用指向新对象(除非用包装、返回、或修改成员变量间接影响)
  • == 比较:比较的是两个引用变量中存储的地址是否相同,而非对象内容

理解堆与栈的分工,是掌握Java内存模型、排查内存泄漏、读懂GC日志和分析对象生命周期的基础。对象生在堆,引用活在栈(或堆/方法区),靠地址相连,不复杂但容易忽略细节。

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

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

下载

相关标签:

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

相关专题

更多
string转int
string转int

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

2023.08.02

5359

3

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

2023.09.22

529

3

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

2024.03.01

1658

6

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

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

2023.10.24

5824

49

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

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

2023.12.26

863

5

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

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

2023.08.03

1578

5

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

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

2023.09.04

2304

5

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

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

2023.10.24

5824

49

字符串介绍
字符串介绍

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

2023.11.24

4949

6

热门下载

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

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.6万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133.3万人学习