1、你是不是开来很多线程,然后这些线程还递归了?原因应该是栈被你用完了吧。
2、死循环本身是不会StackOverflow的,只有无限递归的时候会出现。原则上循环嵌套次数本身是没有限制的,限制的是占用的栈空间,如果你的函数里定义了很多很多变量,栈空间就会用完得比较快。
Java里面有没有这种语法不清楚,C#中间可以把struct定义成整个展开的形式,这样一个struct可能就占很大的空间,而且是unboxing的,放到栈上可能一层就会导致StackOverflow……
3、 支持 "循环嵌套次数本身是没有限制的",这个应该是错的.我看过官方文档,里面说是因为嵌套的层次太深导致的.但是嵌套层次要去到什么深度才引起java.lang.StackOverflowError,我现在还没找到.
我的函数嵌套了1k层左右,当初我也以为是栈空间占用太多了导致的,所以把不必要的变量都去掉,单纯的去递归,但是还是报StackOverflowError.最后把算法改成不用递归,用循环,问题就解决了.
4、递归就算什么变量都不要也是消耗栈空间的,每次调用都要在栈里面压一大堆乱七八糟的东西,比如说返回地址,比如说参数,还可能有执行上下文等等。
5、JVM里会有两种StackOverflowError, 一种是对应JVM stack, 一种是对应Native Method stack. 我们一般说的都是JVM stack.
每一个JVM线程维护自己的JVM stack. JVM stack里面存放 JVM栈帧. 栈帧中存放 数据和中间结果(本地变量数组, 操作符栈, 和对runtime 常量池的引用). 这些数据都比较小(对象都在堆中, 栈帧仅存放对象引用), 所以想单纯通过 在栈帧中存放大数据的方法 去引入StackOverflowError, 基本是不现实的.一般都是因为方法调用嵌套层数过大.
http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-2.html#jvms-2.5.2
JVM stack的大小是可以调节的, sun的windows jvm6 x64,jvm栈默认大小为1024k.可以通过-Xss1024k来调节.
http://www.oracle.com/technetwork/java/hotspotfaq-138619.html#threads_oom
做一点实验:
private int aa=0; private void aaa(){ System.out.println(aa++); aaa(); } @Test public void test3243(){ aaa(); }测试结果: -server -Xss128k 输出946时溢出java栈 -server -Xss512k 输出5418时溢出java栈 -server -Xss1280k 输出14363时溢出java栈 -server -Xss12800k 输出252223时溢出java栈
6、函数栈溢出 就会出现这个错误 一些语言是可以设置递归的最大深度的(比如Python) 如果体验过这个 你就明白这里的溢出是咋回事了
分享到:
相关推荐
解决java.lang.StackOverflowError
如果某个线程的线程栈空间被耗尽,没有足够资源分配给新创建的栈帧,就会抛出 java.lang.StackOverflowError 错误。 线程栈是如何运行的? 首先给出一个简单的程序调用代码示例,如下所示: public class...
1. 首先,程序启动后, main() 方法入栈 2. 然后, a() 方法入栈,变量 x 被声明为 int 类型,初始化赋值为 0 3. 接着, b() 方
主要介绍了 Java中内存异常StackOverflowError与OutOfMemoryError详解的相关资料,需要的朋友可以参考下
stackoverflow java mobi 电子书 ebook java学习好资料
stackoverflow-java:stackoverflow的来源
去除死循环,解决StackOverflowError错误
tomcat内存溢出解决办法,错误信息:java.lang.OutOfMemoryError:PermGen space 参考该文档可快速解决内存溢出的问题,服务器:tomcat
讲讲什么情况下会出现内存溢出,内存泄漏 乐观锁和悲观锁的理解及如何实现,有哪些实现方式 线程与进程的区别? Session的save()、update()... Java 中的编译期常量是什么?使用它又什么风险 Java死锁以及如何避免
使用这个标签可以(在StackOverflow上)查找有关 Java 编程语言或者 Java 平台工具的问题。 Java 是一种高性能、跨平台、面向对象的编程语言和运行环境。Java 大部分语法起源于 C 和 C++,但是其对象模型比 C++ ...
先安装Java JDK 和JRE、Cython注意:jnius安装的坑比较多,请参考http://stackoverflow.com/search?q=jnius 如果出现ImportError,一般是java环境变量或者path没有配置好。 jnius/jnius.c:4:20: fatal error: ...
Stackoverflow上人气最旺的10个Java问题Java开发Java经验技巧共7页.pdf.zip
stackoverflow上Java相关回答整理翻译.zip,stackoverflow上Java相关回答整理翻译
在Controller返回JSON数据到前端的时候 出现了这个StackOverflowError的错误 即 在将对象转换为JSON格式的数据的时候出现了无限递归调用的情况 如下: org.springframework....
无法反编译出java源码 stackoverflow 上 Android 开发 500 问 stackoverflow 上 Android 高票问题翻译整理,下面中文标题的问题意味着翻译完或翻译中,如果你有意翻译可选择其它英文标题的问题进行翻译,其它问题猛...
2. 如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError异常; 如果虚拟机栈可以动态扩展,如果扩展时无法申请到足够的内存,就会抛出OutOfMemoryError异常; (当前大部分JVM都可以动态扩展,只...
hibernate中manytomany关系 实体类中有个集合方的是这个实体类本身
StackOverflow 创始人推荐图书
34.java.lang.StackOverflowError 堆栈溢出错误。当一个应用递归调用的层次太深而导致堆栈溢出时抛出该错误。 35.java.lang.ThreadDeath 线程结束。当调用Thread类的stop方法时抛出该错误,用于指示线程结束。 36....
栈溢出抛出java.lang.StackOverflowError错误,出现此种情况是因为方法运行的时候栈的深度超过了虚拟机容许的大深度所致。 出现这种情况,一般情况下是程序错误所致的,比如写了一个死递归,有可能造成此种...