How does ZGC process objects newly created during concurrent marking?

Stefan Karlsson stefan.karlsson at
Mon Feb 24 19:07:53 UTC 2020

Hi Ralph,

On 2020-02-24 19:12, raell at wrote:
> Hi,
> I'm just curious how ZGC processes objects, that are newly created during concurrent marking:
> Suppose concurrent marking is running, and after object x has been marked, the mutator executes
> x.f = new Object();
> How does ZGC process this case?
> Are the new objects implicitly considered live by using a TAMS (as Shenandoah does)?

We don't use a TAMS, instead we track if ZPages (heap regions) are 
allocated/reused before or after the last mark start. Objects in pages 
allocated after mark start are considered live.

You can see the code for that here:

bool ZMark::try_mark_object(ZMarkCache* cache, uintptr_t addr, bool 
finalizable) {  ZPage* const page = _page_table->get(addr);
if (page->is_allocating()) {
// Newly allocated objects are implicitly marked
return false;
inline bool ZPage::is_allocating() const { return _seqnum == 
ZGlobalSeqNum; } When marking starts we update the ZGlobalSeqNum: 

void ZMark::prepare_mark() { // Increment global sequence number to 
invalidate // marking information for all pages. ZGlobalSeqNum++; And 
when pages are allocated/reused we set its _seqnum; 
void ZPage::reset() {
_seqnum = ZGlobalSeqNum; HTH, StefanK

> Thank you very much!
> Ralph

More information about the zgc-dev mailing list