目录

裴先生
裴先生
发布于 2021-02-28 / 0 阅读
0
0

Java对象内存分配详解:五大存储区域全解析

原创

简介:在Java日常开发中,我们频繁使用 new 关键字创建对象,但这些对象究竟存放在哪里?内存是如何分配的?本文系统梳理了Java程序运行时数据的五种存储位置及其特点,帮助开发者深入理解JVM内存模型的基础。


1. 寄存器(Registers)

  • 位置:位于CPU处理器内部。
  • 特点
    • 速度最快的存储区域;
    • 空间极其有限,由硬件直接管理;
    • Java无法直接控制或感知寄存器的存在。
  • 对比:C/C++ 可通过 register 关键字向编译器建议将变量放入寄存器(但不保证)。

2. 堆栈(Stack)

  • 位置:位于通用RAM中,由堆栈指针管理。
  • 特点
    • 分配/释放速度仅次于寄存器
    • 内存分配通过指针移动实现:向下移动分配,向上移动释放
    • 生命周期与方法调用绑定,自动清理。
  • 存储内容
    • 基本数据类型(如 int, boolean);
    • 对象的引用(reference,即指向堆中对象的指针);
    • 方法调用的局部变量和执行上下文。
  • 对比:C++ 允许在栈上直接创建对象(如 MyClass obj;),而Java对象只能在堆上创建

3. 堆(Heap)

  • 位置:通用内存池,位于RAM中。
  • 特点
    • 所有通过 new 创建的Java对象都存放于此;
    • 内存分配较堆栈慢,但灵活性高
    • 垃圾回收器(GC) 自动管理生命周期。
  • 使用方式:只需一行代码 new MyClass(),JVM即在堆中分配内存。

4. 常量存储(Constant Storage)

  • 位置
    • 通常内嵌于程序代码段.text 段);
    • 在嵌入式系统中,可能存放在 ROM(只读存储器) 中。
  • 特点
    • 存储永不改变的值;
    • 访问高效,编译期确定。
  • 典型例子
    • 字符串字面量(如 "通话""重地");
    • 编译期常量表达式(如 String s = "Hello World!";);
    • 这些字符串会被放入 字符串常量池(String Pool),实现复用。

5. 非RAM存储(Non-RAM Storage)

  • 特点:数据完全独立于程序运行时内存,即使程序终止也依然存在。
  • 两种主要形式
    • 流对象(Streamed Objects):对象被序列化为字节流,用于网络传输(如RPC、HTTP API);
    • 持久化对象(Persistent Objects):对象被保存到磁盘文件或数据库中,实现长期存储。

原创

版权声明:本博客原创文章,由 裴先生 2021年02月28日 发表。
转载说明:除特殊说明外本站文章皆由 CC BY-NC-SA 4.0 协议发布,转载须注明出处。


评论