Java Memory Management
When does the garbage collector free up heap memory?
All is taken care of by JVM
Algorithm used by GC: Mark & Sweep
Mark: JVM mark those objects which are being referenced (Has Connection to Stack Memory).
Sweep: JVM sweep those objects which are no longer be used or referenced.
Normal Sweeping: It sweeps unmarked (red colored) objects and keep the gaps as it is. This might result OutOfMemoryError.
OutOfMemoryError:
Sweeping with compacting: It compacts the remaining gaps after sweeping unmarked objects. This is better than normal sweeping.
Sweeping with copying: It copies the marked objects instead of removing and compacting objects. It then makes original memory empty.
Different types of Memory:
Heap Memory:
Young generation : Copying objects from young generation to old generation. This is expensive operation.
a. Eden Space: New objects are created in Eden Space and as soon as it reaches a certain threshold, GC starts and moves objects still alive to the survivor space and cleaining up the Eden Space.
b. Survivor Space: When GC comes by then it moves all the alive objects to Old generation cleaning up the survivor space.
Old generation
Non-heap memory:
- Permanent-generation (Metaspace) or PermGen:
Types of Garbage Collectors:
Serial GC:
It uses mark and copy for Young generation & mark sweep compact for Old generation.
It runs on a single thread.
Parallel GC:
It uses mask and copy for Young generation & mark sweep compact for Old generation.
It runs on multiple threads.
Concurrent Mark Sweep GC:
It uses mark and copy for Young generation & mark sweep compact for Old generation.
It runs on multiple threads.
Garbage-First (G1) GC:
Divides heap into small regions
Keep track of amount of live and dead objects
Aims for shortest pauses possible
Runs on multiple threads
Z GC:
Sims for max 10ms pauses
Reference coloring
Sweep and copy
Load barriers
Runs on multiple threads
JVM Tuning:
JVM Tuning is typically the last step to improve the performance of an application
Before JVM tuning as yourself the following questions:
Is the memory functioning all right?
Is the latency all right?
Is the throughput normal?
Metaspace:
Once it reaches its limits, it expands
Set a miximum size
Set a threshold for GC
Set minimum and maximum free ratio
How to prevent memory leak / OutOfMemoryError in JVM ?
Set the objects to null in certain specific situations
Close resources such as streams, file connection, db connections
Avoid string concats; use string builder instead
Careful with static collections holding objects
Overwrite hashCode and equals (especially when custom objects get added to hash sets)