- java.lang.Object
-
- sun.misc.Unsafe
-
public final class Unsafe extends Object
A collection of methods for performing low-level, unsafe operations. Although the class and all methods are public, use of this class is limited because only trusted code can obtain instances of it. Note: It is the resposibility of the caller to make sure arguments are checked before methods of this class are called. While some rudimentary checks are performed on the input, the checks are best effort and when performance is an overriding priority, as when methods of this class are optimized by the runtime compiler, some or all checks (if any) may be elided. Hence, the caller must not rely on the checks and corresponding exceptions!- See Also:
getUnsafe()
-
-
Field Summary
Fields Modifier and Type Field Description static intADDRESS_SIZEThe value ofaddressSize()static intARRAY_BOOLEAN_BASE_OFFSETThe value ofarrayBaseOffset(boolean[].class)static intARRAY_BOOLEAN_INDEX_SCALEThe value ofarrayIndexScale(boolean[].class)static intARRAY_BYTE_BASE_OFFSETThe value ofarrayBaseOffset(byte[].class)static intARRAY_BYTE_INDEX_SCALEThe value ofarrayIndexScale(byte[].class)static intARRAY_CHAR_BASE_OFFSETThe value ofarrayBaseOffset(char[].class)static intARRAY_CHAR_INDEX_SCALEThe value ofarrayIndexScale(char[].class)static intARRAY_DOUBLE_BASE_OFFSETThe value ofarrayBaseOffset(double[].class)static intARRAY_DOUBLE_INDEX_SCALEThe value ofarrayIndexScale(double[].class)static intARRAY_FLOAT_BASE_OFFSETThe value ofarrayBaseOffset(float[].class)static intARRAY_FLOAT_INDEX_SCALEThe value ofarrayIndexScale(float[].class)static intARRAY_INT_BASE_OFFSETThe value ofarrayBaseOffset(int[].class)static intARRAY_INT_INDEX_SCALEThe value ofarrayIndexScale(int[].class)static intARRAY_LONG_BASE_OFFSETThe value ofarrayBaseOffset(long[].class)static intARRAY_LONG_INDEX_SCALEThe value ofarrayIndexScale(long[].class)static intARRAY_OBJECT_BASE_OFFSETThe value ofarrayBaseOffset(Object[].class)static intARRAY_OBJECT_INDEX_SCALEThe value ofarrayIndexScale(Object[].class)static intARRAY_SHORT_BASE_OFFSETThe value ofarrayBaseOffset(short[].class)static intARRAY_SHORT_INDEX_SCALEThe value ofarrayIndexScale(short[].class)static intINVALID_FIELD_OFFSETThis constant differs from all results that will ever be returned fromstaticFieldOffset(java.lang.reflect.Field),objectFieldOffset(java.lang.reflect.Field), orarrayBaseOffset(java.lang.Class<?>).
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description intaddressSize()Reports the size in bytes of a native pointer, as stored viaputAddress(long, long).ObjectallocateInstance(Class<?> cls)Allocates an instance but does not run any constructor.longallocateMemory(long bytes)Allocates a new block of native memory, of the given size in bytes.intarrayBaseOffset(Class<?> arrayClass)Reports the offset of the first element in the storage allocation of a given array class.intarrayIndexScale(Class<?> arrayClass)Reports the scale factor for addressing elements in the storage allocation of a given array class.booleancompareAndSwapInt(Object o, long offset, int expected, int x)Atomically updates Java variable toxif it is currently holdingexpected.booleancompareAndSwapLong(Object o, long offset, long expected, long x)Atomically updates Java variable toxif it is currently holdingexpected.booleancompareAndSwapObject(Object o, long offset, Object expected, Object x)Atomically updates Java variable toxif it is currently holdingexpected.voidcopyMemory(long srcAddress, long destAddress, long bytes)Sets all bytes in a given block of memory to a copy of another block.voidcopyMemory(Object srcBase, long srcOffset, Object destBase, long destOffset, long bytes)Sets all bytes in a given block of memory to a copy of another block.Class<?>defineAnonymousClass(Class<?> hostClass, byte[] data, Object[] cpPatches)Defines a class but does not make it known to the class loader or system dictionary.Class<?>defineClass(String name, byte[] b, int off, int len, ClassLoader loader, ProtectionDomain protectionDomain)Tells the VM to define a class, without security checks.voidensureClassInitialized(Class<?> c)Ensures the given class has been initialized.voidfreeMemory(long address)Disposes of a block of native memory, as obtained fromallocateMemory(long)orreallocateMemory(long, long).voidfullFence()Ensures that loads and stores before the fence will not be reordered with loads and stores after the fence.longgetAddress(long address)Fetches a native pointer from a given memory address.intgetAndAddInt(Object o, long offset, int delta)Atomically adds the given value to the current value of a field or array element within the given objectoat the givenoffset.longgetAndAddLong(Object o, long offset, long delta)Atomically adds the given value to the current value of a field or array element within the given objectoat the givenoffset.intgetAndSetInt(Object o, long offset, int newValue)Atomically exchanges the given value with the current value of a field or array element within the given objectoat the givenoffset.longgetAndSetLong(Object o, long offset, long newValue)Atomically exchanges the given value with the current value of a field or array element within the given objectoat the givenoffset.ObjectgetAndSetObject(Object o, long offset, Object newValue)Atomically exchanges the given reference value with the current reference value of a field or array element within the given objectoat the givenoffset.booleangetBoolean(Object o, long offset)booleangetBooleanVolatile(Object o, long offset)Volatile version ofgetBoolean(Object, long)bytegetByte(long address)Fetches a value from a given memory address.bytegetByte(Object o, long offset)bytegetByteVolatile(Object o, long offset)Volatile version ofgetByte(Object, long)chargetChar(long address)chargetChar(Object o, long offset)chargetCharVolatile(Object o, long offset)Volatile version ofgetChar(Object, long)doublegetDouble(long address)doublegetDouble(Object o, long offset)doublegetDoubleVolatile(Object o, long offset)Volatile version ofgetDouble(Object, long)floatgetFloat(long address)floatgetFloat(Object o, long offset)floatgetFloatVolatile(Object o, long offset)Volatile version ofgetFloat(Object, long)intgetInt(long address)intgetInt(Object o, long offset)Fetches a value from a given Java variable.intgetIntVolatile(Object o, long offset)Volatile version ofgetInt(Object, long)intgetLoadAverage(double[] loadavg, int nelems)Gets the load average in the system run queue assigned to the available processors averaged over various periods of time.longgetLong(long address)longgetLong(Object o, long offset)longgetLongVolatile(Object o, long offset)Volatile version ofgetLong(Object, long)ObjectgetObject(Object o, long offset)Fetches a reference value from a given Java variable.ObjectgetObjectVolatile(Object o, long offset)Fetches a reference value from a given Java variable, with volatile load semantics.shortgetShort(long address)shortgetShort(Object o, long offset)shortgetShortVolatile(Object o, long offset)Volatile version ofgetShort(Object, long)static UnsafegetUnsafe()Provides the caller with the capability of performing unsafe operations.voidinvokeCleaner(ByteBuffer directBuffer)Invokes the given direct byte buffer's cleaner, if any.voidloadFence()Ensures that loads before the fence will not be reordered with loads and stores after the fence; a "LoadLoad plus LoadStore barrier".longobjectFieldOffset(Field f)Reports the location of a given field in the storage allocation of its class.intpageSize()Reports the size in bytes of a native memory page (whatever that is).voidpark(boolean isAbsolute, long time)Blocks current thread, returning when a balancingunparkoccurs, or a balancingunparkhas already occurred, or the thread is interrupted, or, if not absolute and time is not zero, the given time nanoseconds have elapsed, or if absolute, the given deadline in milliseconds since Epoch has passed, or spuriously (i.e., returning for no "reason").voidputAddress(long address, long x)Stores a native pointer into a given memory address.voidputBoolean(Object o, long offset, boolean x)voidputBooleanVolatile(Object o, long offset, boolean x)Volatile version ofputBoolean(Object, long, boolean)voidputByte(long address, byte x)Stores a value into a given memory address.voidputByte(Object o, long offset, byte x)voidputByteVolatile(Object o, long offset, byte x)Volatile version ofputByte(Object, long, byte)voidputChar(long address, char x)voidputChar(Object o, long offset, char x)voidputCharVolatile(Object o, long offset, char x)Volatile version ofputChar(Object, long, char)voidputDouble(long address, double x)voidputDouble(Object o, long offset, double x)voidputDoubleVolatile(Object o, long offset, double x)Volatile version ofputDouble(Object, long, double)voidputFloat(long address, float x)voidputFloat(Object o, long offset, float x)voidputFloatVolatile(Object o, long offset, float x)Volatile version ofputFloat(Object, long, float)voidputInt(long address, int x)voidputInt(Object o, long offset, int x)Stores a value into a given Java variable.voidputIntVolatile(Object o, long offset, int x)Volatile version ofputInt(Object, long, int)voidputLong(long address, long x)voidputLong(Object o, long offset, long x)voidputLongVolatile(Object o, long offset, long x)Volatile version ofputLong(Object, long, long)voidputObject(Object o, long offset, Object x)Stores a reference value into a given Java variable.voidputObjectVolatile(Object o, long offset, Object x)Stores a reference value into a given Java variable, with volatile store semantics.voidputOrderedInt(Object o, long offset, int x)Ordered/Lazy version ofputIntVolatile(Object, long, int)voidputOrderedLong(Object o, long offset, long x)Ordered/Lazy version ofputLongVolatile(Object, long, long)voidputOrderedObject(Object o, long offset, Object x)Version ofputObjectVolatile(Object, long, Object)that does not guarantee immediate visibility of the store to other threads.voidputShort(long address, short x)voidputShort(Object o, long offset, short x)voidputShortVolatile(Object o, long offset, short x)Volatile version ofputShort(Object, long, short)longreallocateMemory(long address, long bytes)Resizes a new block of native memory, to the given size in bytes.voidsetMemory(long address, long bytes, byte value)Sets all bytes in a given block of memory to a fixed value (usually zero).voidsetMemory(Object o, long offset, long bytes, byte value)Sets all bytes in a given block of memory to a fixed value (usually zero).booleanshouldBeInitialized(Class<?> c)Detects if the given class may need to be initialized.ObjectstaticFieldBase(Field f)Reports the location of a given static field, in conjunction withstaticFieldOffset(java.lang.reflect.Field).longstaticFieldOffset(Field f)Reports the location of a given static field, in conjunction withstaticFieldBase(java.lang.reflect.Field).voidstoreFence()Ensures that loads and stores before the fence will not be reordered with stores after the fence; a "StoreStore plus LoadStore barrier".voidthrowException(Throwable ee)Throws the exception without telling the verifier.voidunpark(Object thread)Unblocks the given thread blocked onpark, or, if it is not blocked, causes the subsequent call toparknot to block.
-
-
-
Field Detail
-
INVALID_FIELD_OFFSET
public static final int INVALID_FIELD_OFFSET
This constant differs from all results that will ever be returned fromstaticFieldOffset(java.lang.reflect.Field),objectFieldOffset(java.lang.reflect.Field), orarrayBaseOffset(java.lang.Class<?>).- See Also:
- Constant Field Values
-
ARRAY_BOOLEAN_BASE_OFFSET
public static final int ARRAY_BOOLEAN_BASE_OFFSET
The value ofarrayBaseOffset(boolean[].class)
-
ARRAY_BYTE_BASE_OFFSET
public static final int ARRAY_BYTE_BASE_OFFSET
The value ofarrayBaseOffset(byte[].class)
-
ARRAY_SHORT_BASE_OFFSET
public static final int ARRAY_SHORT_BASE_OFFSET
The value ofarrayBaseOffset(short[].class)
-
ARRAY_CHAR_BASE_OFFSET
public static final int ARRAY_CHAR_BASE_OFFSET
The value ofarrayBaseOffset(char[].class)
-
ARRAY_INT_BASE_OFFSET
public static final int ARRAY_INT_BASE_OFFSET
The value ofarrayBaseOffset(int[].class)
-
ARRAY_LONG_BASE_OFFSET
public static final int ARRAY_LONG_BASE_OFFSET
The value ofarrayBaseOffset(long[].class)
-
ARRAY_FLOAT_BASE_OFFSET
public static final int ARRAY_FLOAT_BASE_OFFSET
The value ofarrayBaseOffset(float[].class)
-
ARRAY_DOUBLE_BASE_OFFSET
public static final int ARRAY_DOUBLE_BASE_OFFSET
The value ofarrayBaseOffset(double[].class)
-
ARRAY_OBJECT_BASE_OFFSET
public static final int ARRAY_OBJECT_BASE_OFFSET
The value ofarrayBaseOffset(Object[].class)
-
ARRAY_BOOLEAN_INDEX_SCALE
public static final int ARRAY_BOOLEAN_INDEX_SCALE
The value ofarrayIndexScale(boolean[].class)
-
ARRAY_BYTE_INDEX_SCALE
public static final int ARRAY_BYTE_INDEX_SCALE
The value ofarrayIndexScale(byte[].class)
-
ARRAY_SHORT_INDEX_SCALE
public static final int ARRAY_SHORT_INDEX_SCALE
The value ofarrayIndexScale(short[].class)
-
ARRAY_CHAR_INDEX_SCALE
public static final int ARRAY_CHAR_INDEX_SCALE
The value ofarrayIndexScale(char[].class)
-
ARRAY_INT_INDEX_SCALE
public static final int ARRAY_INT_INDEX_SCALE
The value ofarrayIndexScale(int[].class)
-
ARRAY_LONG_INDEX_SCALE
public static final int ARRAY_LONG_INDEX_SCALE
The value ofarrayIndexScale(long[].class)
-
ARRAY_FLOAT_INDEX_SCALE
public static final int ARRAY_FLOAT_INDEX_SCALE
The value ofarrayIndexScale(float[].class)
-
ARRAY_DOUBLE_INDEX_SCALE
public static final int ARRAY_DOUBLE_INDEX_SCALE
The value ofarrayIndexScale(double[].class)
-
ARRAY_OBJECT_INDEX_SCALE
public static final int ARRAY_OBJECT_INDEX_SCALE
The value ofarrayIndexScale(Object[].class)
-
ADDRESS_SIZE
public static final int ADDRESS_SIZE
The value ofaddressSize()
-
-
Method Detail
-
getUnsafe
public static Unsafe getUnsafe()
Provides the caller with the capability of performing unsafe operations.The returned
Unsafeobject should be carefully guarded by the caller, since it can be used to read and write data at arbitrary memory addresses. It must never be passed to untrusted code.Most methods in this class are very low-level, and correspond to a small number of hardware instructions (on typical machines). Compilers are encouraged to optimize these methods accordingly.
Here is a suggested idiom for using unsafe operations:
(It may assist compilers to make the local variableclass MyTrustedClass { private static final Unsafe unsafe = Unsafe.getUnsafe(); ... private long myCountAddress = ...; public int getCount() { return unsafe.getByte(myCountAddress); } }final.)- Throws:
SecurityException- if the class loader of the caller class is not in the system domain in which all permissions are granted.
-
getInt
public int getInt(Object o, long offset)
Fetches a value from a given Java variable. More specifically, fetches a field or array element within the given objectoat the given offset, or (ifois null) from the memory address whose numerical value is the given offset.The results are undefined unless one of the following cases is true:
- The offset was obtained from
objectFieldOffset(java.lang.reflect.Field)on theFieldof some Java field and the object referred to byois of a class compatible with that field's class. - The offset and object reference
o(either null or non-null) were both obtained viastaticFieldOffset(java.lang.reflect.Field)andstaticFieldBase(java.lang.reflect.Field)(respectively) from the reflectiveFieldrepresentation of some Java field. - The object referred to by
ois an array, and the offset is an integer of the formB+N*S, whereNis a valid index into the array, andBandSare the values obtained byarrayBaseOffset(java.lang.Class<?>)andarrayIndexScale(java.lang.Class<?>)(respectively) from the array's class. The value referred to is theNth element of the array.
If one of the above cases is true, the call references a specific Java variable (field or array element). However, the results are undefined if that variable is not in fact of the type returned by this method.
This method refers to a variable by means of two parameters, and so it provides (in effect) a double-register addressing mode for Java variables. When the object reference is null, this method uses its offset as an absolute address. This is similar in operation to methods such as
getInt(long), which provide (in effect) a single-register addressing mode for non-Java variables. However, because Java variables may have a different layout in memory from non-Java variables, programmers should not assume that these two addressing modes are ever equivalent. Also, programmers should remember that offsets from the double-register addressing mode cannot be portably confused with longs used in the single-register addressing mode.- Parameters:
o- Java heap object in which the variable resides, if any, else nulloffset- indication of where the variable resides in a Java heap object, if any, else a memory address locating the variable statically- Returns:
- the value fetched from the indicated Java variable
- Throws:
RuntimeException- No defined exceptions are thrown, not evenNullPointerException
- The offset was obtained from
-
putInt
public void putInt(Object o, long offset, int x)
Stores a value into a given Java variable.The first two parameters are interpreted exactly as with
getInt(Object, long)to refer to a specific Java variable (field or array element). The given value is stored into that variable.The variable must be of the same type as the method parameter
x.- Parameters:
o- Java heap object in which the variable resides, if any, else nulloffset- indication of where the variable resides in a Java heap object, if any, else a memory address locating the variable staticallyx- the value to store into the indicated Java variable- Throws:
RuntimeException- No defined exceptions are thrown, not evenNullPointerException
-
getObject
public Object getObject(Object o, long offset)
Fetches a reference value from a given Java variable.- See Also:
getInt(Object, long)
-
putObject
public void putObject(Object o, long offset, Object x)
Stores a reference value into a given Java variable.Unless the reference
xbeing stored is either null or matches the field type, the results are undefined. If the referenceois non-null, card marks or other store barriers for that object (if the VM requires them) are updated.- See Also:
putInt(Object, long, int)
-
getBoolean
public boolean getBoolean(Object o, long offset)
- See Also:
getInt(Object, long)
-
putBoolean
public void putBoolean(Object o, long offset, boolean x)
- See Also:
putInt(Object, long, int)
-
getByte
public byte getByte(Object o, long offset)
- See Also:
getInt(Object, long)
-
putByte
public void putByte(Object o, long offset, byte x)
- See Also:
putInt(Object, long, int)
-
getShort
public short getShort(Object o, long offset)
- See Also:
getInt(Object, long)
-
putShort
public void putShort(Object o, long offset, short x)
- See Also:
putInt(Object, long, int)
-
getChar
public char getChar(Object o, long offset)
- See Also:
getInt(Object, long)
-
putChar
public void putChar(Object o, long offset, char x)
- See Also:
putInt(Object, long, int)
-
getLong
public long getLong(Object o, long offset)
- See Also:
getInt(Object, long)
-
putLong
public void putLong(Object o, long offset, long x)
- See Also:
putInt(Object, long, int)
-
getFloat
public float getFloat(Object o, long offset)
- See Also:
getInt(Object, long)
-
putFloat
public void putFloat(Object o, long offset, float x)
- See Also:
putInt(Object, long, int)
-
getDouble
public double getDouble(Object o, long offset)
- See Also:
getInt(Object, long)
-
putDouble
public void putDouble(Object o, long offset, double x)
- See Also:
putInt(Object, long, int)
-
getByte
public byte getByte(long address)
Fetches a value from a given memory address. If the address is zero, or does not point into a block obtained fromallocateMemory(long), the results are undefined.- See Also:
allocateMemory(long)
-
putByte
public void putByte(long address, byte x)Stores a value into a given memory address. If the address is zero, or does not point into a block obtained fromallocateMemory(long), the results are undefined.- See Also:
getByte(long)
-
getShort
public short getShort(long address)
- See Also:
getByte(long)
-
putShort
public void putShort(long address, short x)- See Also:
putByte(long, byte)
-
getChar
public char getChar(long address)
- See Also:
getByte(long)
-
putChar
public void putChar(long address, char x)- See Also:
putByte(long, byte)
-
getInt
public int getInt(long address)
- See Also:
getByte(long)
-
putInt
public void putInt(long address, int x)- See Also:
putByte(long, byte)
-
getLong
public long getLong(long address)
- See Also:
getByte(long)
-
putLong
public void putLong(long address, long x)- See Also:
putByte(long, byte)
-
getFloat
public float getFloat(long address)
- See Also:
getByte(long)
-
putFloat
public void putFloat(long address, float x)- See Also:
putByte(long, byte)
-
getDouble
public double getDouble(long address)
- See Also:
getByte(long)
-
putDouble
public void putDouble(long address, double x)- See Also:
putByte(long, byte)
-
getAddress
public long getAddress(long address)
Fetches a native pointer from a given memory address. If the address is zero, or does not point into a block obtained fromallocateMemory(long), the results are undefined.If the native pointer is less than 64 bits wide, it is extended as an unsigned number to a Java long. The pointer may be indexed by any given byte offset, simply by adding that offset (as a simple integer) to the long representing the pointer. The number of bytes actually read from the target address may be determined by consulting
addressSize().- See Also:
allocateMemory(long)
-
putAddress
public void putAddress(long address, long x)Stores a native pointer into a given memory address. If the address is zero, or does not point into a block obtained fromallocateMemory(long), the results are undefined.The number of bytes actually written at the target address may be determined by consulting
addressSize().- See Also:
getAddress(long)
-
allocateMemory
public long allocateMemory(long bytes)
Allocates a new block of native memory, of the given size in bytes. The contents of the memory are uninitialized; they will generally be garbage. The resulting native pointer will never be zero, and will be aligned for all value types. Dispose of this memory by callingfreeMemory(long), or resize it withreallocateMemory(long, long). Note: It is the resposibility of the caller to make sure arguments are checked before the methods are called. While some rudimentary checks are performed on the input, the checks are best effort and when performance is an overriding priority, as when methods of this class are optimized by the runtime compiler, some or all checks (if any) may be elided. Hence, the caller must not rely on the checks and corresponding exceptions!- Throws:
RuntimeException- if the size is negative or too large for the native size_t typeOutOfMemoryError- if the allocation is refused by the system- See Also:
getByte(long),putByte(long, byte)
-
reallocateMemory
public long reallocateMemory(long address, long bytes)Resizes a new block of native memory, to the given size in bytes. The contents of the new block past the size of the old block are uninitialized; they will generally be garbage. The resulting native pointer will be zero if and only if the requested size is zero. The resulting native pointer will be aligned for all value types. Dispose of this memory by callingfreeMemory(long), or resize it withreallocateMemory(long, long). The address passed to this method may be null, in which case an allocation will be performed. Note: It is the resposibility of the caller to make sure arguments are checked before the methods are called. While some rudimentary checks are performed on the input, the checks are best effort and when performance is an overriding priority, as when methods of this class are optimized by the runtime compiler, some or all checks (if any) may be elided. Hence, the caller must not rely on the checks and corresponding exceptions!- Throws:
RuntimeException- if the size is negative or too large for the native size_t typeOutOfMemoryError- if the allocation is refused by the system- See Also:
allocateMemory(long)
-
setMemory
public void setMemory(Object o, long offset, long bytes, byte value)
Sets all bytes in a given block of memory to a fixed value (usually zero).This method determines a block's base address by means of two parameters, and so it provides (in effect) a double-register addressing mode, as discussed in
getInt(Object,long). When the object reference is null, the offset supplies an absolute base address.The stores are in coherent (atomic) units of a size determined by the address and length parameters. If the effective address and length are all even modulo 8, the stores take place in 'long' units. If the effective address and length are (resp.) even modulo 4 or 2, the stores take place in units of 'int' or 'short'. Note: It is the resposibility of the caller to make sure arguments are checked before the methods are called. While some rudimentary checks are performed on the input, the checks are best effort and when performance is an overriding priority, as when methods of this class are optimized by the runtime compiler, some or all checks (if any) may be elided. Hence, the caller must not rely on the checks and corresponding exceptions!
- Throws:
RuntimeException- if any of the arguments is invalid- Since:
- 1.7
-
setMemory
public void setMemory(long address, long bytes, byte value)Sets all bytes in a given block of memory to a fixed value (usually zero). This provides a single-register addressing mode, as discussed ingetInt(Object,long).Equivalent to
setMemory(null, address, bytes, value).
-
copyMemory
public void copyMemory(Object srcBase, long srcOffset, Object destBase, long destOffset, long bytes)
Sets all bytes in a given block of memory to a copy of another block.This method determines each block's base address by means of two parameters, and so it provides (in effect) a double-register addressing mode, as discussed in
getInt(Object,long). When the object reference is null, the offset supplies an absolute base address.The transfers are in coherent (atomic) units of a size determined by the address and length parameters. If the effective addresses and length are all even modulo 8, the transfer takes place in 'long' units. If the effective addresses and length are (resp.) even modulo 4 or 2, the transfer takes place in units of 'int' or 'short'. Note: It is the resposibility of the caller to make sure arguments are checked before the methods are called. While some rudimentary checks are performed on the input, the checks are best effort and when performance is an overriding priority, as when methods of this class are optimized by the runtime compiler, some or all checks (if any) may be elided. Hence, the caller must not rely on the checks and corresponding exceptions!
- Throws:
RuntimeException- if any of the arguments is invalid- Since:
- 1.7
-
copyMemory
public void copyMemory(long srcAddress, long destAddress, long bytes)Sets all bytes in a given block of memory to a copy of another block. This provides a single-register addressing mode, as discussed ingetInt(Object,long). Equivalent tocopyMemory(null, srcAddress, null, destAddress, bytes).
-
freeMemory
public void freeMemory(long address)
Disposes of a block of native memory, as obtained fromallocateMemory(long)orreallocateMemory(long, long). The address passed to this method may be null, in which case no action is taken. Note: It is the resposibility of the caller to make sure arguments are checked before the methods are called. While some rudimentary checks are performed on the input, the checks are best effort and when performance is an overriding priority, as when methods of this class are optimized by the runtime compiler, some or all checks (if any) may be elided. Hence, the caller must not rely on the checks and corresponding exceptions!- Throws:
RuntimeException- if any of the arguments is invalid- See Also:
allocateMemory(long)
-
objectFieldOffset
public long objectFieldOffset(Field f)
Reports the location of a given field in the storage allocation of its class. Do not expect to perform any sort of arithmetic on this offset; it is just a cookie which is passed to the unsafe heap memory accessors.Any given field will always have the same offset and base, and no two distinct fields of the same class will ever have the same offset and base.
As of 1.4.1, offsets for fields are represented as long values, although the Sun JVM does not use the most significant 32 bits. However, JVM implementations which store static fields at absolute addresses can use long offsets and null base pointers to express the field locations in a form usable by
getInt(Object,long). Therefore, code which will be ported to such JVMs on 64-bit platforms must preserve all bits of static field offsets.- See Also:
getInt(Object, long)
-
staticFieldOffset
public long staticFieldOffset(Field f)
Reports the location of a given static field, in conjunction withstaticFieldBase(java.lang.reflect.Field).Do not expect to perform any sort of arithmetic on this offset; it is just a cookie which is passed to the unsafe heap memory accessors.
Any given field will always have the same offset, and no two distinct fields of the same class will ever have the same offset.
As of 1.4.1, offsets for fields are represented as long values, although the Sun JVM does not use the most significant 32 bits. It is hard to imagine a JVM technology which needs more than a few bits to encode an offset within a non-array object, However, for consistency with other methods in this class, this method reports its result as a long value.
- See Also:
getInt(Object, long)
-
staticFieldBase
public Object staticFieldBase(Field f)
Reports the location of a given static field, in conjunction withstaticFieldOffset(java.lang.reflect.Field).Fetch the base "Object", if any, with which static fields of the given class can be accessed via methods like
getInt(Object, long). This value may be null. This value may refer to an object which is a "cookie", not guaranteed to be a real Object, and it should not be used in any way except as argument to the get and put routines in this class.
-
shouldBeInitialized
public boolean shouldBeInitialized(Class<?> c)
Detects if the given class may need to be initialized. This is often needed in conjunction with obtaining the static field base of a class.- Returns:
- false only if a call to
ensureClassInitializedwould have no effect
-
ensureClassInitialized
public void ensureClassInitialized(Class<?> c)
Ensures the given class has been initialized. This is often needed in conjunction with obtaining the static field base of a class.
-
arrayBaseOffset
public int arrayBaseOffset(Class<?> arrayClass)
Reports the offset of the first element in the storage allocation of a given array class. IfarrayIndexScale(java.lang.Class<?>)returns a non-zero value for the same class, you may use that scale factor, together with this base offset, to form new offsets to access elements of arrays of the given class.- See Also:
getInt(Object, long),putInt(Object, long, int)
-
arrayIndexScale
public int arrayIndexScale(Class<?> arrayClass)
Reports the scale factor for addressing elements in the storage allocation of a given array class. However, arrays of "narrow" types will generally not work properly with accessors likegetByte(Object, long), so the scale factor for such classes is reported as zero.
-
addressSize
public int addressSize()
Reports the size in bytes of a native pointer, as stored viaputAddress(long, long). This value will be either 4 or 8. Note that the sizes of other primitive types (as stored in native memory blocks) is determined fully by their information content.
-
pageSize
public int pageSize()
Reports the size in bytes of a native memory page (whatever that is). This value will always be a power of two.
-
defineClass
public Class<?> defineClass(String name, byte[] b, int off, int len, ClassLoader loader, ProtectionDomain protectionDomain)
Tells the VM to define a class, without security checks. By default, the class loader and protection domain come from the caller's class.
-
defineAnonymousClass
public Class<?> defineAnonymousClass(Class<?> hostClass, byte[] data, Object[] cpPatches)
Defines a class but does not make it known to the class loader or system dictionary.For each CP entry, the corresponding CP patch must either be null or have the a format that matches its tag:
- Integer, Long, Float, Double: the corresponding wrapper object type from java.lang
- Utf8: a string (must have suitable syntax if used as signature or name)
- Class: any java.lang.Class object
- String: any object (not just a java.lang.String)
- InterfaceMethodRef: (NYI) a method handle to invoke on that call site's arguments
- Parameters:
hostClass- context for linkage, access control, protection domain, and class loaderdata- bytes of a class filecpPatches- where non-null entries exist, they replace corresponding CP entries in data
-
allocateInstance
public Object allocateInstance(Class<?> cls) throws InstantiationException
Allocates an instance but does not run any constructor. Initializes the class if it has not yet been.- Throws:
InstantiationException
-
throwException
public void throwException(Throwable ee)
Throws the exception without telling the verifier.
-
compareAndSwapObject
public final boolean compareAndSwapObject(Object o, long offset, Object expected, Object x)
Atomically updates Java variable toxif it is currently holdingexpected.This operation has memory semantics of a
volatileread and write. Corresponds to C11 atomic_compare_exchange_strong.- Returns:
trueif successful
-
compareAndSwapInt
public final boolean compareAndSwapInt(Object o, long offset, int expected, int x)
Atomically updates Java variable toxif it is currently holdingexpected.This operation has memory semantics of a
volatileread and write. Corresponds to C11 atomic_compare_exchange_strong.- Returns:
trueif successful
-
compareAndSwapLong
public final boolean compareAndSwapLong(Object o, long offset, long expected, long x)
Atomically updates Java variable toxif it is currently holdingexpected.This operation has memory semantics of a
volatileread and write. Corresponds to C11 atomic_compare_exchange_strong.- Returns:
trueif successful
-
getObjectVolatile
public Object getObjectVolatile(Object o, long offset)
Fetches a reference value from a given Java variable, with volatile load semantics. Otherwise identical togetObject(Object, long)
-
putObjectVolatile
public void putObjectVolatile(Object o, long offset, Object x)
Stores a reference value into a given Java variable, with volatile store semantics. Otherwise identical toputObject(Object, long, Object)
-
getIntVolatile
public int getIntVolatile(Object o, long offset)
Volatile version ofgetInt(Object, long)
-
putIntVolatile
public void putIntVolatile(Object o, long offset, int x)
Volatile version ofputInt(Object, long, int)
-
getBooleanVolatile
public boolean getBooleanVolatile(Object o, long offset)
Volatile version ofgetBoolean(Object, long)
-
putBooleanVolatile
public void putBooleanVolatile(Object o, long offset, boolean x)
Volatile version ofputBoolean(Object, long, boolean)
-
getByteVolatile
public byte getByteVolatile(Object o, long offset)
Volatile version ofgetByte(Object, long)
-
putByteVolatile
public void putByteVolatile(Object o, long offset, byte x)
Volatile version ofputByte(Object, long, byte)
-
getShortVolatile
public short getShortVolatile(Object o, long offset)
Volatile version ofgetShort(Object, long)
-
putShortVolatile
public void putShortVolatile(Object o, long offset, short x)
Volatile version ofputShort(Object, long, short)
-
getCharVolatile
public char getCharVolatile(Object o, long offset)
Volatile version ofgetChar(Object, long)
-
putCharVolatile
public void putCharVolatile(Object o, long offset, char x)
Volatile version ofputChar(Object, long, char)
-
getLongVolatile
public long getLongVolatile(Object o, long offset)
Volatile version ofgetLong(Object, long)
-
putLongVolatile
public void putLongVolatile(Object o, long offset, long x)
Volatile version ofputLong(Object, long, long)
-
getFloatVolatile
public float getFloatVolatile(Object o, long offset)
Volatile version ofgetFloat(Object, long)
-
putFloatVolatile
public void putFloatVolatile(Object o, long offset, float x)
Volatile version ofputFloat(Object, long, float)
-
getDoubleVolatile
public double getDoubleVolatile(Object o, long offset)
Volatile version ofgetDouble(Object, long)
-
putDoubleVolatile
public void putDoubleVolatile(Object o, long offset, double x)
Volatile version ofputDouble(Object, long, double)
-
putOrderedObject
public void putOrderedObject(Object o, long offset, Object x)
Version ofputObjectVolatile(Object, long, Object)that does not guarantee immediate visibility of the store to other threads. This method is generally only useful if the underlying field is a Java volatile (or if an array cell, one that is otherwise only accessed using volatile accesses). Corresponds to C11 atomic_store_explicit(..., memory_order_release).
-
putOrderedInt
public void putOrderedInt(Object o, long offset, int x)
Ordered/Lazy version ofputIntVolatile(Object, long, int)
-
putOrderedLong
public void putOrderedLong(Object o, long offset, long x)
Ordered/Lazy version ofputLongVolatile(Object, long, long)
-
unpark
public void unpark(Object thread)
Unblocks the given thread blocked onpark, or, if it is not blocked, causes the subsequent call toparknot to block. Note: this operation is "unsafe" solely because the caller must somehow ensure that the thread has not been destroyed. Nothing special is usually required to ensure this when called from Java (in which there will ordinarily be a live reference to the thread) but this is not nearly-automatically so when calling from native code.- Parameters:
thread- the thread to unpark.
-
park
public void park(boolean isAbsolute, long time)Blocks current thread, returning when a balancingunparkoccurs, or a balancingunparkhas already occurred, or the thread is interrupted, or, if not absolute and time is not zero, the given time nanoseconds have elapsed, or if absolute, the given deadline in milliseconds since Epoch has passed, or spuriously (i.e., returning for no "reason"). Note: This operation is in the Unsafe class only becauseunparkis, so it would be strange to place it elsewhere.
-
getLoadAverage
public int getLoadAverage(double[] loadavg, int nelems)Gets the load average in the system run queue assigned to the available processors averaged over various periods of time. This method retrieves the givennelemsamples and assigns to the elements of the givenloadavgarray. The system imposes a maximum of 3 samples, representing averages over the last 1, 5, and 15 minutes, respectively.- Parameters:
loadavg- an array of double of size nelemsnelems- the number of samples to be retrieved and must be 1 to 3.- Returns:
- the number of samples actually retrieved; or -1 if the load average is unobtainable.
-
getAndAddInt
public final int getAndAddInt(Object o, long offset, int delta)
Atomically adds the given value to the current value of a field or array element within the given objectoat the givenoffset.- Parameters:
o- object/array to update the field/element inoffset- field/element offsetdelta- the value to add- Returns:
- the previous value
- Since:
- 1.8
-
getAndAddLong
public final long getAndAddLong(Object o, long offset, long delta)
Atomically adds the given value to the current value of a field or array element within the given objectoat the givenoffset.- Parameters:
o- object/array to update the field/element inoffset- field/element offsetdelta- the value to add- Returns:
- the previous value
- Since:
- 1.8
-
getAndSetInt
public final int getAndSetInt(Object o, long offset, int newValue)
Atomically exchanges the given value with the current value of a field or array element within the given objectoat the givenoffset.- Parameters:
o- object/array to update the field/element inoffset- field/element offsetnewValue- new value- Returns:
- the previous value
- Since:
- 1.8
-
getAndSetLong
public final long getAndSetLong(Object o, long offset, long newValue)
Atomically exchanges the given value with the current value of a field or array element within the given objectoat the givenoffset.- Parameters:
o- object/array to update the field/element inoffset- field/element offsetnewValue- new value- Returns:
- the previous value
- Since:
- 1.8
-
getAndSetObject
public final Object getAndSetObject(Object o, long offset, Object newValue)
Atomically exchanges the given reference value with the current reference value of a field or array element within the given objectoat the givenoffset.- Parameters:
o- object/array to update the field/element inoffset- field/element offsetnewValue- new value- Returns:
- the previous value
- Since:
- 1.8
-
loadFence
public void loadFence()
Ensures that loads before the fence will not be reordered with loads and stores after the fence; a "LoadLoad plus LoadStore barrier". Corresponds to C11 atomic_thread_fence(memory_order_acquire) (an "acquire fence"). A pure LoadLoad fence is not provided, since the addition of LoadStore is almost always desired, and most current hardware instructions that provide a LoadLoad barrier also provide a LoadStore barrier for free.- Since:
- 1.8
-
storeFence
public void storeFence()
Ensures that loads and stores before the fence will not be reordered with stores after the fence; a "StoreStore plus LoadStore barrier". Corresponds to C11 atomic_thread_fence(memory_order_release) (a "release fence"). A pure StoreStore fence is not provided, since the addition of LoadStore is almost always desired, and most current hardware instructions that provide a StoreStore barrier also provide a LoadStore barrier for free.- Since:
- 1.8
-
fullFence
public void fullFence()
Ensures that loads and stores before the fence will not be reordered with loads and stores after the fence. Implies the effects of both loadFence() and storeFence(), and in addition, the effect of a StoreLoad barrier. Corresponds to C11 atomic_thread_fence(memory_order_seq_cst).- Since:
- 1.8
-
invokeCleaner
public void invokeCleaner(ByteBuffer directBuffer)
Invokes the given direct byte buffer's cleaner, if any.- Parameters:
directBuffer- a direct byte buffer- Throws:
NullPointerException- ifdirectBufferis nullIllegalArgumentException- ifdirectBufferis non-direct, or is aslice, or is aduplicate- Since:
- 9
-
-