存储区域(6块区域):
1)寄存器。寄存器位于处理器的内部,是保存操作最快的地方。然后,寄存器的数量有限,因此,我们无法通过程序控制变量存储在寄存器中,只能是通过编译器自己分配。
2)堆栈。其实也就是我们平时所说的栈,存储在RAM中,读写速度排行第二,特别快,通过上下移动来分配和回收内存,因此,它分配内存的时候需要知道具体的长度。所以,基本数据类型和句柄(类似C指针)会存储在这一块区域。
3)堆(heap)。用来存储对象的地方,比较常规用途的RAM中的内存池,优点是大小不固定,时间不固定,可以灵活分配,但是速度不如栈,当我们创建了对象以后,对象的实体就会存储在堆中。
4)静态区域。在RAM中固定的位置,只要程序开始运行,它就会常驻在内存中,随时可以调用。我们平时用关键字static声明的一些变量就是存储在这一块区域当中。
5)常数区域。存储在只读存储器(ROM),用来存储一些常量,也是在RAM中。
6)非RAM存储。那就是存储在硬盘当中,这样做的好处是,数据会独立出来,即使没有运行,对象也存在。最典型的就是对象序列化,将对象变成字节流。对象序列化以后,会储存在常数区域,不手动去改变它,重新启动程序时,会自动把它恢复到普通的RAM当中。
数组:
在C和C++中,数组有一个致命的问题,那就是数组是内存块,因此,不允许访问自己内存块以外的数组,不允许再初始化之前访问它,如果这样做了,会导致意想不到的问题。
但是,在JAVA当中,由JVM自动检查,避免了这个问题。缺点是耗了点时间,优点是更安全和更有效率。