栈、堆、方法区
栈、堆
栈(先进后出)
栈(stack)又名堆栈,它是一种运算受限的线性表。只能在栈顶端进行插入和删除操作的线性表。
堆栈指针若向下移动,则分配新的内存;若向上移动,则释放那些内存。这是一种快速有效的分配存储方法,仅次于寄存器。创建程序时候,JAVA编译器必须知道存储在堆栈内所有数据的确切大小和生命周期,因为它必须生成相应的代码,以便上下移动堆栈指针。这一约束限制了程序的灵活性。
堆(Heap)
堆就是用数组实现的二叉树,所以它没有使用父指针或者子指针。堆根据“堆属性”来排序,“堆属性”决定了树中节点的位置。
栈、堆、方法区的区别
- 栈
通常我们定义一个基本数据类型的变量,一个对象的引用,还有就是函数调用的现场保存都使用JVM中的栈空间。
- 堆
通过new关键字和构造器创建的对象则放在堆空间,堆是垃圾收集器管理的主要区域。
- 方法区
方法区用于存储已经被JVM加载的类信息、常量、静态变量、JIT(Just-In-Time)即时编译器编译后的代码等数据;
程序中的字面量(literal)如直接书写的100、"hello"和常量都是放在常量池中;
常量池是方法区的一部分。
String str = new String("hello");
变量 str 存放在栈中;
new String()存放在堆中;
hello 存放在静态区中;
就速度来说:寄存器 < 堆栈 < 堆 < 其他