堆栈相信小伙伴们都了解过,那么你们知道它们两者有什么区别吗?虽然它们较像,但区别也是不小的,下面就一起了解下。
堆,是java中JVM的内存数据区.,它会用来保存对象的实例,在创建对象时,java会在堆中分配一定内存来保存对象实例, 实际上,它是在保存对象实例的属性值、属性的类型和对象本身的类型标记等,它并不会保存对象的方法。
栈,是JVM的内存指令区:,用来保存Java基本数据类型及Java指令代码和常量。 栈的内存管理不会存在内存回收问题,但堆会,因为堆是随机分配内容的。
Java中的JVM是基于堆栈的虚拟机,在创建每个新线程时都会分配一个堆栈.就是说,对Java程序而言,它的运行就只是通过一些堆栈操作来完成的。
堆栈会以帧为单位来保存线程的状态,JVM对堆栈只有两种操作:以帧为单位的压栈和出栈操作。
众所周知,一个线程正在执行的方法我们都称之为此线程的当前方法,我们可能不知道,当前方法使用的帧称为当前帧。当线程激活一个Java方法,JVM就会在线程的Java堆栈里新压入一个帧。这个帧自然成为了当前帧,在此方法执行期间,这个帧将用来保存参数,局部变量,中间计算过程和其他数据,这个帧在这里和编译原理中的活动纪录的概念是差不多的.
我们从Java的这种分配机制来看,堆栈其实还可以这样理解:
堆和栈,它们是操作系统在建立各个进程时或线程(时专门为这个线程建立的存储区域,这个区域具有先进后出的特性。每个Java应用都对应着唯一一个JVM实例,而每一个实例又对应唯一一个堆。应用程序在运行中所创建的所有类实例或数组都放在这个堆中,并由应用所有的线程共享.跟C/C++不同,Java中分配堆内存是自动初始化的。
在Java中,全部对象的存储空间都是在堆中分配的,但对象的引用却是在堆栈中分配,就是说,java在建立一个对象时会从两个地方都分配内存,但在堆中分配的内存实际上就是建立这个对象而已,而在堆栈中分配的内存只是一个指向这个堆对象的引用。
堆与栈的区别总结:
1、栈内存一般会用来存储局部变量和方法调用,但堆内存是用来存储Java对象的。不管是成员变量或局部变量还是类变量,它们所指向的对象都会存储在堆内存中。
2、栈内存是线程私有的,而堆内存是线程共有的。
3,、两者异常错误不同,但如果栈内存或者堆内存不足都会抛出异常。
栈空间不足:java.lang.StackOverFlowError。
堆空间不足:java.lang.OutOfMemoryError。
以上就是本篇文章所有内容,更多详细java入门知识欢迎关注我们了解具体。
推荐阅读: