How ZGC allocates memory for the Java heap