对象在堆中分配,引用在栈中存储;new创建对象时,JVM在堆分配内存,引用变量指向该地址,多个引用可共享同一对象,无引用时对象被GC回收。

在Java中,对象的创建和内存管理由JVM(Java虚拟机)负责。理解对象的引用和内存分配机制,有助于写出更高效、不易出错的代码。
对象的创建与内存分配
当你使用 new 关键字创建一个对象时,例如:
MyClass obj = new MyClass();JVM会在堆(Heap)内存中为这个对象分配一块空间,用来存储对象的实例变量(成员变量)。堆是所有线程共享的运行时内存区域,所有的对象都在这里分配内存。
同时,变量 obj 本身是一个引用,它存储在栈(Stack)中(如果是局部变量),保存的是指向堆中实际对象的地址。
立即学习“Java免费学习笔记(深入)”;
引用的本质
Java中的引用类似于“指针”,但它不能进行指针运算,也不允许直接操作内存地址,提高了安全性。
多个引用可以指向同一个对象:
基于PHP+MYSQL开发,除了网上书店必备的商品管理、配送支付管理、订单管理、会员分组、会员管理、查询统计和多项商品促销功能,还具有完整的文章、图文、下载、单页、广告发布等网站内容管理功能。系统具有静态HTML生成、UTF-8多语言支持、可视化模版引擎等技术特点,支持多频道调用不同模版和任意设置频道首页,适合建立各种规模的网上书店。系统具有以下主要功能模块: 网站参数设置 - 对网站的一些参数进
MyClass obj2 = obj1;
此时,obj1 和 obj2 指向堆中的同一个对象。修改其中一个引用的对象状态,另一个也会看到变化。
当没有任何引用指向某个对象时,该对象就成为垃圾回收的候选对象,JVM会在适当的时机通过垃圾回收器(GC)释放其占用的内存。
基本类型与引用类型的对比
Java中分为基本数据类型(如 int, boolean, double 等)和引用类型(如对象、数组)。
- 基本类型变量直接存储值,通常分配在栈上(局部变量)。
- 引用类型变量存储的是对象的引用(地址),真正的对象在堆上。
例如:
int x = 10; // 值10直接存放在栈中String str = "Hello"; // str 是引用,指向堆中的 String 对象
常见内存区域简述
JVM内存主要分为以下几个部分:
- 堆(Heap):存放所有对象实例,是垃圾回收的主要区域。
- 栈(Stack):每个线程有独立的栈,存放局部变量、方法参数、引用变量等。生命周期与方法调用同步。
- 方法区:存储类信息、常量、静态变量等(在JDK 8以后,这部分被元空间 Metaspace 取代)。
- 本地方法栈 和 程序计数器:服务于 native 方法和线程执行控制。
基本上就这些。理解引用和内存分配的关键是分清“引用在哪”和“对象在哪”。引用通常在栈上,对象总是在堆上。只要搞清楚这一点,很多内存相关的问题就容易理解了。









