1、Java的内存分配涉及以下区域:
(1)寄存器(register):用来暂时存放指令、数据和位址。
(2)栈(stack):存放基本类型数据和对象的引用(地址)。
(3)堆(heap):存放new出来的对象、数据。
注:栈、堆两者的对比优缺点在下面整理出来。
(4)静态域:存放对象中用static定义的静态成员。
(5)常量池:存放常量。
(6)非RAM:硬盘等永久存储空间。
注:RAM(Random Access Memory):随机存储器,短时间存储器(分为动态和静态两种),相较于ROM(Read Only Memory)只读存储器,RAM断电即失忆,而ROM则不会。
寄存器(register)与存储器的区别:
一般意义上理解,寄存器是CPU里的存储单元,与CPU离得近,所以CPU在运算时通常都会用寄存器当中转站。存储器是在CPU外部的存储器,分为RAM,ROM。
2、栈(stack)与堆(heap):
栈:当一段代码块定义一个变量时,Java就在栈(stack)中为这个变量分配内存空间,当变量退出作用域后,Java会自动释放掉为该变量所分配的空间。
堆:用来存放new出来的对象和数组,堆通常是一个可以被看做一棵树的数组对象。在堆(heap)中分配的内存,由Java虚拟机(JVM)的自动垃圾回收器来管理。
在堆中产生了一个数组或对象后,还可以在栈中定义一个特殊的变量(引用变量),让其值等于数组或对象在堆内存中的首地址,栈中的这个变量就变成了数组或对象的引用变量。(引用变量,就相当于为数组或对象起了一个名字,以后就可以在程序中用栈的引用变量来访问堆中的数组或对象。)
栈中的变量(引用变量)指向堆内存中的变量,这就是Java中的指针。
3、栈、堆的优缺点:
共同点:栈与堆都是用在RAM中存放数据的地方,java自动管理栈和堆。
栈:
优点:比堆存取速度快,仅次于位于CPU中的寄存器,栈中数据可共享。
缺点:栈中数据的大小与生存期必须是确定的,缺乏灵活性。
堆:
优点:动态分配内存大小。
缺点:存取速度慢。
寄存器、RAM中的栈、堆的存取速度的比较:
寄存器>栈>堆
4、Java中数据类型:
基本数据类型(8种):又分为
数值型(整型:byte[1字节](-128~127)、short[2字节]、int[4字节]、long[8字节];浮点型:float[4字节]、double[8字节])、
字符型char[2字节]、
布尔型boolean[1字节]
注:Java是一种严格的类型语言,不允许在数值型和布尔型之间转换,而C语言中1可以表示true,0可以表示false。
基本数据类型的数据存于栈中,追求速度且可共享。
复合数据类型(包装类数据类型):又分为
类:class
数组
接口:interface
包装类数据存于堆中,运行时用new语句动态创建内存,灵活但费时。
特例:String既可以通过new语句来创建,如:String str=new String("abc");——堆中创建
也可以直接String str="abc"来创建。——栈中创建