Java存储方式,堆、栈区别

Java 存储方式

Java中有6种不同的地方可以存储数据:

寄存器存储

这是最快的存储区,因为它位于不同于其他存储区的地方——处理器内部。但是寄存器的数量极其有限,所以一寄存器由编译器根据需求进行分配。是不由用户控制和感知的。

堆栈(STAck)

堆栈位于RAM中,但通过他的“堆栈指针”可以从处理器那里获得支持。堆栈指针若向下移动,则分配新内存;若向上移动,则释放内存。这种快速有效的分配存储方法, 仅次于寄存器。创建程序的时候,JAVA编译器必须知道存储在堆栈内的所有数据的确切大小和生命周期,因为他必须生成相应的代码,以便上下移动堆栈指针。同时这一特性,也约束了程序

的灵活性,所以虽然某些JAVA数据存储在堆栈中————特别是对象引用,但是JAVA对象不存储在其中。

堆(Heap)

一种通用性的内存池(也是存在于RAM中),用于存放所有的JAVA对象。堆不同于堆栈的好处是:编译器不需要知道要从堆里分配多少存储区域。也不必知道存储的数据在堆里的生命周期,因此在堆里分配存储有很大的灵活性。当你需要创建一个对象对的时候,,只需要new写一行简单的代码,当执行者行代码时,会自动在堆里进行存储分配。当然,为这种林火星必须要付出相应的代码。用堆进行存储分配比用堆栈进行存储需要更多的时间。

静态纯粹

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

常量存储(constant storage)

常量值通常直接存放在代码内部,这样做是安全的,因为他们永远不会被改变。有时,在嵌入式系统中,常量本身回合其他部分分割离开,所以在这种情况下,可以将其他在ROM中

非RAM存储

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

速度比较

寄存器>堆栈>堆>其他

堆栈区别

  1. 堆区
  • 存储的全部都是对象,每个对象都包含一个与之对应的CLASS引用,的信息(class的目的是得到操作指令)
  • jvm只有一个堆区(heap)被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身
  1. 栈区
  • 每一个线程包含一个栈区,栈中只保存基础数据类型的值、对象以及基础数据的引用
  • 每个栈中的数据(基础数据类型和对象引用)多事私有的,其他栈不能访问。
  • 栈分为3个部分:基本类型变量区、执行环境上下文、操作指令区(存放操作指令)
  1. 方法区
  • 又叫静态区,跟堆一样,被所有线程共享,方法区包含所有的class和static变量
  • 方法区中包含的都是在整个程序中永远唯一的元素,如clss,static

栈和堆都是java用来在Ram中存放数据的地方,与C++不同,Java自动管理堆和栈,程序员不能直接地设置堆或栈
栈的优势是,存取速度比堆要快,仅次于直接从寄存器存取,但缺点是,存在栈中的数据大小和生存周期必须是确定的,缺乏灵活性,另外,栈数据不可以共享,堆得优势是可以动态的分配内存大小,生存期也不必事先告诉编译器,Java的垃圾收集器会自动收走这些不在使用的数据。但缺点是,由于要在运行时动态分配内存,存取速度慢。

java中数据类型有两种:

一种是基本类型(primitive types),共有8中,即int、short、long、byte、float、double、boolean、char,注意String并不是基本类型;这种类型的定义是通过如 int a= 19、long b = 255L的形式来定义的,称为自动变量,自动变量存的字面值,不是类的实例,即不是类的引用,这里没有类的存在,如int a = 3;这里a 是一个指向int 类的引用,指向3这个字面值。这些字面值得数据,由于大小可知,生存期可知(这些字面值固定在某个程序块里面,程序块退出后,字面值就消失了)处于追求速度的原因,就存在于栈中。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值