关于java堆和栈的区别

来源:互联网 发布:软件源代码出售合同 编辑:程序博客网 时间:2024/06/07 23:32

经常有人把java内存区分为堆内存(Heap)和栈内存(Stack),这种分法比较粗糙,java内存区域远比这个复杂。这种划分方式的流行只能说明大多数程序员最关注的、与对象内存分配关系最密切的内存区域就是这两块。其中堆为java堆,栈就是java虚拟机栈,或者说是虚拟机栈中局部变量表部分。

以下一部分讲讲关于Java堆和栈的定义

java虚拟机栈:
局部变量表存放了编译期可知的各种基本数据结构(总共有8个)、对象引用类型(它不同于对象本身,可能是指向对象起始地址的引用指针,也可能是指向一个代表对象的句柄或其他与此对象相关的位置)和returnAddress类型(指向了一条字节码指令的地址)
在java虚拟机规范中,对这个区域规定了2种异常。1.如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError异常。2.如果虚拟机栈可以动态扩展(当前大部分的java虚拟机都可以动态扩展,只不过java虚拟机规范中野允许固定长度的虚拟机栈),如果扩展时无法申请到足够的内存,就会抛出OutOfMemoryError异常

java堆:
对于大多数应用来说,java堆是java虚拟机所管理的内存中最大的一块。java堆是被所有线程共享的一块内存区域。该区域的唯一目的就是存放对象实例。所有的对象实例以及数组都要在堆上分配。
java堆是垃圾收集器管理的主要区域

用实例的方式讲讲区别:(就用==和equal的区别的例子吧!)

==操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相等,只能用==操作符。
如果一个变量指向的数据是对象类型的,那么,这时候涉及了两块内存,对象本身占用一块内存(堆内存),变量也占用一块内存,例如Objet obj = new Object();变量obj是一个内存,new Object()是另一个内存,此时,变量obj所对应的内存中存储的数值就是对象占用的那块内存的首地址。对于指向对象类型的变量,如果要比较两个变量是否指向同一个对象,即要看这两个变量所对应的内存中的数值是否相等,这时候就需要用==操作符进行比较。
equals方法是用于比较两个独立对象的内容是否相同,就好比去比较两个人的长相是否相同,它比较的两个对象是独立的。例如,对于下面的代码:

String a=new String("foo");String b=new String("foo");

两条new语句创建了两个对象,然后用a,b这两个变量分别指向了其中一个对象,这是两个不同的对象,它们的首地址是不同的,即a和b中存储的数值(保存在栈中)是不相同的,所以,表达式a==b将返回false,而这两个对象中的内容是相同的,所以,表达式a.equals(b)将返回true。

0 0