什么是堆栈溢出的堆栈区域呢?

堆栈既可以向下增长(向内存低地址)也可以向上增长,这依赖于具体的实现

Java堆栈溢出的机制与原理是什么?

Java堆栈溢出的出现,很让人痛苦的事情,很多时候都无法找到头绪。这里作者通过使用jrockit调用程序才最终发现了问题的所在。在很多情况下,Java堆栈溢出,很有可能是你的代码中用到数组,到你的索引超出范围了。

java。lang。OutOfMemoryError: Java heap space

在Java程序运行中可能会报如上的错误,通常是在运行过程中内存占用了没有别释放造成的。

java中的堆栈问题?

其实这些基础的东西网上有不少, 你可以多去csdn,那里可以学到不少好东西 ,我就直接给你粘贴过来了

java中堆栈(stack)和堆(heap)

一、堆栈(stack)和堆(heap)?

(1)内存分配的策略

按照编译原理的观点,程序运行时的内存分配有三种策略,分别是静态的,栈式的,和堆式的.

静态存储分配是指在编译时就能确定每个数据目标在运行时刻的存储空间需求,因而在编译时就可以给他们分配固定的内存空间.这种分配策略要求程序代码中不允许有可变数据结构(比如可变数组)的存在,也不允许有嵌套或者递归的结构出现,因为它们都会导致编译程序无法计算准确的存储空间需求.

栈式存储分配也可称为动态存储分配,是由一个类似于堆栈的运行栈来实现的.和静态存储分配相反,在栈式存储方案中,程序对数据区的需求在编译时是完全未知的,只有到运行的时候才能够知道,但是规定在运行中进入一个程序模块时,必须知道该程序模块所需的数据区大小才能够为其分配内存.和我们在数据结构所熟知的栈一样,栈式存储分配按照先进后出的原则进行分配。

静态存储分配要求在编译时能知道所有变量的存储要求,栈式存储分配要求在过程的入口处必须知道所有的存储要求,而堆式存储分配则专门负责在编译时或运行时模块入口处都无法确定存储要求的数据结构的内存分配,比如可变长度串和对象实例.堆由大片的可利用块或空闲块组成,堆中的内存可以按照任意顺序分配和释放.

(2)堆和栈的比较

上面的定义从编译原理的教材中总结而来,除静态存储分配之外,都显得很呆板和难以理解,下面撇开静态存储分配,集中比较堆和栈:

从堆和栈的功能和作用来通俗的比较,堆主要用来存放对象的,栈主要是用来执行程序的.而这种不同又主要是由于堆和栈的特点决定的:

在编程中,例如C/C++中,所有的方法调用都是通过栈来进行的,所有的局部变量,形式参数都是从栈中分配内存空间的。实际上也不是什么分配,只是从栈顶向上用就行,就好像工厂中的传送带(conveyor belt)一样,Stack Pointer会自动指引你到放东西的位置,你所要做的只是把东西放下来就行.退出函数的时候,修改栈指针就可以把栈中的内容销毁.这样的模式速度最快,当然要用来运行程序了.需要注意的是,在分配的时候,比如为一个即将要调用的程序模块分配数据区时,应事先知道这个数据区的大小,也就说是虽然分配是在程序运行时进行的,但是分配的大小多少是确定的,不变的,而这个"大小多少"是在编译时确定的,不是在运行时.

堆是应用程序在运行的时候请求操作系统分配给自己内存,由于从操作系统管理的内存分配,所以在分配和销毁时都要占用时间,因此用堆的效率非常低.但是堆的优点在于,编译器不必知道要从堆里分配多少存储空间,也不必知道存储的数据要在堆里停留多长的时间,因此,用堆保存数据时会得到更大的灵活性。事实上,面向对象的多态性,堆内存分配是必不可少的,因为多态变量所需的存储空间只有在运行时创建了对象之后才能确定.在C++中,要求创建一个对象时,只需用new命令编制相关的代码即可。执行这些代码时,会在堆里自动进行数据的保存.当然,为达到这种灵活性,必然会付出一定的代价:在堆里分配存储空间时会花掉更长的时间!这也正是导致我们刚才所说的效率低的原因,看来列宁同志说的好,人的优点往往也是人的缺点,人的缺点往往也是人的优点(晕~).

(3)JVM中的堆和栈

JVM是基于堆栈的虚拟机.JVM为每个新创建的线程都分配一个堆栈.也就是说,对于一个Java程序来说,它的运行就是通过对堆栈的操作来完成的。堆栈以帧为单位保存线程的状态。JVM对堆栈只进行两种操作:以帧为单位的压栈和出栈操作。

我们知道,某个线程正在执行的方法称为此线程的当前方法.我们可能不知道,当前方法使用的帧称为当前帧。当线程激活一个Java方法,JVM就会在线程的Java堆栈里新压入一个帧。这个帧自然成为了当前帧.在此方法执行期间,这个帧将用来保存参数,局部变量,中间计算过程和其他数据.这个帧在这里和编译原理中的活动纪录的概念是差不多的.

从Java的这种分配机制来看,堆栈又可以这样理解:堆栈(Stack)是操作系统在建立某个进程时或者线程(在支持多线程的操作系统中是线程)为这个线程建立的存储区域,该区域具有先进后出的特性。

每一个Java应用都唯一对应一个JVM实例,每一个实例唯一对应一个堆。应用程序在运行中所创建的所有类实例或数组都放在这个堆中,并由应用所有的线程共享.跟C/C++不同,Java中分配堆内存是自动初始化的。Java中所有对象的存储空间都是在堆中分配的,但是这个对象的引用却是在堆栈中分配,也就是说在建立一个对象时从两个地方都分配内存,在堆中分配的内存实际建立这个对象,而在堆栈中分配的内存只是一个指向这个堆对象的指针(引用)而已。献丑了:

1、java中所有变量(包括你上述提及的str引用类型变量)的存放位置都取决于该

变量的声明位置,而new出的对象则始终被jvm存放在堆中,创建的字串常

量则始终被jvm存放在数据段区常量池中。

2、你对第一个str引用变量存放位置的解释有一点欠妥的地方,准确的说这个

str的存放位置不一定在栈中,这要看str的声明位置,如果str是方法参数中

声明或方法内局部变量声明则存放位置就是你说的在栈中,但如果在类的成

员变量中声明则是存放于堆中。“abc”是一个字串常量被存放于常量池中而

该常量返回的引用地址被存放于str变量中,str变量的位置取决于str的声明

位置。

3、第二种方式string str = new string("abc");其实上是创建了两个对象,

与上述相同,字串常量对象被放在常量池中,这个常量“abc”与上面第一个

创建的“abc”是同一个abc,常量池中不能保存相同面值的常量,而new出的

新对象new string("abc")则存放在堆中,这里的“abc”的位置存在于堆

中,与上述常量池中的“abc”不是同一个“abc”,这里一定要注意啊,而

str变量的存放位置与第一个str的存放位置都是取决于该str的声明位置。

4、解释引用变量存放位置的原理:对象在创建时将为所有的成员变量分配内存

空间以及为所有的成员方法分配入口地址,因为对象是对属性及方法的封装

而对象在创建时被分配到堆中的空间,因此成员变量被分配在堆中,而方法

时在调用时为局部参数或变量临时分配内存空间,在此,方法在调用时被jvm

线程加载至栈中,于此局部变量及参数的所在位置存在与栈中,这些局部变

量及参数所占空间是临时的,一旦方法调用结束其临时空间将被释放,所以

内存栈区空间是为变量分配的临时存贮空间,这个你可以参考马士兵的堆栈

视屏教程,他讲述的很清楚,我可能还没有他表达得清楚。

5、最后再强调一点:变量不是都放在栈中,这取决于该变量的声明位置,我的

这种说法你能理解吗?只有理解了这一点,在出现堆栈问题或缓存遗留问题

时才能根据问题的出发点找到问题的出处。楼主真懒啊具体说明

什么是JAVA堆栈

Java中堆栈的概念是逻辑上的,在完全符合Java规范的Java处理器面世之前,所有Java虚拟机提供的内容都是由软件模拟出来的。

什么叫堆?你用十几个麻将牌竖直叠成一摞这叫堆,你可以从上面、下面、中间任意抽出一张牌,也可以任意插入一张。

什么叫栈?AK-47的弹匣就是一个栈,在上面的子弹没被取出之前,你无法取出下面的子弹——尽管你可以从边上的透明部分读出里面装的是什么型号、颜色的子弹。

堆很灵活,但是不安全。对于对象,我们要动态地创建、销毁,不能说后创建的对象没有销毁,先前创建的对象就不能销毁,那样的话我们的程序就寸步难行,所以Java中用堆来存储对象。而一旦堆中的对象被销毁,我们继续引用这个对象的话,就会出现著名的 NullPointerException,这就是堆的缺点——错误的引用逻辑只有在运行时才会被发现。

栈不灵活,但是很严格,是安全的,易于管理。因为只要上面的引用没有销毁,下面引用就一定还在,所以,在栈中,上面引用永远可以通过下面引用来查找对象,同时如果确认某一区间的内容会一起存在、一起销毁,也可以上下互相引用。在大部分程序中,都是先定义的变量、引用先进栈,后定义的后进栈,同时,区块内部的变量、引用在进入区块时压栈,区块结束时出栈,理解了这种机制,我们就可以很方便地理解各种编程语言的作用域的概念了,同时这也是栈的优点——错误的引用逻辑在编译时就可以被发现。

在Java中,引用可以理解为一个永远指向对象的指针,Java没有指向指针的指针。

关于堆栈的资料几乎每个讲数据结构的书上都有,而至于Java中堆、栈的具体机制你可以参考一些关于Java虚拟机原理的书,不过这个好像比较难理解,我是没指望理解的了。

以上都是我的个人观点,仅供参考。

java堆栈(java堆栈信息怎么看)相关推荐

  1. JAVA 获取微信用户信息,看完这篇你必须得学会

    很多IT搬砖员,磕磕碰碰,都比较生怕遇到自己未接触过的东西,但是作为开发,迟早有一天,某个领导跟你说,某个需求,需要接入微信公众号,需要获取微信用户信息. 虽然说微信提供了相关的文档,但是免不了还是很 ...

  2. Java获取异常堆栈信息

    Java获取异常堆栈信息 参考文章: (1)Java获取异常堆栈信息 (2)https://www.cnblogs.com/zhi-leaf/p/6288769.html 备忘一下.

  3. java异常——分析堆栈跟踪元素+使用异常机制的技巧

    [0]README 0.1) 本文描述+源代码均 转自 core java volume 1, 旨在理解 java异常--分析堆栈跟踪元素+使用异常机制的技巧 的相关知识: [1]分析堆栈跟踪元素相关 ...

  4. java中堆栈内存_Java堆空间与堆栈– Java中的内存分配

    java中堆栈内存 Sometime back I wrote a couple of posts about Java Garbage Collection and Java is Pass by ...

  5. java打印线程堆栈_Java问题定位之Java线程堆栈分析

    采用Java开发的大型应用系统越来越大,越来越复杂,很多系统集成在一起,整个系统看起来像个黑盒子.系统运行遭遇问题(系统停止响应,运行越来越慢,或者性能低下,甚至系统宕掉),如何速度命中问题的根本原因 ...

  6. java 队列和堆栈_Java中的堆栈和队列

    java 队列和堆栈 我最近一直在研究一些需要堆栈和队列的Java代码. 使用的选择不是立即显而易见的. 有一个Queue接口,但没有明确的具体实现要使用. 还有一个Stack类,但是javadocs ...

  7. Java中的堆栈安全递归

    在本文中,摘自< Java中的函数式编程 >一书,我解释了如何使用递归,同时避免了StackOverflow异常的风险. Corecursion正在使用第一步的输出作为下一步的输入来构成计 ...

  8. Java中的堆栈和队列

    我最近一直在研究一些需要堆栈和队列的Java代码. 使用的选择不是立即显而易见的. 有一个Queue接口,但没有明确的具体实现要使用. 还有一个Stack类,但是javadocs指出其他类" ...

  9. java线程堆栈_深入JVM剖析Java的线程堆栈

    在这篇文章里我将教会你如何分析JVM的线程堆栈以及如何从堆栈信息中找出问题的根因.在我看来线程堆栈分析技术是Java EE产品支持工程师所必须掌握的一门技术.在线程堆栈中存储的信息,通常远超出你的想象 ...

最新文章

  1. android 下拉菜单触发_Android实现三级联动下拉框 城市选择器(简单)
  2. Kafka-0.10.0.0 集群高可靠实验
  3. Alpha冲刺之事后诸葛亮
  4. jQuery - 获取并设置 CSS 类、尺寸
  5. clear java_Java ConcurrentLinkedDeque clear()用法及代码示例
  6. java基础——枚举
  7. 聊聊高并发(三十三)Java内存模型那些事(一)从一致性(Consistency)的角度理解Java内存模型
  8. JAVA标识符中含小数点可以吗_数值类型小数点后是否可以接零问题
  9. 【Java】异常和IO在Gourmet咖啡系统中的应用
  10. python爬虫反爬-python爬虫--爬虫与反爬
  11. AtomicReference
  12. Bailian4018 子串【字符串】
  13. NASNET-【论文理解】
  14. ARKit何以从同类技术中胜出?
  15. 在excel上画交换机面板_如何在Excel中创建面板图
  16. LAMP兄弟连的兄弟们都该看看!(绝非欺骗)
  17. Excel中文本的拆分与合并
  18. SqlServer中的dbo是什么意思?
  19. 专业卡与游戏卡的区别
  20. 用pl/sql解决芬兰数学家因卡拉设计的最难数独

热门文章

  1. java开发页面超链接样式_Web报表中如何设置超链接的样式
  2. java计算机毕业设计网上书店的设计与实现源码+数据库+系统+lw文档+mybatis+运行部署
  3. 深度补全延伸系列——1——SPN
  4. Winxp + Vista + Mac OSX + Ubuntu
  5. mac 卸载 eclipse_推荐给 新手程序员Mac 准备的工具套餐!
  6. Xcode 10.1 中关于 Error: Multiple commands produce
  7. 2022-2028年全球与中国闪光对焊系统市场研究及前瞻分析报告
  8. 赛码网输入注意事项 Python
  9. error: RPC failed; curl 18 transfer closed with outstanding read data remain
  10. 达摩院 2023 十大科技趋势发布