1)寄存器:
这是存取数据最快的地方,因为它位于处理器内部。但是寄存器的数量极其有限,你不能对其直接控制。
2)堆栈:
位于通用RAM(随机访问存储器)中,通过堆栈指针的移动来实现存取数据。堆栈指针向下移动,则分配新的内存;堆栈指针向上移动,则释放内存。堆栈的优势是,存取速度比堆要快,仅次于直接位于CPU中的寄存器。但缺点是,存在堆栈中的数据大小与生存期必须是确定的,缺乏灵活性。
Java的基本数据类型共有8种,即int, short, long, byte, float, double, boolean, char(注意,string类型不是基本类型)。基本类型的定义是通过诸如int a = 3; long b = 255L;的形式来定义的,称为自动变量。出于追求速度的原因,它们存在于堆栈中。
另外,堆栈有一个很重要的特殊性,就是存在于堆栈中的数据可以共享。假设我们同时定义:
int a = 3;
int b=3;
编译器先处理int a = 3;首先它会在堆栈中创建一个变量为a的引用(假使称基本类型的变量名也叫引用),然后查找有没有字面值为3的地址,没找到,就开辟一个存放3这个字面值的地址,然后将a指向3的地址。接着处理int b = 3;在创建完b这个引用变量后,由于在栈中已经有3这个字面值,便将b直接指向3的地址。这样,就出现了a与b同时均指向3的情况。定义完a与b的值后,再令a = 4;那么,b不会等于4,还是等于3。因为在编译器内部,遇到a = 4;时,它就会重新搜索堆栈中是否有4的字面值,如果没有,重新开辟地址存放4的值;如果已经有了,则直接将a指向这个地址,因此a值的改变不会影响到b的值,这就是数据共享。
3)堆:
一个通用的内存池(也位于RAM中),用来存放所有的java对象,通过new关键字实现在堆中分配内存。堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是,由于要在运行时动态分配内存,存取速度较慢。
4)静态存储:
这里的“静态”是指“在固定的位置”(尽管也在 RAM 里)。静态存储里存放程序运行时一直存在的数据。你可用关键字 Static 来标识一个对象的特定元素是静态的,但 Java 对象本身从来不会存放在静态存储空间里。
5)常量存储:
常量值通常直接存放在程序代码内部,这样做是安全的,因为它们永远不会被改变。有时,在嵌入式系统中,常量本身会和其它部分隔离开,所以在这种情况下,可以选择将其存放在 ROM(read-only memory,只读存储器)中。
6)非RAM存储:
如果数据完全存活于程序之外,那么它可以不受程序的任何控制,在程序没有运行时也可以存在。其中两个基本的例子是“流对象(streamed object)”和“持久化对(persistent object)”。在“流对象”中,对象转化成字节流,通常被发送给另一台机器。在“持久化对象”中,对象被存放于磁盘上,因此,即使程序终止,它们仍可以保持自己的状态。这种存储方式的技巧在于:把对象转化成可以存放在其它媒介上的事物,在需要时,可恢复成常规的、基于 RAM 的对象。