栈(stack)、堆(heap)和静态区(static area)的用法区别
* 通常我们定义一个基本数据类型的变量,一个对象的引用,还有就是函数调用的现场保存都使用内存中的栈空间;
* 通过new关键字和构造器创建的对象放在堆空间;
* 程序中的字面量(literal)如直接书写的100、"hello"和常量都是放在静态区中。
* 栈空间操作起来最快但是栈很小,通常大量的对象都是放在堆空间,理论上整个内存没有被其他进程使用的空间甚至硬盘上的虚拟内存都可以被当成堆空间来使用。
Eg: String str = new String("hello");
上面的语句中变量str放在栈上,用new创建出来的字符串对象放在堆上,而"hello"这个字面量放在静态区。
补充:较新版本的Java(从Java 6的某个更新开始)中使用了一项叫"逃逸分析"的技术,可以将一些局部对象放在栈上以提升对象的操作性能。
本题涉及java知识点分析
栈(stack)
* 栈是一个先入后出(FILO:First In Last Out)的有序列表。
* 栈(Stack)是限制线性表中元素的插入和删除只能在同一端进行的一种特殊线性表。
* 允许插入和删除的一端,为变化的一端,称为栈顶(Top),另一端为固定的一端,称为栈底(Bottom)。
* 根据栈的定义可知,最先放入栈中元素在栈底,最后放入的元素在栈顶
* 而删除元素刚好相反,最后放入的元素最先删除,最先放入的元素最后删除
堆(heap)
堆(heap)实为二叉树的一种,分为最小堆和最大堆,具有以下性质:
* 任意节点小于/大于它的所有后裔,最小/大元在堆的根上。
* 堆总是一棵完全二叉树
* 将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。
静态区(static area)
* 方法区又叫静态区,跟堆一样,被所有的线程共享。方法区包含所有的class和static变量。
* 方法区中包含的都是在整个程序中永远唯一的元素,如class,static变量。
* 全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。
希望能对大家有所帮助。