一、Java有六个地方可以存储数据
1、寄存器(register):
这是最快的存储区,因为它位于处理器内部,相当于操作系统中访问cache一样。
2、栈(stack):
其实就是栈只是一个抽象的词语而已。创建程序时候,JAVA编译器必须知道存储在栈内所有数据的确切大小和生命周期,因为它必须生成相应的代码,就是说像int a=1,double b=2等八种基本数据类型为了追求速度就是存放于栈当中。
3、堆(heap)。
一种通用性的内存池(也存在于RAM中),用于存放所有的JAVA对象。堆不同于栈的好处是:编译器不需要知道要从堆里分配多少存储区 域,也不必知道存储的数据在堆里存活多长时间。因此,在堆里分配存储有很大的灵活性。当你需要创建一个对象的时候,只需要new写一行简单的代码,当执行这行代码时,会自动在堆里进行存储分配。当然,为这种灵活性必须要付出相应的代码。用堆进行存储分配比用栈进行存储存储需要更多的时间。
4、静态存储(static storage)。
常量通常用static修饰。静态存储里存放程序运行时一直存在的数据。
5、常量存储(constant storage)。
常量通常用final修饰。常量值通常直接存放在程序代码内部,这样做是安全的,因为它们永远不会被改变。在嵌入式系统中,常量本身会和其他部分分割离开,所以在这种情况下,可以选择将其放在ROM中。
6、非RAM存储。
如果数据完全存活于程序之外,那么它可以不受程序的任何控制,在程序没有运行时也可以存在。
速度相比就是:寄存器(最快) > 堆栈 > 堆 > 其他
二、堆、栈主要关系
1. 栈
函数中定义的基本类型(int,double,float,char,short,float,boolean,byte)和引用变量都在栈中分配,引用变量就相当于是为数组或对象起的一个名称,比如String str = new String("abc")中str就是一个引用变量。以后就可以在程序中使用栈中的引用变量来访问堆中的数组或对象。栈中数据可以共享
2. 堆
使用new()构造出来的对象都是在堆中存储。无论里面的值是不是一样,都会开辟一个新的空间,即动态的分配地址空间(即并不是编译的时候分配,程序运行到这里的时候再分配,所以数组对象这种就很占内存)。
三、堆栈各自的优缺点
栈的优缺点:
存取速度快,仅次于CPU中的寄存器,并且数据可以共享。缺点是栈中的数据大小必须确定,缺乏灵活性。
堆的优缺点:
优势是可以动态的分配内存大小,生存期也不必事先告诉编译器,Java的垃圾收集器会自动收走这些不再使用的数据。因为要动态分配内存,所以运行时就会消耗更多的时间和空间
————————————————
转自 原文链接:https://blog.csdn.net/qq_38261445/article/details/88776677