[size=medium][b]接触编程有段时间了.一直没深入堆栈问题。这一次一定要深度解析把他一次搞定.[/b][/size]
:shock: :shock:
[b]Java把内存划分成两种:一种是栈内存,一种是堆内存。 [/b]
Stack:翻译为栈或堆栈,指的就是一种后进先出的数据结构。
Heap :堆,堆是一个无序的结构。
Stack有时候翻译成堆栈,是因为heap是stack的组成单元。
[size=xx-large]堆[/size]是一个运行时数据区,对象从中分配空间。这些对象通过new、newarray、anewarray和multianewarray等指令建立,它们不需要程序代码来显式地释放。堆是由垃圾回收来负责的.
[size=xx-large]堆[/size]的[size=medium][b]优点[/b][/size]:可以动态地分配内存大小,生存期也不必事先告诉编译器,因为它是在运行时动态分配内存的,Java的垃圾收 集器会自动收走这些不再使用的数据。
[size=xx-large]堆[/size]的[size=medium][b]缺点[/b][/size]:由于要在运行时动态分配内存,存取速度较慢。
[size=xx-large][b]栈[/b][/size]是用来存放一些原始数据类型的局部变量数据和对象的引用(String、数组、对象等等)但不存放对象内容。存放一些基本类型的变量数据(int,short,long,byte,float,double,boolean,char)和对象引用。
引用在白皮书中直接指出是实际就是一个C的"指针"。
[size=xx-large]栈[/size]的[size=medium][b]优点[/b][/size]:存取速度比堆要快,仅次于寄存器,(不是寄存器)。栈数据可以共享。
[size=xx-large]栈[/size]的[size=medium][b]缺点[/b][/size]:是,存在栈中的数据大小与生存期必须是 确定的,缺乏灵活性。
总结.
栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(字符串常量对象存放在常量池中。)
堆:存放所有new出来的对象。
:shock: :shock:
[b]Java把内存划分成两种:一种是栈内存,一种是堆内存。 [/b]
Stack:翻译为栈或堆栈,指的就是一种后进先出的数据结构。
Heap :堆,堆是一个无序的结构。
Stack有时候翻译成堆栈,是因为heap是stack的组成单元。
[size=xx-large]堆[/size]是一个运行时数据区,对象从中分配空间。这些对象通过new、newarray、anewarray和multianewarray等指令建立,它们不需要程序代码来显式地释放。堆是由垃圾回收来负责的.
[size=xx-large]堆[/size]的[size=medium][b]优点[/b][/size]:可以动态地分配内存大小,生存期也不必事先告诉编译器,因为它是在运行时动态分配内存的,Java的垃圾收 集器会自动收走这些不再使用的数据。
[size=xx-large]堆[/size]的[size=medium][b]缺点[/b][/size]:由于要在运行时动态分配内存,存取速度较慢。
[size=xx-large][b]栈[/b][/size]是用来存放一些原始数据类型的局部变量数据和对象的引用(String、数组、对象等等)但不存放对象内容。存放一些基本类型的变量数据(int,short,long,byte,float,double,boolean,char)和对象引用。
引用在白皮书中直接指出是实际就是一个C的"指针"。
[size=xx-large]栈[/size]的[size=medium][b]优点[/b][/size]:存取速度比堆要快,仅次于寄存器,(不是寄存器)。栈数据可以共享。
[size=xx-large]栈[/size]的[size=medium][b]缺点[/b][/size]:是,存在栈中的数据大小与生存期必须是 确定的,缺乏灵活性。
总结.
栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(字符串常量对象存放在常量池中。)
堆:存放所有new出来的对象。