javajvmstack-overflow

Error java.lang.StackOverflowError occur if I don't explicitly set -XX:ThreadStackSize


Error java.lang.StackOverflowError occur if I don't explicitly set -XX:ThreadStackSize. As I do some research, the default value of ThreadStackSize is 1024K without explicitly set it. The confusing part is if I explicitly set it to 124K, 256K or 1024K, It will solves the problem.

My environment info:

I have a micro-service using Java, Spring Framework, Docker, Kubernetes. My server environment is using Linux 64bit.

Here is my Java info:

java -XX:+PrintFlagsFinal -version | grep ThreadStackSize
intx CompilerThreadStackSize                  = 1024                                   {pd product} {default}
intx ThreadStackSize                          = 1024                                   {pd product} {default}
intx VMThreadStackSize                        = 1024                                   {pd product} {default}
openjdk version "17.0.8.1" 2023-08-24
OpenJDK Runtime Environment Temurin-17.0.8.1+1 (build 17.0.8.1+1)
OpenJDK 64-Bit Server VM Temurin-17.0.8.1+1 (build 17.0.8.1+1, mixed mode, sharing)

In my source code, I have a deep recursive method which cause this error.

I want to know why this case happen and any official reference documents will be helpful. I want to know the reference to explain it to others.


Solution

  • Your confusion stems from the fact that the default value is 1024, not 1024K, which would be reported as 1048576 in the flags print out.

    The value of the ThreadStackSize setting is in kilobytes. So, the default of 1024 means a stack size of 1 MiB, while setting it to 1024K results in a stack size of 1 GiB (1024 times larger than the default).

    In other words, your deep recursive method requires more than 1 MiB of stack, while it succeeds with 124 MiB of stack (the 124K setting) or higher (the 256K or 256 MiB, and 1024K or 1 GiB values you tried). You may want to consider not using a recursive method, but instead using an iterative approach.

    As an aside, you can also use the -Xss command line option to set the stack size. This option does expect a value in bytes (rounding up to whole kilobytes). The option -XX:ThreadStackSize=1024 is equivalent to -Xss1024k.