public class ObjectHeaderImpl extends ObjectHeader
The bits have two major purposes: figuring out whether, and how, to copy an object during collections; and (in the CardRememberedSet heap) whether, and how, to maintain remembered sets on oop stores. Since oop stores are (I think) way more common than collections, in this set of bits I'm optimizing for distinguishing needing from not needing remembered set maintenance. On top of that, I have to be able to figure out whether, and how, to copy an object.
One constant through all of this is that objects created by the fast-path don't want to do anything with these bits, so the state 0 0 0 means whatever the fast-path allocation does.
A low-order 0 bit will mean that the object does not need any remembered set maintenance. That leaves me 2 bits to distinguish objects in aligned chunks from objects in unaligned chunks (both of which do move), from native image heap objects and system allocator objects (both of which don't move).
A low-order 1 bit will mean that the object does need remembered set maintenance. That leaves me 2 bits to distinguish objects in aligned chunks from object in unaligned chunks.
Since I need a bit pattern to mark forwarding pointers, I'll lump those with the bits that need remembered set maintenance.
With those guidelines, here are the interpretation of the bits.
| Bit value | Remembered set | Storage | Details | 0 0 0 | No | Aligned | The default setting, used by objects allocated in the young space on the fast-path. |
|---|---|---|---|
| 0 0 1 | Yes | Aligned | Modest objects in the old space. |
| 0 1 0 | No | Unaligned | Used for large arrays in the young space. |
| 0 1 1 | Yes | Unaligned | Large arrays in the old space. I don't distinguish arrays of primitives from arrays of objects. There won't be any oop stores to the arrays of primitives. |
| 1 0 0 | No | System | Objects allocated by system allocators. |
| 1 0 1 | -- | -- | This value is unused. |
| 1 1 0 | No | native image | Objects allocated in the native image heap. | 1 1 1 | -- | -- | The upper bits are a forwarding pointer |
BITS_CLEAR, BITS_MASK| Modifier and Type | Method and Description |
|---|---|
static int |
classifyHeader(org.graalvm.word.UnsignedWord header)
Debugging: Classifies a header so I can decide how much to trust it.
|
org.graalvm.word.WordBase |
formatHub(DynamicHub hub,
boolean rememberedSet,
boolean unaligned) |
Object |
getForwardedObject(org.graalvm.word.Pointer ptr)
Extract a forwarded Object from a header.
|
org.graalvm.word.Pointer |
getForwardingPointer(org.graalvm.word.Pointer objectPointer)
Extract a forwarding Pointer from a header.
|
protected static org.graalvm.word.UnsignedWord |
getHeaderBitsFromHeader(org.graalvm.word.UnsignedWord header)
This method returns the header bits from a header that has already been read from an object.
|
protected static org.graalvm.word.UnsignedWord |
getHeaderBitsFromHeaderCarefully(org.graalvm.word.UnsignedWord header) |
static ObjectHeaderImpl |
getObjectHeaderImpl() |
static boolean |
hasRememberedSet(org.graalvm.word.UnsignedWord header)
Is this the header of an object with a remembered set?
|
protected static boolean |
headerBitsEqual(org.graalvm.word.UnsignedWord headerBits,
org.graalvm.word.UnsignedWord specifiedBits)
Test if an object header has the specified bits.
|
protected void |
installForwardingPointer(Object original,
Object copy)
Install in an Object, a forwarding pointer to a different Object.
|
protected boolean |
isAlignedHeader(org.graalvm.word.UnsignedWord header) |
protected boolean |
isAlignedHeaderBits(org.graalvm.word.UnsignedWord headerBits) |
boolean |
isAlignedObject(Object o) |
protected boolean |
isBootImage(Object o) |
protected boolean |
isBootImageCarefully(Object o) |
protected boolean |
isBootImageHeaderBits(org.graalvm.word.UnsignedWord headerBits) |
protected boolean |
isCardRememberedSetAlignedHeaderBits(org.graalvm.word.UnsignedWord headerBits) |
protected boolean |
isCardRememberedSetUnalignedHeaderBits(org.graalvm.word.UnsignedWord headerBits) |
static boolean |
isConsumedHeapChunkZapped(org.graalvm.word.UnsignedWord header) |
boolean |
isForwardedHeader(org.graalvm.word.UnsignedWord header)
Is this header a forwarding pointer?
|
protected boolean |
isForwardedHeaderBits(org.graalvm.word.UnsignedWord headerBits)
Is this header a forwarding pointer?
|
boolean |
isHeapAllocated(Object o) |
protected boolean |
isHeapAllocatedHeaderBits(org.graalvm.word.UnsignedWord headerBits) |
static boolean |
isHeapObjectUnaligned(org.graalvm.word.UnsignedWord header)
Is this the header of an unaligned heap object?
Note: the header can only be from a heap object.
|
boolean |
isNonHeapAllocated(Object o) |
boolean |
isNonHeapAllocatedCarefully(Object o) |
boolean |
isNonHeapAllocatedHeader(org.graalvm.word.UnsignedWord header) |
protected boolean |
isNonHeapAllocatedHeaderBits(org.graalvm.word.UnsignedWord headerBits) |
protected boolean |
isNoRememberedSetAlignedHeaderBits(org.graalvm.word.UnsignedWord headerBits) |
protected boolean |
isNoRememberedSetUnalignedHeaderBits(org.graalvm.word.UnsignedWord headerBits) |
protected boolean |
isPointerToForwardedObject(org.graalvm.word.Pointer p)
Predicate on a Pointer to a header.
|
protected boolean |
isPointerToForwardedObjectCarefully(org.graalvm.word.Pointer p) |
static boolean |
isProducedHeapChunkZapped(org.graalvm.word.UnsignedWord header) |
protected boolean |
isUnalignedHeader(org.graalvm.word.UnsignedWord header) |
protected boolean |
isUnalignedHeaderBits(org.graalvm.word.UnsignedWord headerBits) |
boolean |
isUnalignedObject(Object o) |
Log |
objectHeaderToLog(Object obj,
Log log)
Log an object header.
|
static DynamicHub |
readDynamicHubFromObjectCarefully(Object o) |
protected static org.graalvm.word.UnsignedWord |
readHeaderBitsFromObject(Object o)
This method reads the header from the object and returns the header bits.
|
protected static org.graalvm.word.UnsignedWord |
readHeaderBitsFromObjectCarefully(Object o)
This method reads the header from the object and returns the header bits.
|
static org.graalvm.word.UnsignedWord |
readHeaderFromObjectCarefully(Object o) |
static org.graalvm.word.UnsignedWord |
readHeaderFromPointerCarefully(org.graalvm.word.Pointer p) |
long |
setBootImageOnLong(long l)
A special method for use during native image construction.
|
protected void |
setCardRememberedSetAligned(Object o) |
protected void |
setCardRememberedSetUnaligned(Object o) |
protected static void |
setHeaderBitsOnObject(Object o,
org.graalvm.word.UnsignedWord headerBits)
Set the specified bits in the header of an object.
|
void |
setUnaligned(Object o)
Objects are aligned by default.
|
String |
toStringFromHeader(org.graalvm.word.UnsignedWord header)
Debugging.
|
clearBits, dynamicHubFromObjectHeader, getHubOffset, getReferenceSize, initializeHeaderOfNewObject, readDynamicHubFromObject, readHeaderFromObject, readHeaderFromPointer, toStringFromObject, writeHeaderToObjectpublic static ObjectHeaderImpl getObjectHeaderImpl()
public static boolean isProducedHeapChunkZapped(org.graalvm.word.UnsignedWord header)
public static boolean isConsumedHeapChunkZapped(org.graalvm.word.UnsignedWord header)
public static org.graalvm.word.UnsignedWord readHeaderFromPointerCarefully(org.graalvm.word.Pointer p)
public static org.graalvm.word.UnsignedWord readHeaderFromObjectCarefully(Object o)
public static DynamicHub readDynamicHubFromObjectCarefully(Object o)
public org.graalvm.word.WordBase formatHub(DynamicHub hub, boolean rememberedSet, boolean unaligned)
protected boolean isNoRememberedSetAlignedHeaderBits(org.graalvm.word.UnsignedWord headerBits)
protected boolean isNoRememberedSetUnalignedHeaderBits(org.graalvm.word.UnsignedWord headerBits)
protected boolean isBootImage(Object o)
protected boolean isBootImageCarefully(Object o)
protected boolean isBootImageHeaderBits(org.graalvm.word.UnsignedWord headerBits)
public long setBootImageOnLong(long l)
ObjectHeadersetBootImageOnLong in class ObjectHeaderprotected boolean isCardRememberedSetAlignedHeaderBits(org.graalvm.word.UnsignedWord headerBits)
protected void setCardRememberedSetAligned(Object o)
protected boolean isCardRememberedSetUnalignedHeaderBits(org.graalvm.word.UnsignedWord headerBits)
protected void setCardRememberedSetUnaligned(Object o)
protected boolean isForwardedHeaderBits(org.graalvm.word.UnsignedWord headerBits)
public boolean isForwardedHeader(org.graalvm.word.UnsignedWord header)
ObjectHeaderisForwardedHeader in class ObjectHeaderpublic org.graalvm.word.Pointer getForwardingPointer(org.graalvm.word.Pointer objectPointer)
getForwardingPointer in class ObjectHeaderpublic Object getForwardedObject(org.graalvm.word.Pointer ptr)
getForwardedObject in class ObjectHeaderpublic void setUnaligned(Object o)
ObjectHeadersetUnaligned in class ObjectHeaderprotected boolean isNonHeapAllocatedHeaderBits(org.graalvm.word.UnsignedWord headerBits)
public boolean isNonHeapAllocatedHeader(org.graalvm.word.UnsignedWord header)
isNonHeapAllocatedHeader in class ObjectHeaderpublic boolean isNonHeapAllocated(Object o)
isNonHeapAllocated in class ObjectHeaderpublic boolean isNonHeapAllocatedCarefully(Object o)
public boolean isHeapAllocated(Object o)
isHeapAllocated in class ObjectHeaderprotected boolean isHeapAllocatedHeaderBits(org.graalvm.word.UnsignedWord headerBits)
protected boolean isAlignedHeaderBits(org.graalvm.word.UnsignedWord headerBits)
protected boolean isAlignedHeader(org.graalvm.word.UnsignedWord header)
public boolean isAlignedObject(Object o)
isAlignedObject in class ObjectHeaderprotected boolean isUnalignedHeaderBits(org.graalvm.word.UnsignedWord headerBits)
protected boolean isUnalignedHeader(org.graalvm.word.UnsignedWord header)
public boolean isUnalignedObject(Object o)
isUnalignedObject in class ObjectHeaderpublic static boolean hasRememberedSet(org.graalvm.word.UnsignedWord header)
header - the full header to be examined.public static boolean isHeapObjectUnaligned(org.graalvm.word.UnsignedWord header)
header - the full header to be examined.protected void installForwardingPointer(Object original, Object copy)
protected boolean isPointerToForwardedObject(org.graalvm.word.Pointer p)
protected boolean isPointerToForwardedObjectCarefully(org.graalvm.word.Pointer p)
public String toStringFromHeader(org.graalvm.word.UnsignedWord header)
toStringFromHeader in class ObjectHeaderprotected static org.graalvm.word.UnsignedWord readHeaderBitsFromObject(Object o)
protected static org.graalvm.word.UnsignedWord readHeaderBitsFromObjectCarefully(Object o)
protected static org.graalvm.word.UnsignedWord getHeaderBitsFromHeader(org.graalvm.word.UnsignedWord header)
protected static org.graalvm.word.UnsignedWord getHeaderBitsFromHeaderCarefully(org.graalvm.word.UnsignedWord header)
protected static void setHeaderBitsOnObject(Object o, org.graalvm.word.UnsignedWord headerBits)
protected static boolean headerBitsEqual(org.graalvm.word.UnsignedWord headerBits,
org.graalvm.word.UnsignedWord specifiedBits)
public static int classifyHeader(org.graalvm.word.UnsignedWord header)