【Java】Java中的数据存储

来源:互联网 发布:微信公共号平台源码 编辑:程序博客网 时间:2024/05/21 21:10

堆,栈,静态代码区(常量区)

在Java中,六个地方存储数据:

1. 寄存器register:

最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制
  • 最快的存储区(由编译器根据需求分配,无法从程序中控制)
  • 位于处理器内部
  • 数量有限

2. 栈sack:

存放基本类型的变量数据和对象,数组的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(字符串常量对象存放在常量池中)
  • 速度仅次于寄存器 
    通过它的“栈指针”从处理器获得支持; 
    栈指针向下移动,分配新内存;向上,释放内存; 
    这一约束限制了程序的灵活性:创建程序时,JAVA编译器必须知道存储在栈内所有数据的确切大小和生命周期,生成相应代码,以便上下移动栈指针;因此某些JAVA数据存储在栈中,而JAVA对象不存储在其中
  • 位于通用RAM中 
    (RAM,random access memory随机存取存储器),与CPU直接交换数据的内部存储器,也叫主存(内存)。随时读写,速度很快,通常作为临时数据存储媒介)

3. 堆heap

存放所有new出来的对象
  • 位于通用RAM中,用来存放所有的JAVA对象
  • 不同于栈的好处:不需要知道存储数据分配多少区域以及生命周期,有很大的灵活性
  • 需要创建一个对象时,只需new一行代码,执行这行代码,会自动在堆里进行存储分配
  • 为这种灵活性付出相应代码,用堆进行存储分配比用栈进行存储需要更多的时间

4. 静态存储static storage

存放静态成员(static定义的)
  • 静态是指“在固定的位置”
  • 静态存储里存放程序运行时一直存在的数据
  • 可用关键字static来标识一个对象的特定元素是静态的
  • 但JAVA对象本身从来不会存放在静态存储空间里

5. 常量存储constant storage

存放字符串常量和基本类型常量(public static final)
  • 常量值通常直接存放在程序代码内部
  • 有时在嵌入式系统中,常量本身会和其他部分分割离开,所以在这种情况下,可以选择将其放在ROM中 
    (ROM,Read Only Memory,只读内存。一种只能读出事先所存数据的固态半导体存储器,它相当于PC机上的硬盘,用来存储和保存数据。RAM和ROM相比,两者的最大区别是RAM在断电以后保存在上面的数据会自动消失,而ROM就不会。)

6. 非RAM存储

硬盘等永久存储空间
  • 如果数据完全存活于程序之外,那么它可以不受程序的任何控制,在程序没有运行时也可以存在。

整体速度比较:

寄存器 < 栈 < 堆 < 其他
栈和常量池中的对象可以共享,对于堆中的对象不可以共享
栈中的数据大小和生命周期是可以确定的,当没有引用指向数据时,这个数据就会消失。堆中的对象的由垃圾回收器负责回收,因此大小和生命周期不需要确定,具有很大的灵活性。
对于字符串:其对象的引用都是存储在栈中的,如果是编译期已经创建好(直接用双引号定义的)的就存储在常量池中,如果是运行期(new出来的)才能确定的就存储在堆中。对于equals相等的字符串,在常量池中永远只有一份,在堆中有多份。
原创粉丝点击