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 |
ObjectHeader.HeapKind
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.
|
static org.graalvm.word.UnsignedWord |
clearBits(org.graalvm.word.UnsignedWord header)
Clear the object header bits from a header.
|
static DynamicHub |
dynamicHubFromObjectHeader(org.graalvm.word.UnsignedWord header) |
Object |
getForwardedObject(org.graalvm.word.Pointer ptr) |
org.graalvm.word.Pointer |
getForwardingPointer(org.graalvm.word.Pointer objectPointer) |
protected static org.graalvm.word.UnsignedWord |
getHeaderBitsFromHeader(org.graalvm.word.UnsignedWord header) |
protected static org.graalvm.word.UnsignedWord |
getHeaderBitsFromHeaderCarefully(org.graalvm.word.UnsignedWord header) |
long |
getHeaderForImageHeapObject(long value) |
static ObjectHeaderImpl |
getObjectHeaderImpl() |
int |
getReservedBits() |
static boolean |
hasRememberedSet(org.graalvm.word.UnsignedWord header)
Is this the header of an object with a remembered set?
|
void |
initializeHeaderOfNewObject(org.graalvm.word.Pointer objectPointer,
DynamicHub hub,
boolean rememberedSet,
boolean unaligned) |
void |
initializeHeaderOfNewObject(org.graalvm.word.Pointer objectPointer,
DynamicHub hub,
ObjectHeader.HeapKind heapKind) |
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) |
boolean |
isAlignedObject(Object o) |
protected boolean |
isBootImage(Object o) |
boolean |
isBootImageCarefully(Object o) |
boolean |
isBootImageHeader(org.graalvm.word.UnsignedWord header) |
static boolean |
isConsumedHeapChunkZapped(org.graalvm.word.UnsignedWord header) |
boolean |
isForwardedHeader(org.graalvm.word.UnsignedWord header) |
boolean |
isForwardedHeaderCarefully(org.graalvm.word.UnsignedWord header) |
boolean |
isHeapAllocated(Object o) |
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 |
isPointerToForwardedObjectCarefully(org.graalvm.word.Pointer p) |
static boolean |
isProducedHeapChunkZapped(org.graalvm.word.UnsignedWord header) |
protected boolean |
isUnalignedHeader(org.graalvm.word.UnsignedWord header) |
boolean |
isUnalignedObject(Object o) |
Log |
logObjectHeader(Object obj,
Log log) |
static DynamicHub |
readDynamicHubFromObjectCarefully(Object o) |
DynamicHub |
readDynamicHubFromPointer(org.graalvm.word.Pointer ptr) |
protected static org.graalvm.word.UnsignedWord |
readHeaderBitsFromObject(Object o) |
static org.graalvm.word.UnsignedWord |
readHeaderFromObject(Object o) |
static org.graalvm.word.UnsignedWord |
readHeaderFromObjectCarefully(Object o) |
static org.graalvm.word.UnsignedWord |
readHeaderFromPointer(org.graalvm.word.Pointer objectPointer)
Read the header of the object at the specified address.
|
static org.graalvm.word.UnsignedWord |
readHeaderFromPointerCarefully(org.graalvm.word.Pointer p) |
protected void |
setCardRememberedSetAligned(Object o) |
void |
setUnaligned(Object o) |
String |
toStringFromHeader(org.graalvm.word.UnsignedWord header)
Debugging.
|
String |
toStringFromObject(Object o) |
readDynamicHubFromObject
public static ObjectHeaderImpl getObjectHeaderImpl()
public int getReservedBits()
getReservedBits
in class ObjectHeader
public static org.graalvm.word.UnsignedWord readHeaderFromPointer(org.graalvm.word.Pointer objectPointer)
public static org.graalvm.word.UnsignedWord readHeaderFromPointerCarefully(org.graalvm.word.Pointer p)
public static org.graalvm.word.UnsignedWord readHeaderFromObject(Object o)
public static org.graalvm.word.UnsignedWord readHeaderFromObjectCarefully(Object o)
public DynamicHub readDynamicHubFromPointer(org.graalvm.word.Pointer ptr)
readDynamicHubFromPointer
in class ObjectHeader
public static DynamicHub readDynamicHubFromObjectCarefully(Object o)
public static DynamicHub dynamicHubFromObjectHeader(org.graalvm.word.UnsignedWord header)
public void initializeHeaderOfNewObject(org.graalvm.word.Pointer objectPointer, DynamicHub hub, ObjectHeader.HeapKind heapKind)
initializeHeaderOfNewObject
in class ObjectHeader
public void initializeHeaderOfNewObject(org.graalvm.word.Pointer objectPointer, DynamicHub hub, boolean rememberedSet, boolean unaligned)
public static org.graalvm.word.UnsignedWord clearBits(org.graalvm.word.UnsignedWord header)
public static boolean isProducedHeapChunkZapped(org.graalvm.word.UnsignedWord header)
public static boolean isConsumedHeapChunkZapped(org.graalvm.word.UnsignedWord header)
public long getHeaderForImageHeapObject(long value)
getHeaderForImageHeapObject
in class ObjectHeader
public boolean isBootImageCarefully(Object o)
protected boolean isBootImage(Object o)
public boolean isBootImageHeader(org.graalvm.word.UnsignedWord header)
public boolean isForwardedHeader(org.graalvm.word.UnsignedWord header)
public boolean isForwardedHeaderCarefully(org.graalvm.word.UnsignedWord header)
public org.graalvm.word.Pointer getForwardingPointer(org.graalvm.word.Pointer objectPointer)
public Object getForwardedObject(org.graalvm.word.Pointer ptr)
public boolean isNonHeapAllocatedHeader(org.graalvm.word.UnsignedWord header)
public boolean isNonHeapAllocated(Object o)
public boolean isNonHeapAllocatedCarefully(Object o)
public boolean isHeapAllocated(Object o)
public boolean isAlignedObject(Object o)
protected boolean isAlignedHeader(org.graalvm.word.UnsignedWord header)
protected void setCardRememberedSetAligned(Object o)
protected boolean isUnalignedHeader(org.graalvm.word.UnsignedWord header)
public boolean isUnalignedObject(Object o)
public void setUnaligned(Object o)
public 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 isPointerToForwardedObjectCarefully(org.graalvm.word.Pointer p)
protected static org.graalvm.word.UnsignedWord readHeaderBitsFromObject(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)
public String toStringFromHeader(org.graalvm.word.UnsignedWord header)
public static int classifyHeader(org.graalvm.word.UnsignedWord header)