Overview
You can configure two stack size parameters for Java code:
- The -Xss parameter for the native stack, used by Java code
to process calls made into native libraries.
- The -Xoss parameter for the Java stack, used for Java
method calls to track the state of variables.
For each thread in the JVM, there is a Java stack and a native stack.
Default values include:
Platform
|
-Xoss (Java stack size)
|
-Xss (native stack size)
|
Windows |
Default: 400 KB Minimum: 100 KB Maximum:
None specified |
Default: 512 KB Minimum: 96 KB Maximum:
None specified |
Ask the following questions:
- Does a stack overflow exist in native code or in Java
code?
- View the Java stack trace associated with the stack overflow, if this
information is available.
- Be aware that the information that is returned when the stack overflow
occurs is dependent upon the platform.
- Realize that in many cases it is not possible to get complete or
usable information.
- Does there appear to be an infinite loop?
- Verify if the pattern of calls repeats. Is a recursive loop of calls
occurring?
- View the source code or use a debugger to determine if a deep stack is
normal, even with some repeat calls in the stack trace.
- If there does not appear to be a loop, increase either the Java stack
or the native stack to resolve the problem.
Diagnosing a stack overflow on Windows
systems
The symptoms of a stack overflow include:
- A StackOverFlowError in the system out or system error
file. This error is not always a terminating exception. The Java process
might continue to run.
- A very deep stack that does not include a stack overflow.
This situation is typically a terminating exception, or the result of
requesting a thread dump (Java core).
- Stack overflow usually results in a JVM crash. When that
occurs, a DrWtsn32 log is usually generated and contains errors such as:
DrWtsn32.log: (Search on pid=10492)
Exception number: c00000fd (stack overflow
FAULT ->708b53ff 51 push ecx
708b5400 52 push edx
708b5401 ff1504ffbd70 call dword ptr 70bdff04 ds:70bd
708b5407 83c40c add esp,0xc
- jdump output usually identifies the existence of a stack
overflow in a thread.
For example, this is output from a native stack overflow.
*** CHECK *** possible thread stack overflow (FFFFED1C) by r15 (00000000)
*** ERROR *** stack trace possibly aborted (000018A0 left untraced)
A second example:
*** ERROR *** definite thread stack overflow (31BA3FE4 < 31BA4000)
- When a stack overflow occurs, the javacore file might
identify a stack overflow in a thread.
Example:
"Worker#12" (TID:0x82925a78, sys_thread_t:0x322bdb18, state:R, native
ID:0x2022) prio=5
----- Native Stack -----
unable to backtrace through native code - iar 0x7 not in text area (sp is
0x32ee0e00)
What to do with a Java stack or native
overflow
To fix a Java stack or native overflow:
- Increase the size of the appropriate stack incrementally.
- Test.
- Repeat these actions until the error is eliminated. To change this
stack value from the default size, specify a new value in the command line
arguments of the WebSphere Application Server.
Notes:
- The suggested starting point is double the default stack
size.
- Remember that increasing the stack size increases the
memory required for each thread.
- The appropriate value can change when the Java 2 SDK is
upgraded.
- Increasing the stack is not the solution if
OutOfMemoryError exceptions occur with an increased stack size.
- If increasing the stack sizes does not work, the following
options might still resolve the problem:
|