堆栈溢出崩溃
许多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操作系统确定。