ditunes / blog

write my idea & share my tunes
1 stars 1 forks source link

StackOverFlowError 问题浅析 #9

Open ditunes opened 8 years ago

ditunes commented 8 years ago

如果栈空间不足以存放更多栈帧或内存无法为栈分配更多空间则会抛出StackOverflowError,一般而言有如下情形可能会导致此异常:

如果遇到上述方法栈空间不足的问题时候,需要去检查自己的业务代码和业务设计,考虑是否可以优化,比如线程过多的时候,能否使用有限的线程资源并建立等待机制,比如方法调用关系复杂能否优化调用关系,减少调用层级。然后再考虑使用-xss去修改配置大小。

除了虚拟机运行时可能抛出该异常外,在执行编译的时候也会出现该问题。一位朋友给我发来了一段编译时期的stackoverflow error的异常栈信息,通过在编译插件(当时使用的是 apache maven-compiler-plugin)中配置-verbose -Xlint:all,-options,-path就可以看到编译执行情况和失败位置。通过提示信息,我们很快定位到一个类文件,原来这个文件高达1mb,仔细一看他们团队把大量字符串数据直接写在代码,造成编译器空间不足。尽管在javac可以配置-xss解决问题,但是找到问题的本质对后续的代码优化是有很大指导意义的。

查询本机环境下的stacksize

java -XX:+PrintFlagsFinal -version | grep ThreadStackSize
    intx CompilerThreadStackSize  = 0  {pd product}
    intx ThreadStackSize    = 1024   {pd product}
    intx VMThreadStackSize  = 1024   {pd product}

其中0表示默认值,具体可以参考Java HotSpot VM Options中的-XX:ThreadStackSize 参数配置说明,该参数也可以效果等同于-xss其中仍却少windows说明 Frequently Asked Questions About the Java HotSpot VM 这篇文章有提到jdk6下虚拟机默认值 包括windows