How GC works
Most initial objects allocated in
Eden space
Young generation has two
survivor spaces
Objects that survive GC get moved to the survivor space
Only one survivor space in use at a time
Objects copied between survivor spaces
Minor GC
Minor GC happens when Young generation is full.
A number in the green rectangle is a number of minor GCs which the object has survived.
After minor GC survivor space is swapped, Eden space is cleared and new allocations happen in Eden space.
Major GC
Major GC happens when Old generation is full. It collects old and young generations (actually called Full GC).
Memory allocation
Non realistic and idealistic usecase of one thread (just to demonstrate an idea):
After allocation of memory the pointer (arrow) just incremented (which is very quickly)
Multi threading usecase
Java uses Thread Local Allocation Buffers (TLABs). Each Thread gets its own buffer in the Eden space. This buffers helps to avoid any locking mechanism (locking could have been required because many threads are sharing same heap memory and they need to allocate objects concurrently). Every thread can allocate memory just in given buffer.
Live roots
Live roots are references from
track frames
static variables
JNI (Java Native Interface)
synchronisation monitors
Objects in Young Gen can be references by objects in Old Gen. And such objects should survive GC. The issue is that Young GC scans only Eden and Survive spaces for Root set references. It does not scan Old Gen.
Young GC does not scan Old Gen due to efficiency
. To fix this issue there are Card Tables.
When write to young Gen object happens (I assume from Old Gen), this write goes through Write Barrier (this is a mechanism in JVM). Write Barrier triggers code in JVM, and this code updates an entry in a table. During Minor GC this Card Table is scanned and if there were any changes for particular entry (and entry corresponds to the object in Young Gen) then object in Young Gen survives.
Last updated