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中内存异常StackOverflowError与OutOfMemoryError详解 Java中内存异常StackOverflowError与OutOfMemoryError是两种常见的错误类型,它们都是 Java 虚拟机(JVM)在运行时可能遇到的问题。本文将详细介绍这两种...
- **常见例子**:常见的错误包括 `OutOfMemoryError`、`StackOverflowError` 等。 **示例代码**: ```java public class StackOverflowExample { public static void recursiveMethod() { recursiveMethod(); // ...
- **Error**:表示系统级错误或虚拟机错误,如`OutOfMemoryError`、`StackOverflowError`等,一般不应在应用程序中捕获或处理。 6. **异常类的子类**: - `RuntimeException`子类包括`ArithmeticException`(算术...
堆栈溢出(StackOverflowError)和内存溢出(OutOfMemoryError)是另外两种在Java开发中需要注意的异常。堆栈溢出通常在递归调用中发生,当递归深度过大,超过了JVM堆栈所能容纳的最大深度时,就会抛出这个异常。而...
栈帧的大小在方法执行期间是固定的,过深的栈会导致`StackOverflowError`,而无法扩展栈会导致`OutOfMemoryError`。 3. **本地方法栈**:类似于虚拟机栈,但服务于Java虚拟机的本地方法接口,用于执行Java的Native...
堆栈溢出(`StackOverflowError`)和内存溢出(`OutOfMemoryError`)是两种常见的错误级别异常。前者发生在递归调用深度过大导致堆栈空间耗尽时;后者发生在内存不足,无法分配新的对象时。 **产生原因:** - **堆栈...
下面我们将深入探讨Java语言程序中的错误类型及其产生原因。 1. **编译错误 (Compile-Time Errors)** 编译错误在代码编译阶段发生,通常是由于语法错误或类型不匹配等原因导致。例如,未声明变量、括号不匹配、...
- **Apache Harmony**:这是一个开源项目,旨在提供一个与Java标准兼容的虚拟机和库,尽管该项目已经结束,但它对Java社区产生了深远的影响。 - **Microsoft JVM**:微软曾推出的一款Java虚拟机,但后来因为与Sun ...
过大可能导致`StackOverflowError`,过小可能引发`OutOfMemoryError`。 - **本地方法栈**:与虚拟机栈类似,但服务于本地方法(非Java)。 - **方法区/元空间**:线程共享,存储类元数据,如常量、静态变量和编译...
程序计数器记录当前线程执行的字节码的行号指示器,是唯一一个不会抛出 StackOverflowError 和 OutOfMemoryError 的区域。Java虚拟机栈描述了Java方法执行的内存模型,当线程创建时会分配一个栈空间,每个方法执行时...
JVM在遇到严重问题时会抛出错误(Error),如OutOfMemoryError、StackOverflowError等。理解这些错误的产生原因和解决策略,可以避免应用的突然崩溃。 十、JVM最新发展 随着技术的不断进步,JVM也在持续演进。例如...
例如AbstractMethodError、AssertionError、ClassCircularityError、...StackOverflowError、ThreadDeath、ThreadStop、UnknownError、UnsatisfiedLinkError、UnsupportedClassVersionError、VerifyError、...
3. java.lang.StackOverflowError ----> 不会抛OOM error,但也是比较常见的Java内存溢出。 这种情况一般是由于程序中存在死循环或者深度递归调用造成的,栈大小设置太小也会出现此种溢出。可以通过虚拟机参数-Xss...
当线程请求的栈空间超过了允许的最大值时,会抛出`StackOverflowError`。若栈空间不足,则抛出`OutOfMemoryError`。 5. **栈帧(Frame)** - 每次方法调用都会创建一个新的栈帧,并将其压入栈顶。栈帧包含以下内容...
如果方法调用的深度超过了虚拟机栈的最大深度限制,会抛出`StackOverflowError`异常;如果虚拟机栈无法动态扩展或扩展时无法获得足够的内存资源,则会抛出`OutOfMemoryError`异常。 ##### 1.3 本地方法栈(Native ...
OOM错误是Java运行时常见的问题,通常包括java.lang.StackOverflowError、java.lang.OutOfMemoryError等。了解内存溢出的原因和如何调试和处理这些问题对于Java开发人员非常重要。 #### 性能评估与诊断 在开发和...
- **StackOverflowError**:栈溢出,通常由于递归过深或大量线程导致。 7. **JVM内存模型** - **JMM(Java Memory Model)**:确保多线程环境下数据的一致性,涉及可见性、有序性和原子性。 源代码部分可能包含...
- **异常情况**:与Java虚拟机栈类似,可能会抛出StackOverflowError或OutOfMemoryError。 4. **堆(Heap)**: - **作用**:所有线程共享的一块内存区域,在虚拟机启动时创建。 - **分类**: - **新生代(Young ...
当线程请求的栈深度超过虚拟机所允许的最大深度时,将抛出`StackOverflowError`;如果虚拟机栈可以动态扩展,则可能会因为无法申请到足够的内存而抛出`OutOfMemoryError`。 - **本地方法栈**:类似于Java虚拟机栈,...