如何准确理解java中的堆与栈?
谢谢
!java运行时数据区有java虚拟机栈和本地方法栈,用于执行方法;堆用于存储对象实例和数组。
java虚拟机堆栈
执行每个java方法时,将创建一个堆栈框架。堆栈帧用于存储局部变量列表、操作数堆栈、动态链表和方法出口等信息。每个java方法从调用开始到执行完成的过程,对应于java虚拟机栈中栈帧从栈入口到栈出口的过程。根据java虚拟机规范,如果线程请求的深度大于虚拟机允许的深度,则抛出stackoverflowererror异常;如果虚拟机可以动态扩展,但扩展过程中内存不足,则抛出outofmemoryerror异常。java虚拟机栈的生命周期遵循线程,是线程的私有生命周期。
localmethodstack
java虚拟机堆栈用于执行java方法,而本地方法堆栈用于执行本地方法。它的功能类似于java虚拟机堆栈,还抛出stackoverflowererror异常和outofmemoryerror异常。本地方法堆栈的生存期也是线程跟随和线程私有的。
heap
堆是java虚拟机中最大的内存空间。基本上,所有对象实例和数组都在这里分配内存空间,这是所有线程共享的。在java虚拟机规范中,堆可以位于物理上不连续的内存空间中,只要它在逻辑上是连续的。当堆中没有足够的内存分配并且此时无法扩展时,将抛出outofmemoryerror异常。
java递归改为循环后为什么不会导致栈内存溢出?
我们知道,在编程中,如果您希望业务被重复执行,通常有两种方法来实现它:递归和循环。在实际的编码过程中,我们不建议使用递归,而是建议使用循环。为什么?
事实上,不仅仅是java,任何编程语言,如果递归写入错误,都可能导致内存溢出
!学习过java的朋友一定或多或少听说过并理解了堆栈内存和堆内存。程序运行时,计算机操作系统会给每个进程分配堆内存和堆栈内存,分配的堆栈内存有一个上限。一旦超过上限,就会导致内存溢出。
为什么递归操作容易导致内存溢出?主要原因如下:
在递归方法中,如果终止递归的条件写得不正确,可能导致无限递归,最终导致内存溢出;
即使递归方法和退出递归条件正常,如果递归深度太深(递归次数太多),也会导致堆栈内存溢出!因为栈入栈出的规则是先入后出(先入后出),如果递归次数过多,就会导致只入不出栈,最后导致栈内存溢出。
将递归写入方式改为循环写入方式的优点是不会在短时间内出现只进不出栈的现象,避免了栈内存溢出的现象。
java工程师要达到什么样的水平才能称为全栈?
整个栈,简单的理解就是前端,和后端,玩得很6,前端页(html.css.javascript文件.ajax…)和后端服务器(精通一种语言,以及主流框架…)
原文标题:java 如何准确理解Java中的堆与栈?,如若转载,请注明出处:https://www.tzjingsheng.com/tougao/50188.html
免责声明:此资讯系转载自合作媒体或互联网其它网站,「豪运号」登载此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述,文章内容仅供参考。