alert报错stackoverflowerror原因

如题所述

每一个JVM线程都拥有一个私有的JVM线程栈,用于存放当前线程的JVM栈帧(包括被调用函数的参数、局部变量和返回地址等)。如果某个线程的线程栈空间被耗尽,没有足够资源分配给新创建的栈帧,就会抛出java.lang.StackOverflowError错误。
引发StackOverFlowError的常见原因有以下几种:
·无限递归循环调用(最常见)。
·执行了大量方法,导致线程栈空间耗尽。
·方法内声明了海量的局部变量。
·native代码有栈上分配的逻辑,并且要求的内存还不小,比如java.net.SocketInputStream.read0会在栈上要求分配一个64KB的缓存(64位Linux)。
除了程序抛出StackOverflowError错误以外,还有两种定位栈溢出的方法:
·进程突然消失,但是留下了crash日志,可以检查crash日志里当前线程的stack范围,以及RSP寄存器的值。如果RSP寄存器的值超出这个stack范围,那就说明是栈溢出了。
·如果没有crash日志,那只能通过coredump进行分析。在进程运行前,先执行ulimit-cunlimited,当进程挂掉之后,会产生一个core.[pid]的文件,然后再通过jstack$JAVA_HOME/bin/javacore.[pid]来看输出的栈。如果正常输出了,那就可以看是否存在很长的调用栈的线程,当然还有可能没有正常输出的,因为jstack的这条从core文件抓栈的命令其实是基于ServiceabilityAgent实现的,而SA在某些版本里有Bug。
常见的解决方法包括以下几种:
·修复引发无限递归调用的异常代码,通过程序抛出的异常堆栈,找出不断重复的代码行,按图索骥,修复无限递归Bug。
·排查是否存在类之间的循环依赖。
·排查是否存在在一个类中对当前类进行实例化,并作为该类的实例变量。
·通过JVM启动参数-Xss增加线程栈内存空间,某些正常使用场景需要执行大量方法或包含大量局部变量,这时可以适当地提高线程栈空间限制,例如通过配置-Xss2m将线程栈空间调整为2mb。
温馨提示:内容为网友见解,仅供参考
无其他回答

alert报错stackoverflowerror原因
引发StackOverFlowError的常见原因有以下几种:·无限递归循环调用(最常见)。·执行了大量方法,导致线程栈空间耗尽。·方法内声明了海量的局部变量。·native代码有栈上分配的逻辑,并且要求的内存还不小,比如java.net.SocketInputStream.read0会在栈上要求分配一个64KB的缓存(64位Linux)。除了程序抛出St...

关于System.IndexOutOfRangeException错误,请问如何解决,谢谢!_百度知...
3、StackOverflowError:栈内存满了,当应用程序递归太深而发生堆栈溢出时,抛出该错误。4、OutofMemoryError:堆内存满了,因为内存溢出或没有可用的内存提供给垃圾回收器时,Java虚拟机无法分配一个对象,这时抛出该异常。

相似回答
大家正在搜