When you start JVM you define how much RAM it can use use for processing. JVM divides this into certain memory locations for its processing purpose, two of those are
Stack
& Heap
OutOfMemoryError
is related to Heap. If you have large objects (or) referenced objects in memeory, then you will see OutofMemoryError
. If you have strong references to objects, then GC can't clean the memory space allocated for that object. When JVM tries to allocate memory for new object and not enough space available it throws OutofMemoryError
because it can't allocate required amount of memory.
How to avoid: Make sure un-necessary objects are available for GC
StackOverflowError
is related to stack. All your local variables and methods calls related data will be on stack. For every method call one stack frame will be created and local as well as method call related data will be placed inside the stack frame. Once method execution is completed, stack frame will be removed. ONE WAY to reproduce this is, have infinite loop for method call, you will see stackoverflow
error, because stack frame will be populated with method data for every call but it won't be freed (removed).
How to avoid Make sure method calls are ending (not in infinite loop)
=======================================================
Imagine you have a function like the following
public void f(int x) {
return f(x + 1);
}
When you'll call it the call will call
f
again and again and again. At each call a bit of information is stored on the stack. Since the stack is limited in size you will get a StackOverflowError
.
Now imagine the following code:
for (int i = 1; i > 0; i++)
vector.add(new BigObject());
where
BigObject
is a normal Java object. As you see, the loop never terminates. Each allocation is done on the heap thus it will be filled with BigObject
s and you will get an OutOfMemoryError
.
To recap:
OutOfMemoryError
is thrown when you are creating objectsStackOverflowError
is thrown when you are calling functions