Collection of DefNewGeneration

Jon Masamitsu jon.masamitsu at
Mon Aug 10 03:03:06 UTC 2015

Look at the code in GenCollectedHeap::gen_process_roots()

  704     older_gens->set_generation(_old_gen);
  705     rem_set()->younger_refs_iterate(_old_gen, older_gens, 
scope->n_threads(     ));
  706     older_gens->reset_generation();

The defNew collect() copies live objects that it finds in the defNew 
(young) generation.
For objects in the young gen that are pointed to from the old 
generation, collect()
uses a remembered set (in the form of a card table).  The card table 
tells the defNew
collect() where to look for objects in the young generation referenced 
from the old


On 8/8/2015 9:50 AM, Abhinav Jangda wrote:
> Hello everyone,
> I was trying to understand how serial generational gc works in 
> Hotspot. I was able to understand how TenuredGeneration is marked 
> using different OopClosures. I can see how beautifully the concept of 
> Visitor Design Pattern has been used.
> But I am having a slight difficulty in understanding how 
> DefNewGeneration works.
> I do understand that DefNewGeneration::collect method is called which 
> then calls GenCollectedHeap::gen_process_strong_roots. This is same as 
> the TenuredGeneration::collect calls 
> GenCollectedHeap::gen_process_strong_roots but in both of these cases 
> the OopClosure are different. In TenuredGeneration::collect, 
> FollowRootClosure (There are 3 closures but let us focus on only one 
> of them) is used and in DefNewGeneration::collect, FastScanClosure is 
> used. Well, the problem starts here.
> In FollowRootClosure::do_oop method, the oop to be traversed is pushed 
> on the marking stack which then is able to follow the contents of this 
> oop. In FastScanClosure there is no such thing. In 
> FastScanClosure::do_oop_work method, the oop is first checked whether 
> it is in this generation and only if it is then oop is transferred to 
> another space/generation. oop's fields are not traversed like they are 
> in FollowRootClosure. Let us suppose the root object is not in the 
> DefNewGeneration but its fields are. So, in this case the fields 
> wouldn't be traversed?
> How, the fields of root objects are traversed in the case of 
> FastScanClosure? If they are traversed by some other way and 
> FastScanClosure use the result of it, then please tell me that.
> Please help me, a small function name or hint should be enough for me.
> Thank You,
> Abhinav

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <>

More information about the hotspot-gc-dev mailing list