大家好,今天小编关注到一个有意思的话题,就是关于java语言栈的问题,于是小编就整理了3个相关介绍Java语言栈的解答,让我们一起看看吧。
如何准确理解JAVA中的堆与栈?
谢邀!
J***a运行时数据区中的栈有J***a虚拟机栈和本地方法栈,都是用于方法的执行;堆用于存放对象实例和数组。
J***a虚拟机栈
每个J***a方法执行的时候都会创建一个栈帧,栈帧用于存储局部变量表、操作数栈、动态链表和方法出口等信息,每个J***a方法从开始调用到执行完成的过程,都对应着一个栈帧在J***a虚拟机栈中入栈到出栈的过程。在J***a虚拟机规范中规定,如果线程请求的深度大于虚拟机所允许的深度,将抛出StackOverflowError异常;如果虚拟机可以动态扩展,但是在扩展时申请不到足够的内存,将会抛出OutOfMemoryError异常。J***a虚拟机栈的生存周期是跟随线程的,是线程私有的。
本地方法栈
J***a虚拟机栈是为执行J***a方法服务的,而本地方法栈是为执行本地方法服务的,它的作用与J***a虚拟机栈相似,同样它也会抛出StackOverflowError异常和OutOfMemoryError异常。本地方法栈的生存周期也是跟随线程的,也是线程私有的。
堆
堆是J***a虚拟机中内存空间最大的一块,基本上所有的对象实例及数组都在这里分配内存空间,它是所有线程共享的区域。在J***a虚拟机规范中,堆可以处于物理上不连续的内存空间,只要逻辑上连续就行。当堆中没有足够内存分配时,并且此时也无法再扩展,将会抛出OutOfMemoryError异常。
一种是栈内存,一种是堆内存。堆是用来存放对象的,栈是用来运行程序的。
堆需要通过new等方式来创建;栈内存的主要作用是存放基本数据类型和引用变量。栈的内存管理是通过栈的"后进先出"模式来实现的。
栈作为一种数据结构,是一种只能在一端进行开始插入和删除操作的特殊的线性表。它按照后进先出的原则存储数据,先进入的数据被压入栈底,最后进入的数据在栈顶,需要读取数据的时候从栈顶开始弹出数据(最后一个进入的数据被第一个读出来)。
在J***a里堆内存和栈内存有什么区别?
这个来自于古老的C语言概念,凡是在函数中用基本数据类型(string除外)申请的局部变量,也就是函数退出则这些变量就消亡的变量,包括函数自己的参数定义,都用栈内存的方式构造内存,这样做的目的是进入该函数、变量值进栈,函数退出自动退栈,这样就自动完成了内存申请和回收,这些栈空间的变量只能被该函数自己引用,其他函数不能引用。
而C语言的全局变量、J***A的对象,也就是说如C语言用malloc()函数,C++、J***A等用new构造的对象,都在堆方式组织的内存中,这样的目的是让很多函数都能引用到这些存储空间的值或者对象。存储在堆空间的对象和数据,需要编程者按需要释放,如C语言用free(),C++则要析构函数,J***a就有自动回收机制。
随手写的,有错勿喷。
python堆内存和栈内存的区别?
各司其职
最主要的区别就是栈内存用来存储局部变量和方法调用。
而堆内存用来存储J***a中的对象。无论是成员变量,局部变量,还是类变量,它们指向的对象都存储在堆内存中。
栈内存归属于单个线程,每个线程都会有一个栈内存,其存储的变量只能在其所属线程中可见,即栈内存可以理解成线程的私有内存。
而堆内存中的对象对所有线程可见。堆内存中的对象可以被所有线程访问。
如果栈内存没有可用的空间存储方法调用和局部变量,JVM会抛出j***a.lang.StackOverFlowError。
而如果是堆内存没有可用的空间存储生成的对象,JVM会抛出j***a.lang.OutOfMemoryError。
栈的内存要远远小于堆内存,如果你使用递归的话,那么你的栈很快就会充满。如果递归没有及时跳出,很可能发生StackOverFlowError问题。
你可以通过-Xss选项设置栈内存的大小。-Xms选项可以设置堆的开始时的大小,-Xmx选项可以设置堆的最大值。
这就是J***a中堆和栈的区别。理解好这个问题的话,可以对你解决开发中的问题,分析堆内存和栈内存使用,甚至性能调优都有帮助。
具体可以访问我的翻译文章
J***a中的堆和栈的区别
到此,以上就是小编对于j***a语言栈的问题就介绍到这了,希望介绍关于j***a语言栈的3点解答对大家有用。