java有六个地方可以存放数据!
1.寄存器(Registers) 2.Stack(栈) 3.Heap(堆)
4.静态存储空间(Static storage) 5.常量存储空间(Constant storage)
6.Non-RAM存储空间
1.寄存器:速度最快的存储场所,但是个数有限并且无法直接操作触碰它。
2.栈:位于一般的RAM中。
存储的都是局部变量(函数中定义的变量,函数上的参数,语句中的变量)
只要数据运算完成所在的区域结束,该数据就会被释放。
另外 对于基本型别(primitive types),如int、double等,产生此类变量不以new分配其空间,而是产生一种所谓的”automatic”变量,来解决效率问题,此类变量直接存放数据值,并置于stack。
由于java编译器有责任产生”将stack指针前后移动”的程序代码,所以它必须能够完全掌握它所编译的程序中”存在stack里头的所有数据的实际大小和存活时间”,如此一来便会限制程序的弹性。由于这个限制,所以我们将对象的reference存储在stack内,但却不能将一般的java对象也置于其上。
3.堆:Heap是一种通用性质的内存存储空间(也存在于RAM中)
用于存储数组和对象,也就是实体。啥是实体呢?
就是用于封装多个数据的。
1:每个实体都有内存首地址值。
2:堆内存中的变量都有默认初始化值。因为数据类型不同,值也不一样。
3:垃圾回收机制。
4.静态存储空间:这里使用“静态”一词,指的是“在固定位置上”(也在RAM中)。静态存储空间存放着“程序执行期间”一直存在的数据。
5.常量存储空间:常量值常常会被直接置于程序代码里头。因为常量是不会改变的,所以也是安全的。有时常量会和外界隔离开来,所以也可以放到唯读内存(ROM)中。
6.Non-RAM存储空间:如果数据完全存活于程序之外,那么即使程序不执行,数据也能够继续存在,脱离程序的控制。streamed objects(串流化对象)和persistent objects(持久化对象)便是主要的两个例子。