javamemory-managementgarbage-collectionjvmobjectsize

Size of Huge Objects directly allocated to Old Generation


Recently I've been reading about object allocations in different generations in Java. Most of the times new objects are allocated in Eden (part of Young Generation) and then they're promoted to Old Generation if any of the following criteria are met.

(1) Object's age reached the tenuring threshold
(2) Survivor space (to) is full when objects are being copied from Eden (or) another survivor space(from)

But there's also a special case in which objects are directly allocated in the Old Generation instead of being promoted from the young generation. This happens when the object that we're trying to create is huge (possibly of the order of few MBs).


Is there any way to know the size/limit of the huge/humongous objects? I'm aware of the humongous objects criteria for G1 Garbage Collector. I just want to know the size limit before or in Java 6.

Thanks for your time :)


Solution

  • The maximum size of an object HotSpot JVM may allocate in young generation is nearly as large as the size of Eden (YoungGen minus two Survivor spaces).

    That's how the allocation rougly looks like:

    1. Use Thread Local Allocation Buffer (TLAB), if tlab_top + size <= tlab_end
      This is the fastest path. Allocation is just the tlab_top pointer increment.
    2. If TLAB is almost full, create a new TLAB in Eden and retry in a fresh TLAB.
    3. If TLAB remaining space is not enough but is still to big to discard, try to allocate an object directly in Eden. Allocation in Eden is also a pointer increment (eden_top + size <= eden_end) using atomic operation, since Eden is shared between all threads.
    4. If allocation in Eden fails, a minor collection typically occurs.
    5. If there is not enough space in Eden even after Young GC, an attempt to allocate directly in Old generation is made.