The sizing of classes we use for tracking prerequisites leaves something to be desired:
***** Hotspot Layout Simulation (JDK 15, 32-bit model, 8-byte aligned) org.opendaylight.yangtools.yang.parser.stmt.reactor.ModifierImpl$PhaseFinished object internals: OFF SZ TYPE DESCRIPTION VALUE 0 4 (object header: mark) N/A 4 4 (object header: class) N/A 8 1 boolean AbstractPrerequisite.done N/A 9 3 (alignment/padding gap) 12 4 java.lang.Object AbstractPrerequisite.value N/A 16 4 org.opendaylight.yangtools.yang.parser.stmt.reactor.ModifierImpl AbstractPrerequisite.this$0 N/A 20 4 org.opendaylight.yangtools.yang.parser.stmt.reactor.ModifierImpl PhaseFinished.this$0 N/A Instance size: 24 bytes Space losses: 3 bytes internal + 0 bytes external = 3 bytes total
typically:
***** Hotspot Layout Simulation (JDK 15, 64-bit model, compressed references, compressed class pointers, 8-byte aligned) org.opendaylight.yangtools.yang.parser.stmt.reactor.ModifierImpl$PhaseFinished object internals: OFF SZ TYPE DESCRIPTION VALUE 0 8 (object header: mark) N/A 8 4 (object header: class) N/A 12 1 boolean AbstractPrerequisite.done N/A 13 3 (alignment/padding gap) 16 4 java.lang.Object AbstractPrerequisite.value N/A 20 4 org.opendaylight.yangtools.yang.parser.stmt.reactor.ModifierImpl AbstractPrerequisite.this$0 N/A 24 4 org.opendaylight.yangtools.yang.parser.stmt.reactor.ModifierImpl PhaseFinished.this$0 N/A 28 4 (object alignment gap) Instance size: 32 bytes Space losses: 3 bytes internal + 4 bytes external = 7 bytes total
and also:
***** Hotspot Layout Simulation (JDK 15, 64-bit model, 8-byte aligned) org.opendaylight.yangtools.yang.parser.stmt.reactor.ModifierImpl$PhaseFinished object internals: OFF SZ TYPE DESCRIPTION VALUE 0 8 (object header: mark) N/A 8 8 (object header: class) N/A 16 1 boolean AbstractPrerequisite.done N/A 17 7 (alignment/padding gap) 24 8 java.lang.Object AbstractPrerequisite.value N/A 32 8 org.opendaylight.yangtools.yang.parser.stmt.reactor.ModifierImpl AbstractPrerequisite.this$0 N/A 40 8 org.opendaylight.yangtools.yang.parser.stmt.reactor.ModifierImpl PhaseFinished.this$0 N/A Instance size: 48 bytes Space losses: 7 bytes internal + 0 bytes external = 7 bytes total
This gets even worse in other classes:
***** Hotspot Layout Simulation (JDK 15, 64-bit model, 8-byte aligned) org.opendaylight.yangtools.yang.parser.stmt.reactor.ModifierImpl$PhaseModificationInNamespacePath object internals: OFF SZ TYPE DESCRIPTION VALUE 0 8 (object header: mark) N/A 8 8 (object header: class) N/A 16 1 boolean AbstractPrerequisite.done N/A 17 7 (alignment/padding gap) 24 8 java.lang.Object AbstractPrerequisite.value N/A 32 8 org.opendaylight.yangtools.yang.parser.stmt.reactor.ModifierImpl AbstractPrerequisite.this$0 N/A 40 8 org.opendaylight.yangtools.yang.parser.spi.meta.ModelProcessingPhase AbstractPathPrerequisite.modPhase N/A 48 8 java.lang.Iterable AbstractPathPrerequisite.keys N/A 56 8 java.util.Iterator AbstractPathPrerequisite.it N/A 64 8 org.opendaylight.yangtools.yang.parser.stmt.reactor.ModifierImpl AbstractPathPrerequisite.this$0 N/A 72 8 org.opendaylight.yangtools.yang.parser.stmt.reactor.ModifierImpl PhaseModificationInNamespacePath.this$0 N/A Instance size: 80 bytes Space losses: 7 bytes internal + 0 bytes external = 7 bytes total
The problem is we are using or three fields to track the same outer object reference (".this$0").
Using an explicit field, passing it through constructors and making the classes static results in:
***** Hotspot Layout Simulation (JDK 15, 64-bit model, compressed references, compressed class pointers, 8-byte aligned) org.opendaylight.yangtools.yang.parser.stmt.reactor.ModifierImpl$PhaseFinished object internals: OFF SZ TYPE DESCRIPTION VALUE 0 8 (object header: mark) N/A 8 4 (object header: class) N/A 12 1 boolean AbstractPrerequisite.done N/A 13 3 (alignment/padding gap) 16 4 org.opendaylight.yangtools.yang.parser.stmt.reactor.ModifierImpl AbstractPrerequisite.modifier N/A 20 4 java.lang.Object AbstractPrerequisite.value N/A Instance size: 24 bytes Space losses: 3 bytes internal + 0 bytes external = 3 bytes total
which the same size as 32bit, an improvement of 8 bytes/25%
***** Hotspot Layout Simulation (JDK 15, 64-bit model, 8-byte aligned) org.opendaylight.yangtools.yang.parser.stmt.reactor.ModifierImpl$PhaseFinished object internals: OFF SZ TYPE DESCRIPTION VALUE 0 8 (object header: mark) N/A 8 8 (object header: class) N/A 16 1 boolean AbstractPrerequisite.done N/A 17 7 (alignment/padding gap) 24 8 org.opendaylight.yangtools.yang.parser.stmt.reactor.ModifierImpl AbstractPrerequisite.modifier N/A 32 8 java.lang.Object AbstractPrerequisite.value N/A Instance size: 40 bytes Space losses: 7 bytes internal + 0 bytes external = 7 bytes total
improvement of 8 bytes/16%
***** Hotspot Layout Simulation (JDK 15, 64-bit model, 8-byte aligned) org.opendaylight.yangtools.yang.parser.stmt.reactor.ModifierImpl$PhaseModificationInNamespacePath object internals: OFF SZ TYPE DESCRIPTION VALUE 0 8 (object header: mark) N/A 8 8 (object header: class) N/A 16 1 boolean AbstractPrerequisite.done N/A 17 7 (alignment/padding gap) 24 8 org.opendaylight.yangtools.yang.parser.stmt.reactor.ModifierImpl AbstractPrerequisite.modifier N/A 32 8 java.lang.Object AbstractPrerequisite.value N/A 40 8 org.opendaylight.yangtools.yang.parser.spi.meta.ModelProcessingPhase AbstractPathPrerequisite.modPhase N/A 48 8 java.lang.Iterable AbstractPathPrerequisite.keys N/A 56 8 java.util.Iterator AbstractPathPrerequisite.it N/A Instance size: 64 bytes Space losses: 7 bytes internal + 0 bytes external = 7 bytes total
improvement of 16 bytes/20%