不可恢复的堆栈溢出
问题描述
一个应用程序在 JVM 结束或核心转储之前得到“an irrecoverable stack overflow has occurred. Unexpected Signal 11”消息。 或者,该应用程序得到一个一般的“StackOverFlow Error”消息。 

Unexpected Signal : 11 occurred at PC=0xfb9c22ec
Function name=write (compiled Java code)
Library=(N/A)
Current Java thread:
Dynamic libraries:

0x10000     /opt/bea/jdk131/jre/bin/../bin/sparc/native_threads/java
0xff350000     /usr/lib/lwp/libthread.so.1
0xff380000     /usr/lib/libdl.so.1
0xff200000     /usr/lib/libc.so.1
0xff330000     /usr/platform/SUNW,Ultra-Enterprise/lib/libc_psr.so.1
0xfee00000     /opt/bea/jdk131/jre/lib/sparc/client/libjvm.so
0xff2f0000     /usr/lib/libCrun.so.1
0xff1e0000     /usr/lib/libsocket.so.1
0xfed00000     /usr/lib/libnsl.so.1
0xff1b0000     /usr/lib/libm.so.1
0xff320000     /usr/lib/libw.so.1
0xff190000     /usr/lib/libmp.so.2
0xfede0000     /usr/lib/librt.so.1
0xfedc0000     /usr/lib/libaio.so.1
0xfecc0000     /opt/bea/jdk131/jre/lib/sparc/native_threads/libhpi.so
0xfec80000     /opt/bea/jdk131/jre/lib/sparc/libverify.so
0xfec40000     /opt/bea/jdk131/jre/lib/sparc/libjava.so
0xfec10000     /opt/bea/jdk131/jre/lib/sparc/libzip.so
0xfd810000     /opt/bea/jdk131/jre/lib/sparc/libnet.so
0xaafc0000     /usr/lib/nss_files.so.1
0x6c0c0000     /opt/bea/wlserver6.1/lib/solaris/libmuxer.so
0x6c0a0000     /usr/ucblib/libucb.so.1
0x6bfb0000     /usr/lib/libresolv.so.2
0x6bec0000     /usr/lib/libelf.so.1
0x6bf90000     /opt/bea/jdk131/jre/lib/sparc/libioser12.so
0x6bdc0000     /opt/bea/wlserver6.1/lib/solaris/libjsafe.so

Local Time = Fri Nov  21 16:32:28 2003
Elapsed Time = 6143

# HotSpot Virtual Machine Error : 11
# Error ID : 4F530E43505002BD 01
#
# Please report this error at
# http://java.sun.com/cgi-bin/bugreport.cgi
# Java VM: Java HotSpot(TM) Client VM (1.3.1_07-b02 mixed mode)
#

故障排除
请注意,并非下面所有任务都需要完成。有些问题仅通过执行几项任务就可以解决。

快速链接

为什么发生此问题?
通常在 JVM 核心转储之前显示 StackOverFlow 消息。这一般预示着用户的应用程序代码中出现错误。它可能是用户/应用程序代码中的一个递归调用或者对象数组的数组导致堆栈溢出的情况(在 java.sun.com 上有关于这个问题的错误报告)。这是令人遗憾的,因为要求程序员考虑他们正在运行的 JVM 的实现细节。

返回页首

应用程序编码诊断

  1. 检查是否有一个可用的堆栈跟踪,它将告诉您此错误的来源 - 应用程序代码还是 WebLogic。
  2. 如果怀疑是应用程序代码的问题,则可以进行更改,使得在发生 java.lang.StackOverflowError异常时显示堆栈跟踪信息。
这样就能像下列程序段中那样,提高探测此类编程错误的能力。
Catch ( StackOverflowError e ) {
        System.err.println("Exception: " + e );
        // Here is the important thing to do
        // when catching StackOverflowError's:
        e.printStackTrace();
        // do some cleanup and destroy the thread or unravel if possible.
}
  1. 检查所有近期的应用程序代码变化差异,并查看可能会被递归调用的部分。 
  2. 在有可疑代码的地方添加调试语句

返回页首

从核心文件获取信息
当发生堆栈溢出时,通常也会产生一个核心文件。核心文件可以说明一件事:同一应用程序代码函数被一次又一次地调用,但它不能提供实际函数。如果“没有”生成核心文件,那么原因可能在于文件权限问题或核心文件本身的实际限制。核心转储文件的大小可能受下列因素的影响:
  • 检查 ulimit -a 以查看您的环境是否允许生成核心文件。
  • ulimit -c(这是核心文件的大小限制。用 ulimit -c unlimited调整其大小)。
  • 内核限制(ulimit -c 的硬极限)。
  • 用户的可用磁盘空间(是否有磁盘容量限额?)。
如果生成了一个核心文件,则对该核心文件运行 dbx 或 gdb。下面用 gdb 产生的一个输出示例说明用于 dbx 和 gdb 的命令。(备注:DEBUG_PROG是一个环境变量,它允许您指定使用 java 时要启动的调试器或探查器。)
 
 a. dbx:

 $ java -version  (need to use right version of jdk)
$ ls /opt/bin/dbx (need to know dbx location) or "which dbx"
$ export DEBUG_PROG=/opt/bin/dbx (or wherever "dbx" is located)

 For JDK 1.3.X do the following:
       $ <path to java command>/java corefile
 For JDK 1.4.X do the following:
       $ dbx  <path to java command>/java corefile
 
Now you will be in the debugger.  Execute the following commands:
(dbx) where    ("shows a summary of the stack")
(dbx) threads    ("shows the state of the existing threads")
(dbx) quit

 
b. gdb:

 $ java -version  (need to use right version of jdk)
$ ls /usr/local/bin/gdb (need to know gdb location) or "which gdb"
$ export DEBUG_PROG=/usr/local/bin/gdb  (or wherever "gdb" is located)

 For JDK 1.3.X do the following:
       $ <path to java command>/java corefile
 For JDK 1.4.X do the following:
       $ gdb  <path to java command>/java corefile

Now you will be in the debugger.  Execute the following commands:
(gdb) where        ("shows a summary of the stack")
(gdb) thr    ("switch among threads or show the current thread")
(gdb) info thr        ("inquire about existing threads")
(gdb) thread apply 1 bt    ("apply a command to a list of threads, specifically the backtrace to thread #1")
(gdb) quit

使用这些命令将生成已执行的最后一个线程的堆栈跟踪(where命令),显示当前线程(thr命令),显示所有线程的状态(info thr 命令),以及提供另一个途径获得核心文件中的线程 1 的堆栈跟踪(thread apply 1 bt命令)。使用最后一个命令(thread apply # bt)可获得个别线程的堆栈跟踪,具体做法是用实际线程编号替代 #。您也可以用“all”替代 3 以获得所有线程的堆栈跟踪。

下面是一个使用 gdb 调试器中的那些命令的核心文件示例。此示例核心文件是由应用程序中的用户本地代码错误引起的。(请参阅粗体项。)在此堆栈跟踪上,查看调用信号处理程序之前的最后一行。这将引导您查看本地库 libhello.so中的 displayHelloWorld函数。

    $ export DEBUG_PROG=/usr/local/bin/gdb
    $ java core

    GNU gdb 5.0
    Copyright 2000 Free Software Foundation, Inc.
    GDB is free software, covered by the GNU General Public License, and you are
    welcome to change it and/or distribute copies of it under certain conditions.
    Type "show copying" to see the conditions.
    There is absolutely no warranty for GDB.  Type "show warranty" for details.
    This GDB was configured as "sparc-sun-solaris2.8"...
    (no debugging symbols found)...
    Core was generated by `/wwsl/sharedInstalls/solaris/wls70sp2/jdk131_06/bin/../bin/sparc/native_threads'.
    Program terminated with signal 9, Killed.
    Reading symbols from /usr/lib/libthread.so.1...(no debugging symbols found)...
    Loaded symbols for /usr/lib/libthread.so.1
    Reading symbols from /usr/lib/libdl.so.1...(no debugging symbols found)...done.
    Loaded symbols for /usr/lib/libdl.so.1
    Reading symbols from /usr/lib/libc.so.1...(no debugging symbols found)...done.
    Loaded symbols for /usr/lib/libc.so.1
    Reading symbols from /usr/platform/SUNW,UltraAX-i2/lib/libc_psr.so.1...
    (no debugging symbols found)...done.
    Loaded symbols for /usr/platform/SUNW,UltraAX-i2/lib/libc_psr.so.1
    Reading symbols from /wwsl/sharedInstalls/solaris/wls70sp2/jdk131_06/jre/lib/sparc/server/libjvm.so...(no debugging symbols found)...done.
    Loaded symbols for /wwsl/sharedInstalls/solaris/wls70sp2/jdk131_06/jre/lib/sparc/server/libjvm.so
    Reading symbols from /usr/lib/libCrun.so.1...(no debugging symbols found)...
    Loaded symbols for /usr/lib/libCrun.so.1
    Reading symbols from /usr/lib/libsocket.so.1...(no debugging symbols found)...
    Loaded symbols for /usr/lib/libsocket.so.1
    Reading symbols from /usr/lib/libnsl.so.1...(no debugging symbols found)...
    Loaded symbols for /usr/lib/libnsl.so.1
    Reading symbols from /usr/lib/libm.so.1...(no debugging symbols found)...done.
    Loaded symbols for /usr/lib/libm.so.1
    Reading symbols from /usr/lib/libw.so.1...
     warning: Lowest section in /usr/lib/libw.so.1 is .hash at 00000074
    (no debugging symbols found)...done.
    Loaded symbols for /usr/lib/libw.so.1
    Reading symbols from /usr/lib/libmp.so.2...(no debugging symbols found)...
    Loaded symbols for /usr/lib/libmp.so.2
    Reading symbols from /wwsl/sharedInstalls/solaris/wls70sp2/jdk131_06/jre/lib/sparc/native_threads/libhpi.so...(no debugging symbols found)...done.
    Loaded symbols for /wwsl/sharedInstalls/solaris/wls70sp2/jdk131_06/jre/lib/sparc/native_threads/libhpi.so
    Reading symbols from /wwsl/sharedInstalls/solaris/wls70sp2/jdk131_06/jre/lib/sparc/libverify.so...(no debugging symbols found)...done.
    Loaded symbols for /wwsl/sharedInstalls/solaris/wls70sp2/jdk131_06/jre/lib/sparc/libverify.so
    Reading symbols from /wwsl/sharedInstalls/solaris/wls70sp2/jdk131_06/jre/lib/sparc/libjava.so...(no debugging symbols found)...done.
Loaded symbols for /wwsl/sharedInstalls/solaris/wls70sp2/jdk131_06/jre/lib/sparc/libjava.so
    Reading symbols from /wwsl/sharedInstalls/solaris/wls70sp2/jdk131_06/jre/lib/sparc/libzip.so...(no debugging symbols found)...done.
    Loaded symbols for /wwsl/sharedInstalls/solaris/wls70sp2/jdk131_06/jre/lib/sparc/libzip.so
    Reading symbols from /wwsl/sharedInstalls/solaris/wls70sp2/jdk131_06/jre/lib/sparc/libnet.so...(no debugging symbols found)...done.
    Loaded symbols for /wwsl/sharedInstalls/solaris/wls70sp2/jdk131_06/jre/lib/sparc/libnet.so
    Reading symbols from /wwsl/sharedInstalls/solaris/wls70sp2/server/lib/solaris/libfilelock.so...(no debugging symbols found)...done.
    Loaded symbols for /wwsl/sharedInstalls/solaris/wls70sp2/server/lib/solaris/libfilelock.so
    Reading symbols from /wwsl/sharedInstalls/solaris/wls70sp2/jdk131_06/jre/lib/sparc/libioser12.so...(no debugging symbols found)...done.
    Loaded symbols for /wwsl/sharedInstalls/solaris/wls70sp2/jdk131_06/jre/lib/sparc/libioser12.so
    Reading symbols from /usr/lib/nss_nis.so.1...(no debugging symbols found)...
    Loaded symbols for /usr/lib/nss_nis.so.1
    Reading symbols from /wwsl/sharedInstalls/solaris/wls70sp2/server/lib/solaris/libstackdump.so...(no debugging symbols found)...done.
    Loaded symbols for /wwsl/sharedInstalls/solaris/wls70sp2/server/lib/solaris/libstackdump.so
    Reading symbols from /usr/lib/libmd5.so.1...(no debugging symbols found)...
    Loaded symbols for /usr/lib/libmd5.so.1
    Reading symbols from /wwsl/sharedInstalls/solaris/wls70sp2/server/lib/solaris/libmuxer.so...(no debugging symbols found)...done.
    Loaded symbols for /wwsl/sharedInstalls/solaris/wls70sp2/server/lib/solaris/libmuxer.so
    Reading symbols from /usr/ucblib/libucb.so.1...(no debugging symbols found)...
    Loaded symbols for /usr/ucblib/libucb.so.1
    Reading symbols from /usr/lib/libresolv.so.2...(no debugging symbols found)...
    Loaded symbols for /usr/lib/libresolv.so.2
    Reading symbols from /usr/lib/libelf.so.1...(no debugging symbols found)...
    Loaded symbols for /usr/lib/libelf.so.1
    Reading symbols from /home/usera/wls70/solaris/projectWork/lib/libhello.so...
    (no debugging symbols found)...done.
    Loaded symbols for /home/usera/wls70/solaris/projectWork/lib/libhello.so

(gdb) where

    #0  0xff369764 in __sigprocmask () from /usr/lib/libthread.so.1
    #1  0xff35e978 in _resetsig () from /usr/lib/libthread.so.1
    #2  0xff35e118 in _sigon () from /usr/lib/libthread.so.1
    #3  0xff361158 in _thrp_kill () from /usr/lib/libthread.so.1
    #4  0xff24b908 in raise () from /usr/lib/libc.so.1
    #5  0xff2358f4 in abort () from /usr/lib/libc.so.1
    #6  0xfe3c6904 in __1cCosFabort6Fl_v_ ()
       from /wwsl/sharedInstalls/solaris/wls70sp2/jdk131_06/jre/lib/sparc/server/libjvm.so
    #7  0xfe3c59f8 in __1cCosbBhandle_unexpected_exception6FpnGThread_ipCpv_v_()
       from /wwsl/sharedInstalls/solaris/wls70sp2/jdk131_06/jre/lib/sparc/server/libjvm.so
    #8  0xfe20a8bc in JVM_handle_solaris_signal ()
       from /wwsl/sharedInstalls/solaris/wls70sp2/jdk131_06/jre/lib/sparc/server/libjvm.so
    #9  0xff36b82c in __sighndlr () from /usr/lib/libthread.so.1
    #10 <signal handler called>
    #11 0xe9f90420 in Java_HelloWorld_displayHelloWorld ()
       from /home/usera/wls70/solaris/projectWork/lib/libhello.so

    #12 0x90aec in ?? ()
    #13 0x8dc54 in ?? ()
    #14 0x8dc54 in ?? ()
    #15 0x8dc54 in ?? ()
    #16 0x8ddbc in ?? ()
    #17 0x8dde0 in ?? ()
    #18 0x8dc54 in ?? ()
    #19 0x8dc54 in ?? ()
    #20 0x8dde0 in ?? ()
    #21 0x8dc78 in ?? ()
    #22 0x8dc54 in ?? ()
    #23 0x8ddbc in ?? ()
    #24 0x8dc54 in ?? ()
    #25 0xfe5324f0 in __1cMStubRoutinesG_code1_ ()
       from /wwsl/sharedInstalls/solaris/wls70sp2/jdk131_06/jre/lib/sparc/server/libjvm.so
    #26 0xfe0cbe9c in
__1cJJavaCallsLcall_helper6FpnJJavaValue_pnMmethodHandle_pnRJavaCallArguments_pnGThread__v_()
       from /wwsl/sharedInstalls/solaris/wls70sp2/jdk131_06/jre/lib/sparc/server/libjvm.so
    #27 0xfe1f6dc4 in __1cJJavaCallsMcall_virtual6FpnJJavaValue_nLKlassHandle_nMsymbolHandle_4pnRJavaCallArguments_pnGThread__v_()
       from /wwsl/sharedInstalls/solaris/wls70sp2/jdk131_06/jre/lib/sparc/server/libjvm.so
    #28 0xfe1fcd94 in __1cJJavaCallsMcall_virtual6FpnJJavaValue_nGHandle_nLKlassHandle_nMsymbolHandle_5pnGThread__v_()
       from /wwsl/sharedInstalls/solaris/wls70sp2/jdk131_06/jre/lib/sparc/server/libjvm.so
    #29 0xfe21b708 in __1cMthread_entry6FpnKJavaThread_pnGThread__v_ ()
       from /wwsl/sharedInstalls/solaris/wls70sp2/jdk131_06/jre/lib/sparc/server/libjvm.so
    #30 0xfe216208 in __1cKJavaThreadDrun6M_v_ ()
       from /wwsl/sharedInstalls/solaris/wls70sp2/jdk131_06/jre/lib/sparc/server/libjvm.so
    #31 0xfe213ed0 in _start ()
       from /wwsl/sharedInstalls/solaris/wls70sp2/jdk131_06/jre/lib/sparc/server/libjvm.so

    (gdb) thr

    [Current thread is 1 (LWP    14        )]

    (gdb) info thr
      16 LWP    13          0xff29d194 in _poll () from /usr/lib/libc.so.1
      15 LWP    12          0xff29f008 in _lwp_sema_wait () from /usr/lib/libc.so.1
      14 LWP    11          0xff29f008 in _lwp_sema_wait () from /usr/lib/libc.so.1
      13 LWP    10          0xff29bc2c in _so_accept () from /usr/lib/libc.so.1
      12 LWP    9          0xff29bc2c in _so_accept () from /usr/lib/libc.so.1
      11 LWP    8          0xff29d194 in _poll () from /usr/lib/libc.so.1
      10 LWP    7          0xff29d194 in _poll () from /usr/lib/libc.so.1
      9 LWP    6          0xff29f008 in _lwp_sema_wait () from /usr/lib/libc.so.1
      8 LWP    5          0xff29f008 in _lwp_sema_wait () from /usr/lib/libc.so.1
      7 LWP    4          0xff29f008 in _lwp_sema_wait () from /usr/lib/libc.so.1
      6 LWP    3          0xff29d194 in _poll () from /usr/lib/libc.so.1
      5 LWP    2          0xff29e958 in _signotifywait () from /usr/lib/libc.so.1
      4 LWP    1          0xff29d194 in _poll () from /usr/lib/libc.so.1
      3 LWP    16          0xff29c4fc in door_restart () from /usr/lib/libc.so.1
      2 LWP    15          0xff369774 in private___lwp_cond_wait ()
       from /usr/lib/libthread.so.1
    * 1 LWP    14          0xff369764 in __sigprocmask ()
       from /usr/lib/libthread.so.1

    (gdb) thread apply 1 bt

Thread 1 (LWP    14       ):
    #0  0xff369764 in __sigprocmask () from /usr/lib/libthread.so.1
    #1  0xff35e978 in _resetsig () from /usr/lib/libthread.so.1
    #2  0xff35e118 in _sigon () from /usr/lib/libthread.so.1
    #3  0xff361158 in _thrp_kill () from /usr/lib/libthread.so.1
    #4  0xff24b908 in raise () from /usr/lib/libc.so.1
    #5  0xff2358f4 in abort () from /usr/lib/libc.so.1
    #6  0xfe3c6904 in __1cCosFabort6Fl_v_ ()
       from /wwsl/sharedInstalls/solaris/wls70sp2/jdk131_06/jre/lib/sparc/server/libjvm.so
    #7  0xfe3c59f8 in __1cCosbBhandle_unexpected_exception6FpnGThread_ipCpv_v_()
       from /wwsl/sharedInstalls/solaris/wls70sp2/jdk131_06/jre/lib/sparc/server/libjvm.so
    #8  0xfe20a8bc in JVM_handle_solaris_signal ()
       from /wwsl/sharedInstalls/solaris/wls70sp2/jdk131_06/jre/lib/sparc/server/libjvm.so
    #9  0xff36b82c in __sighndlr () from /usr/lib/libthread.so.1
    #10 <signal handler called>
    #11 0xe9f90420 in Java_HelloWorld_displayHelloWorld ()
       from /home/usera/wls70/solaris/projectWork/lib/libhello.so
    #12 0x90aec in ?? ()
    #13 0x8dc54 in ?? ()
    #14 0x8dc54 in ?? ()
    #15 0x8dc54 in ?? ()
    #16 0x8ddbc in ?? ()
    #17 0x8dde0 in ?? ()
    #18 0x8dc54 in ?? ()
    #19 0x8dc54 in ?? ()
    #20 0x8dde0 in ?? ()
    #21 0x8dc78 in ?? ()
    #22 0x8dc54 in ?? ()
    #23 0x8ddbc in ?? ()
    #24 0x8dc54 in ?? ()
    #25 0xfe5324f0 in __1cMStubRoutinesG_code1_ ()
       from /wwsl/sharedInstalls/solaris/wls70sp2/jdk131_06/jre/lib/sparc/server/libjvm.so
    #26 0xfe0cbe9c in __1cJJavaCallsLcall_helper6FpnJJavaValue_pnMmethodHandle_pnRJavaCallArguments_pnGThread__v_()
       from /wwsl/sharedInstalls/solaris/wls70sp2/jdk131_06/jre/lib/sparc/server/libjvm.so
    #27 0xfe1f6dc4 in __1cJJavaCallsMcall_virtual6FpnJJavaValue_nLKlassHandle_nMsymbolHandle_4pnRJavaCallArguments_pnGThread__v_()
       from /wwsl/sharedInstalls/solaris/wls70sp2/jdk131_06/jre/lib/sparc/server/libjvm.so
    #28 0xfe1fcd94 in __1cJJavaCallsMcall_virtual6FpnJJavaValue_nGHandle_nLKlassHandle_nMsymbolHandle_5pnGThread__v_()
       from /wwsl/sharedInstalls/solaris/wls70sp2/jdk131_06/jre/lib/sparc/server/libjvm.so
    #29 0xfe21b708 in __1cMthread_entry6FpnKJavaThread_pnGThread__v_()
       from /wwsl/sharedInstalls/solaris/wls70sp2/jdk131_06/jre/lib/sparc/server/libjvm.so
    #30 0xfe216208 in __1cKJavaThreadDrun6M_v_ ()
       from /wwsl/sharedInstalls/solaris/wls70sp2/jdk131_06/jre/lib/sparc/server/libjvm.so
    #31 0xfe213ed0 in _start ()
       from /wwsl/sharedInstalls/solaris/wls70sp2/jdk131_06/jre/lib/sparc/server/libjvm.so

    (gdb) quit

返回页首

收集 Thread Dump
当 JVM 运行时,您可以定期收集其 Thread Dump,通常相隔约 5 至 10 秒。 利用这些信息,您也许能找到递归代码并将其改正。为了收集 Thread Dump,您需要对 Java 进程 ID (PID) 执行下列命令:

Unix 型平台:
  1. 在预计崩溃之前执行 kill -3
  2. kill -3 <jvm-pid> 转储 java 线程。
Windows 平台:
  1. 对 JVM PID 执行 kill .3。 
  2. 还可以在 JVM 正在运行的窗口中执行 <CTRL> <BREAK>
对于 JRockit JVM:
  1. 对所有平台上的 JRockit JVM 执行上述命令。
确保您在根 java 进程上执行此命令。 
  1. 若要获得进程的树状结构(父 - 子 ASCII 图),可使用 --forest 选项。
例如,若要查找由用户“usera”启动的进程,可执行 ps -lU usera -.forest
有关如何在 Linux 上利用 JRockit 进行 Thread Dump 的具体示例,请参见以下网址:http://e-docs.bea.com/wls/docs70/cluster/trouble.html#602852

返回页首

停止 JVM 进行 Thread Dump
您可以设置下列标志,以便在生成核心文件之前进行服务器的 Thread Dump,以得到此时刻的线程状态:

Sun JVM
在 SUN JVM 上,该选项是 -XX:+ShowMessageBoxOnError(在 SUN 网站上没有正式记载)。当 JVM 崩溃时,程序将提示:您想要调试此问题吗?然后您可以进行 JVM Thread Dump。 

JRockit JVM
当发布 JRockit 的 8.1 SP2 版 Service Pack 时,将在该版本中提供相应的选项。该选项在 JRockit 中是 -Djrockit.waitonerror

返回页首

递归性 JSP 错误页和标记
有一些用户已使用 JSP 的下列信息解决了递归性问题:

JSP 错误页:

  1. 在您的 jsp_error 页面内检查,查看是否带有标记 <%@ page errorPage="jsp_error"%>,因为这将导致无限递归。
  2. 去除此标记,并简单打印可能发生的任何异常的堆栈跟踪。
这样可以在错误页面中找到问题。 
  1. 解决此问题之后,就可以查看发送到此页面上的原始错误。

JSP 标记:
  1. 通过检查确定是否有错误的 jsp/servlet login/auth/error 报告代码。
  2. 如果此代码有问题,则纠正此问题也就解决了递归以及崩溃问题。

WebLogic JSP 表单确认标记:
  1. 如果您正在使用 WebLogic JSP 表单验证标记,确保 <wl:form>的 action 属性没有设成包含 <wl:form> 标记的页面,否则将创建一个无限循环而导致堆栈溢出异常

返回页首

调整堆栈大小
另一个可能的解决方法是对 JVM 采用 -Xss参数来增加线程堆栈的大小。但是,如果这是一个递归调用,这样做将不会有帮助,而只会延迟发生不可避免的问题。每个 Java 线程有两个堆栈:一个用于 Java 代码,一个用于 C 代码。此选项可将线程中 C 代码所使用的最大堆栈大小设置为指定的值。有关 -Xss标志的完整定义,请参见以下网址的“Non-Standard Options”部分:http://java.sun.com/j2se/1.3/docs/tooldocs/solaris/java.html

返回页首

Sun 的已知问题
另一个 StackOverFlow问题会产生于来自 java.util 包的 getProperty 调用中。如果发现一个对 java.util.Properties.getProperty(Properties.java:475)的递归调用,这将导致出现 java.lang.StackOverflowError。此问题出现在所有的 JDK 和版本中(1.3.1 或 1.4.1)。这是 JDK 中 Properties()类构造器的问题。Sun 记录了一个错误报告 #4906193:

在代码中不执行此行:
Properties p = new Properties(System.getProperties());
而执行:
Properties p = new Properties();
p = System.getProperties();
以避免所发现的递归调用堆栈跟踪。


此问题在一段时间内出现在特定的 Web 应用程序中(在应用程序的登录部分),且不易向下跟踪。下面是被注释掉的错误行的示例代码。如果在一个简单的独立 java 客户端中使用了该行而未使用之后的两行(本质上它们执行同样的功能),那么您将看到递归的堆栈跟踪。

import java.util.Properties;

public class stacktest {

public static void main(String args[]) {

    int max = 500000;  // or some other large number depending on the stack size

    for ( int i = 0; i < max; i++ ) {
      //Properties p = new Properties(System.getProperties());
      // un-comment the line above and comment the following two lines
      // out to see the recursive stacktrace
      // containing "java.util.Properties.getProperty(Properties.java:475)"
      Properties p = new Properties();
      p = System.getProperties();

      p.put("blah", "blah");
      System.setProperties(p);
    }
    System.out.println("Went through "+max+" iterations, now get a property");
    String s = System.getProperty("some property other than blah");
  }

}

返回页首

是否需要更多帮助?

如果您已经理解这个模式,但仍需要其它帮助,您可以:

  1. http://support.bea.com 上查询 AskBEA(例如使用“StackOverFlow error”),以查找其它已发布的解决方案。
  2. http://support.bea.com 上,向 BEA 的某个新闻组中提出更详细具体的问题。

如果这还不能解决您的问题,并且您拥有有效的技术支持合同,您可以通过登录以下网站来打开支持案例:http://support.bea.com


反馈

请给我们提供您的意见,说明此支持诊断模式“不可恢复的堆栈溢出”一文对您有如何帮助,您需要的任何解释,以及对支持诊断模式的新主题的任何要求。


免责声明:

依据 BEA 与您签署的维护和支持协议条款,BEA Systems, Inc. 在本网站上提供技术技巧和修补程序供您使用。虽然您可以将这些信息和代码与您获得 BEA 授权的软件一起使用,但 BEA 并不对所提供的技术技巧和修补程序做任何形式的担保,无论是明确的还是隐含的。

本文档中引用的任何商标是其各自所有者的财产。有关完整的商标信息,请参考您的产品手册。

返回页首