DEV Community

Tapas Pal
Tapas Pal

Posted on

Difference Between StackOverflowError and OutOfMemoryError in Java

StackOverflowError occurs when stack memory is exhausted due to
excessive method calls, typically caused by infinite or very deep
recursion. OutOfMemoryError occurs when the JVM cannot allocate
more memory, usually because heap memory is exhausted by excessive
object creation or memory leaks
Enter fullscreen mode Exit fullscreen mode

Java memory mainly has:

1. Stack Memory
2. Heap Memory

JVM Memory
│
├── Stack Memory
│      ├── Method calls
│      ├── Local variables
│      └── Function frames
│
└── Heap Memory
       ├── Objects
       ├── Arrays
       └── Instance data
Enter fullscreen mode Exit fullscreen mode

1. StackOverflowError

What Is It?
stack memory becomes full

Most Common Cause?
Infinite recursion

public class Main {
    static void test() {
        test();
    }
    public static void main(String[] args) {
        test();
    }
}
Enter fullscreen mode Exit fullscreen mode

Final Error

Exception in thread "main"
java.lang.StackOverflowError
Enter fullscreen mode Exit fullscreen mode

Stack Frames Growing and eventually stack full.

TOP
│
├── test()
├── test()
├── test()
├── test()
├── test()
│
BOTTOM
Enter fullscreen mode Exit fullscreen mode

Every method call creates:

  1. stack frame
  2. local variables
  3. return address

Too many frames → overflow.

Common Causes of StackOverflowError

2. OutOfMemoryError

What Is It? Occurs when?
JVM cannot allocate more memory

usually in: heap memory

Most Common Cause : Too many objects

import java.util.ArrayList;
import java.util.List;
public class Main {
    public static void main(String[] args) {
        List<int[]> list = new ArrayList<>();
        while(true) {
            list.add(new int[1000000]);
        }
    }
}
Enter fullscreen mode Exit fullscreen mode

What Happens Internally?
Each loop:

  1. creates huge array
  2. stores in heap
  3. references retained in list

Garbage collector cannot free memory.
Eventually: heap full

Final Error

java.lang.OutOfMemoryError:
Java heap space
Enter fullscreen mode Exit fullscreen mode

Heap Growing and no space left.

Heap
│
├── Object
├── Object
├── Object
├── Object
├── Object
├── Object
│
FULL
Enter fullscreen mode Exit fullscreen mode

Common Causes of OutOfMemoryError

StackOverflowError

  • Usually easier to debug.
  • Stack trace clearly shows recursion.

OutOfMemoryError
Can be very difficult:

  • memory leaks
  • object retention
  • cache problems
  • GC tuning

often require:

  • heap dumps
  • profilers
  • memory analyzers

Important JVM Parameters
Stack Size -Xss

Example: java -Xss2m Main
Increase stack size.

Heap Size -Xmx

Example: java -Xmx2g Main
Increase heap size.

Can StackOverflowError Cause OutOfMemoryError?

Indirectly yes sometimes.
Huge recursion may:

create many objects
trigger memory exhaustion

But normally they are distinct problems.

Why Are These Errors and Not Exceptions?

Because:

  • serious JVM resource exhaustion
  • application usually cannot safely recover

Both extend:

java.lang.Error
Enter fullscreen mode Exit fullscreen mode

not: Exception

Can We Catch Them?

Technically yes:

catch(StackOverflowError e)
Enter fullscreen mode Exit fullscreen mode

or

catch(OutOfMemoryError e)
Enter fullscreen mode Exit fullscreen mode

BUT usually: bad practice

Application state may already be unstable.

Top comments (0)