java栈深度是什么意思(JAVA中堆栈是什么)
其实java栈深度是什么意思的问题并不复杂,但是又很多的朋友都不太了解JAVA中堆栈是什么,因此呢,今天小编就来为大家分享java栈深度是什么意思的一些知识,希望可以帮助到大家,下面我们一起来看看这个问题的分析吧!
java堆栈问题~~~
堆栈是一种数据结构,特点是堆栈中的数据先进后出,或者说后进先出。你可以想象堆栈是个子弹夹,先压入的子弹放在弹夹下面,后压入的子弹会在弹夹的上面,打枪或者卸子弹的时候先出上面的子弹,下面的子弹才能出来。
堆栈会有一个量来标识栈顶,也就是标识出堆栈里最后放进去的数据在什么位置。堆栈可以进行的操作最基本的是两个:一个进栈(push)一个出栈(pop),也有叫压入弹出的。进栈的时候要判断栈是否已满,已满的堆栈不能进栈,弹夹满了,子弹肯定压不进去了。出栈的时候要判断栈是否为空,弹夹空了要卸子弹肯定是卸不出来的。
JAVA中堆栈是什么
堆栈是一种执行“后进先出”算法的数据结构。
设想有一个直径不大、一端开口一端封闭的竹筒。有若干个写有编号的小球,小球的直径比竹筒的直径略小。现在把不同编号的小球放到竹筒里面,可以发现一种规律:先放进去的小球只能后拿出来,反之,后放进去的小球能够先拿出来。所以“先进后出”就是这种结构的特点。
堆栈就是这样一种数据结构。它是在内存中开辟一个存储区域,数据一个一个顺序地存入(也就是“压入——push”)这个区域之中。有一个地址指针总指向最后一个压入堆栈的数据所在的数据单元,存放这个地址指针的寄存器就叫做堆栈指示器。开始放入数据的单元叫做“栈底”。数据一个一个地存入,这个过程叫做“压栈”。在压栈的过程中,每有一个数据压入堆栈,就放在和前一个单元相连的后面一个单元中,堆栈指示器中的地址自动加1。读取这些数据时,按照堆栈指示器中的地址读取数据,堆栈指示器中的地址数自动减 1。这个过程叫做“弹出pop”。如此就实现了后进先出的原则。
堆栈是计算机中最常用的一种数据结构,比如函数的调用在计算机中是用堆栈实现的。
堆栈可以用数组存储,也可以用以后会介绍的链表存储。
下面是一个堆栈的结构体定义,包括一个栈顶指针,一个数据项数组。栈顶指针最开始指向-1,然后存入数据时,栈顶指针加1,取出数据后,栈顶指针减1。
#define MAX_SIZE 100
typedef int DATA_TYPE;
struct stack
{
DATA_TYPE data[MAX_SIZE];
int top;
};
Java堆栈溢出的机制与原理
Java堆栈溢出的出现很让人痛苦的事情很多时候都无法找到头绪这里作者通过使用jrockit调用程序才最终发现了问题的所在在很多情况下 Java堆栈溢出很有可能是你的代码中用到数组到你的索引超出范围了
java lang OutOfMemoryError: Java heap space
在Java程序运行中可能会报如上的错误通常是在运行过程中内存占用了没有别释放造成的
以前可能没法跟踪可能是很痛苦的事情现在好了我们有一个调试软件可以用了在生产环境下使用的jRockit软件进行调试是Oracle公司出品的
前两天试用了一下真的很不错
前阵子有个程序跑个礼拜左右就会出现Java堆栈溢出始终找不到头绪后来使用jrockit才找到问题的出处
jrockit是可以调试远程程序也可以调试本地程序的
具体调试步骤
(一)
如果是调试本地程序的话启动jrockit然后启动本地需要调试的程序会在左侧工具栏本地目录下创建一个连接为需要调试的程序在上面点击右键就会启动跟踪
如何跟踪呢我的办法就是等在跟踪开始后进行截图然后等程序运行一段时间后查找堆增长比较大的并且一直没有释放的变量
(二)
然后在上面点击右键显示分配跟踪
(三)
然后找到对应的方法然后就去找问题吧看看是不是那个地方有内存一直没有释放啊
然后说点我自己的小经验也许是不对的但是我在我的应用里面确实是有效的
在经常需要调用的地方将变量设成全局的甚至是静态的我的操作是设成全局的了图省事呢呵呵因为我的变量时全局都要调用的而且是频繁调用的
用完的变量一定要记得让它等于null否则执行gc()貌似是不给回收的
基本上jrockit跟踪是很强的都能够找到你的问题所在要仔细观察改完程序后记得再重新跟踪下直到没有内存泄露为止
写完手工
lishixinzhi/Article/program/Java/hx/201311/26094Java栈和本地方法栈方法调用栈,这些都是什么
JAVA内存里面有一般有四个分类,堆,栈(堆栈),静态域,常量池
栈:实际上是一个队列,遵循 FILO的原则(后进先出),里面储存的是函数的参数值,局部变量,对象的引用(对象本身不在这里)等,因此在每调用一个函数时,堆栈都会分配一部分空间给它,函数返回时,被释放
堆:储存静态变量,全局变量和用new创建的东西,栈中的内存是动态内存,其中的内存在不使用时随时可以被回收
静态域:存放对象中static定义的成员
常量池:存放常量
根据以上解释回答你的问题:
JAVA栈存的是函数的参数值,局部变量,对象的引用
方法调用栈?没有这说法吧,方法的调用是存在栈中的
本地方法栈,和JAVA中的栈一个作用,只是这个栈是属于本地的,不属于JAVA虚拟机,但受JAVA虚拟机的控制,因为是JAVA虚拟机简单地动态链接并直接调用指定的本地方法。可以把这看作是虚拟机利用本地方法来动态扩展自己
局部变量和对象引用存在栈中,方法调用的栈帧也是在栈中
以上是我自己查资料+自己的理解,有错望指出
OK,本文到此结束,希望对大家有所帮助。