什么情况下会发生堆内存溢出,栈内存溢出,结合实例说明
2018-10-09 14:58
274 查看
一、 栈溢出(StackOverflowError)
栈是线程私有的,他的生命周期与线程相同,每个方法在执行的时候都会创建一个栈帧,用来存储局部变量表,操作数栈,动态链接,方法出口灯信息。局部变量表又包含基本数据类型,对象引用类型(局部变量表编译器完成,运行期间不会变化)
所以我们可以理解为栈溢出就是方法执行是创建的栈帧超过了栈的深度。那么最有可能的就是方法递归调用产生这种结果。
[code]public class JvmTest { private int i = 0; public void a(){ System.out.println(i++); a(); } public static void main(String[] args) { JvmTest j = new JvmTest(); j.a(); } }
输出结果:
如何解决:
我们需要使用参数 -Xss 去调整JVM栈的大小
解决后效果如下
但是需要注意递归程序的风险。
二、 堆溢出(OutOfMemoryError:java heap space)
heap space表示堆空间,堆中主要存储的是对象。如果不断的new对象则会导致堆中的空间溢出
[code]public class JvmTest { public static void main(String[] args) { List<String> aList = new ArrayList<String>(); try{ while(true){ aList.add("asdasdasdas"); } }catch(Throwable e){ System.out.println(aList.size()); e.printStackTrace(); } } }
异常信息:
可以通过 -Xmx4096M 调整堆的总大小
三、 永久代溢出(OutOfMemoryError: PermGen space)
由于JDK7、8移除永久带,所以上述代码在JDK1.6的情况中会出现永久带溢出的现象。
阅读更多
相关文章推荐
- 用什么工具查看内存溢出,结合具体实例讲一下具体的过程
- Android 多图片情况下,发生内存溢出的解决办法
- java 内存学习 二 (内存溢出情况说明)
- Android内存泄露与内存溢出是什么,什么情况是内存泄露,什么情况是内存溢出
- 一个httpclient4实例跨域访问会报错,谁知道在什么情况下会出现这个问题?
- Android编程之内存溢出解决方案(OOM)实例总结
- 异常、堆内存溢出、OOM的几种情况
- windows高级调试 第五章 内存破坏之一-栈 实例三:栈溢出 动手实践的过程
- 异常、堆内存溢出、OOM的几种情况
- 出现“烫”“屯”字样,则说明你的程序是VC编写的DEBUG版程序,“烫”是未初始化的栈空间,“屯”是申请后未做过内存清零或COPY的堆内存。 写入文件是“屯”,则需要找下你申请的内存是不是没经过内存复
- Tomcat7.057绿色版安装成windows服务,运行时发生内存溢出错误的解决方法
- Android 内存泄漏和内存溢出情况总结
- java开发线程篇3:同步和异步有何异同,在什么情况下分别使用他们?举例说明。
- 内存管理与垃圾回收2之内存溢出的三种情况及解决办法
- Atitit 如何做数据分析 描述型:发生了什么?可视化仪表盘化很重要。 1 2. 诊断型:为什么会发生?结合历史记录 1 3. 预测型:可能发生什么? 2 4. 指导型 规划未来行动:我需要做什
- 【JVM类加载】以及占内存溢出StackOverflowError、堆内存溢出OutOfMemoryError
- JS判断鼠标从什么方向进入一个容器实例说明
- viewPager--viewpager时,发生内存溢出OOM问题
- Mat工具查看内存泄露和内存溢出情况
- 绿色版tomcat 放到windows服务里,运行时发生内存溢出错误的解决方法