【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相等的字符串,在常量池中永远只有一份,在堆中有多份。
阅读全文
0 0
- java中的数据存储
- java中的数据存储
- java中的数据存储
- Java中的数据存储
- 【Java】Java中的数据存储
- java中的数据存储结构
- Java中的double类型数据存储探析
- java中数据在内存中的存储
- java中数据在内存中的存储
- 【JAVA】JAVA 数据存储
- java 存储不同类型数据
- java 数据存储
- Java 数据存储方式
- Java数据存储
- java数据存储
- Java数据存储
- java数据存储
- Java中数据存储
- Graphics2D基本图形合成
- 转换进制
- 启动zookeeper报错already running as process
- oracle连不上的各种现象
- POI导入Excel含.xls和.xlsx
- 【Java】Java中的数据存储
- 《汇编语言》(第三版)王爽第十章实验11个人方法记录
- 指引测试人员追求的最高价值的smbt理论
- 从0-1打造最强性能Scrapy爬虫集群
- 4.3 STM32 时钟系统
- 如何优雅地删除Redis大键
- 特征选择算法在微博业务应用中的演进历程
- spring beans源码解读
- 【备忘】最新oracle11g DBA 开发和应用数据库视频教程