java堆和栈的介绍和区别
Posted sixp512720288
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java堆和栈的介绍和区别相关的知识,希望对你有一定的参考价值。
Java 的堆(heap)是一个运行时数据区,类的(对象从中分配空间。这些对象通过new、newarray、anewarray和multianewarray等指令建立,它们不需要程序代码来显式的释放。堆是由垃圾回收来负责的,堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,因为它是在运行时动态分配内存的,Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是,由于要在运行时动态分配内存,存取速度较慢。
栈(stack) zhan 的优势是,存取速度比堆要快,仅次于寄存器,栈数据可以共享。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。栈中主要存放一些基本类型的变量(,int, short, long, byte, float, double, boolean, char)和对象句柄。
二者的区别:
堆(Heap) | 栈(Stack) | |
存储内容 | 对象实例(无论是成员变量,局部变量,还是类变量,它们指向的对象都存储在堆内存中) | 基本数据类型, 指令代码,常量,对象的引用地址 |
是否共享 | 是 | 否 |
异常错误 | java.lang.OutOfMemoryError | java.lang.StackOverFlowError |
空间大小 | 大 | 小 |
存取速度 | 慢 | 快,仅次于CPU的寄存器 |
注:1、栈内存属于单个线程,每个线程都会有一个栈内存,其存储的变量只能在其所属线程中可见,即栈内存可以理解成线程的私有内存。
而堆内存中的对象对所有线程可见,堆内存中的对象可以被所有线程访问;
2、垃圾回收GC是针对堆Heap的,而栈因为本身是FILO - first in, last out. 先进后出,能够自动释放;
3、栈的内存要远远小于堆内存,可以通过-Xss选项设置栈内存的大小。-Xms选项可以设置堆的开始时的大小,-Xmx选项可以设置堆的最大值。
以上是关于java堆和栈的介绍和区别的主要内容,如果未能解决你的问题,请参考以下文章