如何设置堆栈大小以克服java.lang.StackOverflowError

堆栈溢出崩溃

许多Java虚拟机发布者将线程的调用堆栈的默认大小从1MB减小到256KB。这允许更多线程同时运行,但是这意味着每个线程在嵌套其函数调用的深度方面受到更多限制。
在某些情况下会发生堆栈溢出崩溃,因为JRockit JVM无法正常处理堆栈溢出错误。根据J2SE Java文档,正常处理的java.lang.StackOverflowError是引发java.lang.VirtualMachineError的错误,指示JVM已损坏或已耗尽其继续运行所必需的资源。
JRockit JVM .dump文件包含有关引发的堆栈溢出错误数的信息。
当JRockit JVM由于堆栈溢出而崩溃时,文本崩溃文件(.dump)会显示错误消息:文件顶部附近的堆栈溢出。其他迹象可能是崩溃文件中的堆栈跟踪非常长,或者根本没有堆栈跟踪。如果.dump文件显示类似StackOverFlow的内容:发生2个StackOverFlowErrors,则表明崩溃可能是由先前的堆栈溢出问题触发的。
通常,堆栈溢出错误是由将应用程序编码为需要超出JRockit JVM的内存限制的堆栈空间引起的。检查.dump文件中的堆栈跟踪,以确定是否可以更改Java代码以使用较少的堆栈空间。例如,应用程序代码可能包含递归方法调用。深度递归会导致StackOverflow错误。
如果无法更改应用程序的堆栈要求,则可以使用-Xss命令行选项来更改线程堆栈的大小。
-XX:+ CheckStacks命令行选项使JRockit JVM对堆栈溢出错误更健壮。它通常可以防止JVM转储并抛出java.lang.StackOverflowError。
注意:-XX:+ CheckStacks命令行选项会导致轻微的性能下降,因为JVM会触摸堆栈上的页面。
示例:日记帐分录报告-由于大量数据超出内存异常。您检查了大型XML / BI报告,这些报告要花很长时间才能处理或失败。数据量发生了巨大变化,每次执行报告时都会发生问题。当堆栈溢出发生时会引发错误,因为应用程序求助的深度过大。BI Manager JVM的堆栈大小不足以处理报告数据的大小。原因是堆栈大小配置得太小。如果堆栈空间太小而无法执行进程,最终您将看到异常类java.lang.StackOverflowError。
详细错误显示如下: 
ArchiveWriteJob:错误: 
BIPDelivery:错误:ESS-07033作业逻辑指示为请求382583执行异步Java作业时发生系统错误。作业错误是:BIP作业失败,输出错误。
Java虚拟机(BI Publishers)的线程调用堆栈的默认大小为1MB。提高堆栈大小限制(1MB-> 4MB),以允许更多线程(每个线程允许进行更深层次的递归调用)同时运行,以容纳更大的XML数据。
之前的设置:
fusion.BIDomain.bi_cluster.default.minmaxmemory.main = -Xms8192m -Xmx16384m 
fusion.BIDomain.obi.default.minmaxmemory.main = -Xms8192m -Xmx16384m  
之后的设置: 
fusion.BIDomain.bi_cluster.default.minmaxmemory.main = -Xms8192m -Xmx16384m -Xss4096k 
fusion.BIDomain.obi.default.minmaxmemory.main = -Xms8192m -Xmx16384m -Xss4096k 
参数:-Xssn表示堆栈大小;
每个Java线程都有两个堆栈:一个用于Java代码,一个用于C代码。此选项将线程中的C代码可以使用的最大堆栈大小设置为n。在传递给java的程序执行过程中产生的每个线程的C堆栈大小均为n。n的默认单位是字节,并且n必须大于1000字节。要修改n的含义,请在字母k后面添加千字节,在字母m后面添加兆字节。默认堆栈大小由运行Java平台的Linux操作系统确定。 
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值