> For the complete documentation index, see [llms.txt](https://lvxixiao.gitbook.io/blog/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://lvxixiao.gitbook.io/blog/java/note/thinking-in-java/object/dui-xiang-yu-ji-ben-lei-xing-de-cun-chu-wei-zhi.md).

# 对象与基本类型的存储位置

#### 存储数据的区域(P22)

程序运行时，有五个区域可以存储数据。

**寄存器**

这是最快的存储区，因为它位于不同于其他存储区的地方——处理器内部。但是寄存器的数量极其有限，所以寄存器根据需求进行分配。你不能直接控制，也不能在程序中感觉到寄存器中存在的任何迹象。

**堆栈**

位于通用RAM(随机访问存储器)中，但通过堆栈指针可以从处理器那里获得直接支持。堆栈指针向下移动，则分配新的内存；向上移动，则释放那些内存。这是一种快速有效的分配存储方式，仅次于寄存器。创建程序时，Java系统必须知道存储在堆栈内所有项的确切生命周期，以便上下移动堆栈指针。这一约束限制了程序的灵活性，所以虽然某些Java数据存储于堆栈中——特别是对象引用，但是Java对象并不存储于其中。

**堆**

一种通用的内存池(位于RAM区)，用于存放所有的Java对象。堆不同于堆栈的好处是：编译器不需要知道存储的数据在堆里存活多长时间。因此，在堆里分配存储有很大的灵活性。为这种灵活性必须付出相应的代价，用堆进行存储分配和清理可能比用堆栈进行存储分配需要更多的时间。

**常量存储**

常量值通常直接存放在程序代码内部，这样做是安全的，因为它们永远不会被改变。

**非RAM存储**

如果数据完全存活于程序之外，那么它可以不受程序的任何控制，在程序没有运行时也可以存在。

#### 基本类型(P23)

基本类型是创建一个并非引用的变量，这个变量直接存储“值”，并置于堆栈中，因此更加高效。

#### 数组(P24)

Java确保数组会被初始化，而且不能在它的范围之外被访问。这种范围检查，是以每个数组上少量的内存开销及运行时的下标检查为代价的。但由此换来的是安全性和效率的提高，因此付出的代价是值得的。
