Package io.netty.util.internal
Class PlatformDependent
- java.lang.Object
-
- io.netty.util.internal.PlatformDependent
-
public final class PlatformDependent extends java.lang.ObjectUtility that detects various properties specific to the current runtime environment, such as Java version and the availability of thesun.misc.Unsafeobject.You can disable the use of
sun.misc.Unsafeif you specify the system property io.netty.noUnsafe.
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description private static classPlatformDependent.Mpsc
-
Field Summary
Fields Modifier and Type Field Description private static intADDRESS_SIZEstatic booleanBIG_ENDIAN_NATIVE_ORDERprivate static intBIT_MODEprivate static longBYTE_ARRAY_BASE_OFFSETprivate static booleanCAN_ENABLE_TCP_NODELAY_BY_DEFAULTprivate static CleanerCLEANERprivate static booleanDIRECT_BUFFER_PREFERREDprivate static java.util.concurrent.atomic.AtomicLongDIRECT_MEMORY_COUNTERprivate static longDIRECT_MEMORY_LIMITprivate static booleanEXPLICIT_NO_PREFER_DIRECTprivate static booleanHAS_ALLOCATE_UNINIT_ARRAYprivate static booleanIGNORE_EXPENSIVE_CLEANprivate static booleanIS_IVKVM_DOT_NETprivate static booleanIS_J9_JVMprivate static booleanIS_OSXprivate static booleanIS_WINDOWSprivate static booleanJFRprivate static CleanerLEGACY_CLEANERprivate static java.lang.StringLINUX_ID_LIKE_PREFIXprivate static java.lang.StringLINUX_ID_PREFIXprivate static java.util.Set<java.lang.String>LINUX_OS_CLASSIFIERSprivate static InternalLoggerloggerprivate static intMAX_ALLOWED_MPSC_CAPACITYprivate static longMAX_DIRECT_MEMORYprivate static java.util.regex.PatternMAX_DIRECT_MEMORY_SIZE_ARG_PATTERNprivate static booleanMAYBE_SUPER_USERprivate static intMIN_MAX_MPSC_CAPACITYprivate static intMPSC_CHUNK_SIZEprivate static CleanerNOOPprivate static java.lang.StringNORMALIZED_ARCHprivate static java.lang.StringNORMALIZED_OSprivate static java.io.FileTMPDIRprivate static java.lang.ThrowableUNSAFE_UNAVAILABILITY_CAUSEprivate static booleanVAR_HANDLE
-
Constructor Summary
Constructors Modifier Constructor Description privatePlatformDependent()
-
Method Summary
All Methods Static Methods Concrete Methods Deprecated Methods Modifier and Type Method Description static java.nio.ByteBufferabsolutePut(java.nio.ByteBuffer dst, int dstOffset, byte[] src, int srcOffset, int length)static java.nio.ByteBufferabsolutePut(java.nio.ByteBuffer dst, int dstOffset, java.nio.ByteBuffer src, int srcOffset, int length)private static voidaddClassifier(java.util.Set<java.lang.String> dest, java.lang.String... maybeClassifiers)Adds only those classifier strings to dest which are present in allowed.(package private) static voidaddFilesystemOsClassifiers(java.util.Set<java.lang.String> availableClassifiers)(package private) static booleanaddPropertyOsClassifiers(java.util.Set<java.lang.String> availableClassifiers)static intaddressSize()Return the address size of the OS.private static intaddressSize0()static longalign(long value, int alignment)static java.nio.ByteBufferalignDirectBuffer(java.nio.ByteBuffer buffer, int alignment)static CleanableDirectBufferallocateDirect(int capacity)Allocate a directByteBufferof the given capacity, and return it alongside its deallocation mechanism.static CleanableDirectBufferallocateDirect(int capacity, boolean permitExpensiveClean)Allocate a directByteBufferof the given capacity, and return it alongside its deallocation mechanism.static longallocateMemory(long size)static byte[]allocateUninitializedArray(int size)static intbitMode()Returns the bit mode of the current VM (usually 32 or 64.)private static intbitMode0()static longbyteArrayBaseOffset()private static longbyteArrayBaseOffset0()static booleancanEnableTcpNoDelayByDefault()Returnstrueif and only if it is fine to enable TCP_NODELAY socket option by default.static booleancanReliabilyFreeDirectBuffers()Returntrueif the selected cleaner can free direct buffers in a controlled way.static booleancanUnalignedAccess()trueif multi-byte access at arbitrary offsets is possible, either natively throughUnsafeor viaVarHandlewhere the JVM handles alignment and byte ordering internally.static booleancompareAndSwapInt(java.lang.Object object, long fieldOffset, int expected, int value)static voidcopyMemory(byte[] src, int srcIndex, byte[] dst, int dstIndex, long length)static voidcopyMemory(byte[] src, int srcIndex, long dstAddr, long length)static voidcopyMemory(long srcAddr, byte[] dst, int dstIndex, long length)static voidcopyMemory(long srcAddr, long dstAddr, long length)static java.io.FilecreateTempFile(java.lang.String prefix, java.lang.String suffix, java.io.File directory)(package private) static voiddecrementMemoryCounter(int capacity)static java.nio.ByteBufferdirectBuffer(long memoryAddress, int size)static longdirectBufferAddress(java.nio.ByteBuffer buffer)Obtain the native memory address of the given direct byte buffer, or throw an exception if it's not possible.static booleandirectBufferPreferred()Returnstrueif the platform has reliable low-level direct buffer access API and a user has not specified-Dio.netty.noPreferDirectoption.static booleanequals(byte[] bytes1, int startPos1, byte[] bytes2, int startPos2, int length)Compare twobytearrays for equality.static intequalsConstantTime(byte[] bytes1, int startPos1, byte[] bytes2, int startPos2, int length)Compare twobytearrays for equality without leaking timing information.private static booleanequalsSafe(byte[] bytes1, int startPos1, byte[] bytes2, int startPos2, int length)static longestimateMaxDirectMemory()Compute an estimate of the maximum amount of direct memory available to this JVM.static VarHandlefindVarHandleOfIntField(java.lang.invoke.MethodHandles.Lookup lookup, java.lang.Class<?> type, java.lang.String fieldName)static voidfreeDirectBuffer(java.nio.ByteBuffer buffer)Deprecated.Use theCleanableDirectBuffer.clean()fromallocateDirect(int)instead.static voidfreeMemory(long address)static intgetAndAddInt(java.lang.Object object, long fieldOffset, int delta)static bytegetByte(byte[] data, int index)static bytegetByte(byte[] data, long index)static bytegetByte(long address)static java.lang.ClassLoadergetClassLoader(java.lang.Class<?> clazz)Return theClassLoaderfor the givenClass.static java.lang.ClassLoadergetContextClassLoader()Return the contextClassLoaderfor the currentThread.static intgetInt(byte[] data, int index)static intgetInt(int[] data, long index)static intgetInt(long address)static intgetInt(java.lang.Object object, long fieldOffset)private static intgetIntSafe(byte[] bytes, int offset)static longgetLong(byte[] data, int index)static longgetLong(long address)static longgetLong(long[] data, long index)private static longgetLongSafe(byte[] bytes, int offset)private static java.util.regex.PatterngetMaxDirectMemorySizeArgPattern()static java.lang.ObjectgetObject(java.lang.Object object, long fieldOffset)static shortgetShort(byte[] data, int index)static shortgetShort(long address)private static shortgetShortSafe(byte[] bytes, int offset)static java.lang.ClassLoadergetSystemClassLoader()Return the systemClassLoader.static java.lang.ThrowablegetUnsafeUnavailabilityCause()Return the reason (if any) whysun.misc.Unsafewas not available.static intgetVolatileInt(java.lang.Object object, long fieldOffset)static booleanhasAlignDirectByteBuffer()static booleanhasDirectBufferNoCleanerConstructor()static booleanhasDirectByteBufferAddress(java.nio.ByteBuffer buffer)Check if it is possible to calldirectBufferAddress(ByteBuffer)on the given buffer.static inthashCodeAscii(byte[] bytes, int startPos, int length)Calculate a hash code of a byte array assuming ASCII character encoding.static inthashCodeAscii(java.lang.CharSequence bytes)Calculate a hash code of a byte array assuming ASCII character encoding.private static inthashCodeAsciiCompute(java.lang.CharSequence value, int offset, int hash)Identical toPlatformDependent0.hashCodeAsciiCompute(long, int)but forCharSequence.(package private) static inthashCodeAsciiSafe(byte[] bytes, int startPos, int length)Package private for testing purposes only!private static inthashCodeAsciiSanitizeByte(char value)Identical toPlatformDependent0.hashCodeAsciiSanitize(byte)but forCharSequence.private static inthashCodeAsciiSanitizeInt(java.lang.CharSequence value, int offset)Identical toPlatformDependent0.hashCodeAsciiSanitize(int)but forCharSequence.private static inthashCodeAsciiSanitizeShort(java.lang.CharSequence value, int offset)Identical toPlatformDependent0.hashCodeAsciiSanitize(short)but forCharSequence.(package private) static booleanhasJctoolsVarHandle()static booleanhasUnsafe()Returntrueifsun.misc.Unsafewas found on the classpath and can be used for accelerated direct memory access.static booleanhasVarHandle()(package private) static voidincrementMemoryCounter(int capacity)private static booleaninitializeVarHandle()static VarHandleintBeArrayView()static VarHandleintBeByteBufferView()static VarHandleintLeArrayView()static VarHandleintLeByteBufferView()private static booleanisAllowedClassifier(java.lang.String classifier)static booleanisAndroid()Returnstrueif and only if the current platform is Androidstatic booleanisExplicitNoPreferDirect()Returnstrueif user has specified-Dio.netty.noPreferDirect=trueoption.static booleanisIkvmDotNet()private static booleanisIkvmDotNet0()static booleanisJ9Jvm()private static booleanisJ9Jvm0()static booleanisJfrEnabled()Check if JFR events are supported on this platform.static booleanisOsx()Returntrueif the JVM is running on OSX / MacOSprivate static booleanisOsx0()static booleanisUnaligned()trueif and only if the platform supports unaligned access.static booleanisVirtualThread(java.lang.Thread thread)static booleanisWindows()Returntrueif the JVM is running on Windowsprivate static booleanisWindows0()static booleanisZero(byte[] bytes, int startPos, int length)Determine if a subsection of an array is zero.private static booleanisZeroSafe(byte[] bytes, int startPos, int length)static intjavaVersion()Return the version of Java under which this library is used.static VarHandlelongBeArrayView()static VarHandlelongBeByteBufferView()static VarHandlelongLeArrayView()static VarHandlelongLeByteBufferView()static longmaxDirectMemory()Returns the maximum memory reserved for direct buffer allocation.static booleanmaybeSuperUser()Returntrueif the current user may be a super-user.private static booleanmaybeSuperUser0()static <C> java.util.Deque<C>newConcurrentDeque()Returns a new concurrentDeque.static <K,V>
java.util.concurrent.ConcurrentMap<K,V>newConcurrentHashMap()Deprecated.please use new ConcurrentHashMap() directly. static <K,V>
java.util.concurrent.ConcurrentMap<K,V>newConcurrentHashMap(int initialCapacity)Deprecated.please use new ConcurrentHashMap() directly. static <K,V>
java.util.concurrent.ConcurrentMap<K,V>newConcurrentHashMap(int initialCapacity, float loadFactor)Deprecated.please use new ConcurrentHashMap() directly. static <K,V>
java.util.concurrent.ConcurrentMap<K,V>newConcurrentHashMap(int initialCapacity, float loadFactor, int concurrencyLevel)Deprecated.please use new ConcurrentHashMap() directly. static <K,V>
java.util.concurrent.ConcurrentMap<K,V>newConcurrentHashMap(java.util.Map<? extends K,? extends V> map)Deprecated.please use new ConcurrentHashMap() directly. static <T> java.util.Queue<T>newFixedMpmcQueue(int capacity)Create a newQueuewhich is safe to use for multiple producers (different threads) and multiple consumers with the given fixescapacity.static <T> java.util.Queue<T>newFixedMpscQueue(int capacity)Create a newQueuewhich is safe to use for multiple producers (different threads) and a single consumer (one thread!) with the given fixescapacity.static <T> java.util.Queue<T>newFixedMpscUnpaddedQueue(int capacity)Create a new un-paddedQueuewhich is safe to use for multiple producers (different threads) and a single consumer (one thread!) with the given fixescapacity.
This should be preferred tonewFixedMpscQueue(int)when the queue is not to be heavily contended.static LongCounternewLongCounter()Deprecated.please useLongAdderinstead.static <T> java.util.Queue<T>newMpscQueue()Create a newQueuewhich is safe to use for multiple producers (different threads) and a single consumer (one thread!).static <T> java.util.Queue<T>newMpscQueue(int maxCapacity)Create a newQueuewhich is safe to use for multiple producers (different threads) and a single consumer (one thread!).static <T> java.util.Queue<T>newMpscQueue(int chunkSize, int maxCapacity)Create a newQueuewhich is safe to use for multiple producers (different threads) and a single consumer (one thread!).static <T> java.util.Queue<T>newSpscQueue()Create a newQueuewhich is safe to use for single producer (one thread!) and a single consumer (one thread!).private static java.lang.Stringnormalize(java.lang.String value)private static java.lang.StringnormalizeArch(java.lang.String value)static java.lang.StringnormalizedArch()static java.util.Set<java.lang.String>normalizedLinuxClassifiers()static java.lang.StringnormalizedOs()private static java.lang.StringnormalizeOs(java.lang.String value)private static java.lang.StringnormalizeOsReleaseVariableValue(java.lang.String value)static longobjectFieldOffset(java.lang.reflect.Field field)static java.nio.ByteBufferoffsetSlice(java.nio.ByteBuffer buffer, int index, int length)private static booleanprocessOsReleaseFile(java.lang.String osReleaseFileName, java.util.Set<java.lang.String> availableClassifiers)static voidputByte(byte[] data, int index, byte value)static voidputByte(long address, byte value)static voidputByte(java.lang.Object data, long offset, byte value)static voidputInt(byte[] data, int index, int value)static voidputInt(long address, int value)static voidputLong(byte[] data, int index, long value)static voidputLong(long address, long value)static voidputObject(java.lang.Object o, long offset, java.lang.Object x)static voidputOrderedInt(java.lang.Object object, long fieldOffset, int value)static voidputShort(byte[] data, int index, short value)static voidputShort(long address, short value)static CleanableDirectBufferreallocateDirect(CleanableDirectBuffer buffer, int newCapacity)Reallocate a direct buffer with the given new capacity.static longreallocateMemory(long address, long newSize)(package private) static voidsafeConstructPutInt(java.lang.Object object, long fieldOffset, int value)static voidsetMemory(byte[] dst, int dstIndex, long bytes, byte value)static voidsetMemory(long address, long bytes, byte value)static VarHandleshortBeArrayView()static VarHandleshortBeByteBufferView()static VarHandleshortLeArrayView()static VarHandleshortLeByteBufferView()static voidsplittableRandomNextBytes(java.util.SplittableRandom rng, byte[] data)static java.util.RandomthreadLocalRandom()Deprecated.Use ThreadLocalRandom.current() instead.static voidthrowException(java.lang.Throwable t)Raises an exception bypassing compiler checks for checked exceptions.static java.io.Filetmpdir()Returns the temporary directory.private static java.io.Filetmpdir0()private static java.io.FiletoDirectory(java.lang.String path)private static inttoIntExact(long value)private static java.lang.ThrowableunsafeUnavailabilityCause0()static longusedDirectMemory()Returns the current memory reserved for direct buffer allocation.static booleanuseDirectBufferNoCleaner()static booleanuseVarHandleForMultiByteAccess()trueifVarHandleshould be used for multi-byte access.
-
-
-
Field Detail
-
logger
private static final InternalLogger logger
-
MAX_DIRECT_MEMORY_SIZE_ARG_PATTERN
private static java.util.regex.Pattern MAX_DIRECT_MEMORY_SIZE_ARG_PATTERN
-
MAYBE_SUPER_USER
private static final boolean MAYBE_SUPER_USER
-
CAN_ENABLE_TCP_NODELAY_BY_DEFAULT
private static final boolean CAN_ENABLE_TCP_NODELAY_BY_DEFAULT
-
UNSAFE_UNAVAILABILITY_CAUSE
private static final java.lang.Throwable UNSAFE_UNAVAILABILITY_CAUSE
-
DIRECT_BUFFER_PREFERRED
private static final boolean DIRECT_BUFFER_PREFERRED
-
EXPLICIT_NO_PREFER_DIRECT
private static final boolean EXPLICIT_NO_PREFER_DIRECT
-
MAX_DIRECT_MEMORY
private static final long MAX_DIRECT_MEMORY
-
MPSC_CHUNK_SIZE
private static final int MPSC_CHUNK_SIZE
- See Also:
- Constant Field Values
-
MIN_MAX_MPSC_CAPACITY
private static final int MIN_MAX_MPSC_CAPACITY
- See Also:
- Constant Field Values
-
MAX_ALLOWED_MPSC_CAPACITY
private static final int MAX_ALLOWED_MPSC_CAPACITY
- See Also:
- Constant Field Values
-
BYTE_ARRAY_BASE_OFFSET
private static final long BYTE_ARRAY_BASE_OFFSET
-
TMPDIR
private static final java.io.File TMPDIR
-
BIT_MODE
private static final int BIT_MODE
-
NORMALIZED_ARCH
private static final java.lang.String NORMALIZED_ARCH
-
NORMALIZED_OS
private static final java.lang.String NORMALIZED_OS
-
LINUX_OS_CLASSIFIERS
private static final java.util.Set<java.lang.String> LINUX_OS_CLASSIFIERS
-
IS_WINDOWS
private static final boolean IS_WINDOWS
-
IS_OSX
private static final boolean IS_OSX
-
IS_J9_JVM
private static final boolean IS_J9_JVM
-
IS_IVKVM_DOT_NET
private static final boolean IS_IVKVM_DOT_NET
-
ADDRESS_SIZE
private static final int ADDRESS_SIZE
-
DIRECT_MEMORY_COUNTER
private static final java.util.concurrent.atomic.AtomicLong DIRECT_MEMORY_COUNTER
-
DIRECT_MEMORY_LIMIT
private static final long DIRECT_MEMORY_LIMIT
-
CLEANER
private static final Cleaner CLEANER
-
LEGACY_CLEANER
private static final Cleaner LEGACY_CLEANER
-
HAS_ALLOCATE_UNINIT_ARRAY
private static final boolean HAS_ALLOCATE_UNINIT_ARRAY
-
LINUX_ID_PREFIX
private static final java.lang.String LINUX_ID_PREFIX
- See Also:
- Constant Field Values
-
LINUX_ID_LIKE_PREFIX
private static final java.lang.String LINUX_ID_LIKE_PREFIX
- See Also:
- Constant Field Values
-
BIG_ENDIAN_NATIVE_ORDER
public static final boolean BIG_ENDIAN_NATIVE_ORDER
-
IGNORE_EXPENSIVE_CLEAN
private static final boolean IGNORE_EXPENSIVE_CLEAN
-
JFR
private static final boolean JFR
-
VAR_HANDLE
private static final boolean VAR_HANDLE
-
NOOP
private static final Cleaner NOOP
-
-
Method Detail
-
initializeVarHandle
private static boolean initializeVarHandle()
-
addFilesystemOsClassifiers
static void addFilesystemOsClassifiers(java.util.Set<java.lang.String> availableClassifiers)
-
processOsReleaseFile
private static boolean processOsReleaseFile(java.lang.String osReleaseFileName, java.util.Set<java.lang.String> availableClassifiers)
-
addPropertyOsClassifiers
static boolean addPropertyOsClassifiers(java.util.Set<java.lang.String> availableClassifiers)
-
byteArrayBaseOffset
public static long byteArrayBaseOffset()
-
hasDirectBufferNoCleanerConstructor
public static boolean hasDirectBufferNoCleanerConstructor()
-
allocateUninitializedArray
public static byte[] allocateUninitializedArray(int size)
-
isAndroid
public static boolean isAndroid()
Returnstrueif and only if the current platform is Android
-
isWindows
public static boolean isWindows()
Returntrueif the JVM is running on Windows
-
isOsx
public static boolean isOsx()
Returntrueif the JVM is running on OSX / MacOS
-
maybeSuperUser
public static boolean maybeSuperUser()
Returntrueif the current user may be a super-user. Be aware that this is just an hint and so it may return false-positives.
-
javaVersion
public static int javaVersion()
Return the version of Java under which this library is used.
-
isVirtualThread
public static boolean isVirtualThread(java.lang.Thread thread)
- Parameters:
thread- The thread to be checked.- Returns:
trueif thisThreadis a virtual thread,falseotherwise.
-
canEnableTcpNoDelayByDefault
public static boolean canEnableTcpNoDelayByDefault()
Returnstrueif and only if it is fine to enable TCP_NODELAY socket option by default.
-
hasUnsafe
public static boolean hasUnsafe()
Returntrueifsun.misc.Unsafewas found on the classpath and can be used for accelerated direct memory access.
-
getUnsafeUnavailabilityCause
public static java.lang.Throwable getUnsafeUnavailabilityCause()
Return the reason (if any) whysun.misc.Unsafewas not available.
-
isUnaligned
public static boolean isUnaligned()
trueif and only if the platform supports unaligned access.- See Also:
- Wikipedia on segfault
-
directBufferPreferred
public static boolean directBufferPreferred()
Returnstrueif the platform has reliable low-level direct buffer access API and a user has not specified-Dio.netty.noPreferDirectoption.
-
isExplicitNoPreferDirect
public static boolean isExplicitNoPreferDirect()
Returnstrueif user has specified-Dio.netty.noPreferDirect=trueoption.
-
canReliabilyFreeDirectBuffers
public static boolean canReliabilyFreeDirectBuffers()
Returntrueif the selected cleaner can free direct buffers in a controlled way. This guarantee only applies for buffers allocated viaallocateDirect(int)and when using thecleanmethod of the returnedCleanableDirectBuffer.
-
maxDirectMemory
public static long maxDirectMemory()
Returns the maximum memory reserved for direct buffer allocation.
-
usedDirectMemory
public static long usedDirectMemory()
Returns the current memory reserved for direct buffer allocation. This method returns -1 in case that a value is not available.- See Also:
maxDirectMemory()
-
tmpdir
public static java.io.File tmpdir()
Returns the temporary directory.
-
bitMode
public static int bitMode()
Returns the bit mode of the current VM (usually 32 or 64.)
-
addressSize
public static int addressSize()
Return the address size of the OS. 4 (for 32 bits systems ) and 8 (for 64 bits systems).
-
allocateMemory
public static long allocateMemory(long size)
-
freeMemory
public static void freeMemory(long address)
-
reallocateMemory
public static long reallocateMemory(long address, long newSize)
-
throwException
public static void throwException(java.lang.Throwable t)
Raises an exception bypassing compiler checks for checked exceptions.
-
newConcurrentHashMap
@Deprecated public static <K,V> java.util.concurrent.ConcurrentMap<K,V> newConcurrentHashMap()
Deprecated.please use new ConcurrentHashMap() directly. Creates a new fastestConcurrentMapimplementation for the current platform.
-
newLongCounter
@Deprecated public static LongCounter newLongCounter()
Deprecated.please useLongAdderinstead.Creates a new fastestLongCounterimplementation for the current platform.
-
newConcurrentHashMap
@Deprecated public static <K,V> java.util.concurrent.ConcurrentMap<K,V> newConcurrentHashMap(int initialCapacity)
Deprecated.please use new ConcurrentHashMap() directly. Creates a new fastestConcurrentMapimplementation for the current platform.
-
newConcurrentHashMap
@Deprecated public static <K,V> java.util.concurrent.ConcurrentMap<K,V> newConcurrentHashMap(int initialCapacity, float loadFactor)Deprecated.please use new ConcurrentHashMap() directly. Creates a new fastestConcurrentMapimplementation for the current platform.
-
newConcurrentHashMap
@Deprecated public static <K,V> java.util.concurrent.ConcurrentMap<K,V> newConcurrentHashMap(int initialCapacity, float loadFactor, int concurrencyLevel)Deprecated.please use new ConcurrentHashMap() directly. Creates a new fastestConcurrentMapimplementation for the current platform.
-
newConcurrentHashMap
@Deprecated public static <K,V> java.util.concurrent.ConcurrentMap<K,V> newConcurrentHashMap(java.util.Map<? extends K,? extends V> map)
Deprecated.please use new ConcurrentHashMap() directly. Creates a new fastestConcurrentMapimplementation for the current platform.
-
allocateDirect
public static CleanableDirectBuffer allocateDirect(int capacity)
Allocate a directByteBufferof the given capacity, and return it alongside its deallocation mechanism.- Parameters:
capacity- The desired capacity of the direct byte buffer.- Returns:
- The
CleanableDirectBufferinstance that contain the buffer and its deallocation mechanism.
-
allocateDirect
public static CleanableDirectBuffer allocateDirect(int capacity, boolean permitExpensiveClean)
Allocate a directByteBufferof the given capacity, and return it alongside its deallocation mechanism.- Parameters:
capacity- The desired capacity of the direct byte buffer.permitExpensiveClean- Whether to allow expensive clean operations or not. If expensive clean operations are not permitted (false), then the buffer cleaning may instead be delegated to the GC and reference processing. Pooling allocators would typically permit expensive clean operations, while unpooled buffers would not.- Returns:
- The
CleanableDirectBufferinstance that contain the buffer and its deallocation mechanism.
-
reallocateDirect
public static CleanableDirectBuffer reallocateDirect(CleanableDirectBuffer buffer, int newCapacity)
Reallocate a direct buffer with the given new capacity. The old buffer is invalidated and must not be used after this call.- Parameters:
buffer- The old buffer to reallocate.newCapacity- The desired new capacity.- Returns:
- The new
CleanableDirectBufferwith the given capacity.
-
freeDirectBuffer
@Deprecated public static void freeDirectBuffer(java.nio.ByteBuffer buffer)
Deprecated.Use theCleanableDirectBuffer.clean()fromallocateDirect(int)instead.Try to deallocate the specified directByteBuffer. Please note this method does nothing if the current platform does not support this operation or the specified buffer is not a direct buffer.
-
hasDirectByteBufferAddress
public static boolean hasDirectByteBufferAddress(java.nio.ByteBuffer buffer)
Check if it is possible to calldirectBufferAddress(ByteBuffer)on the given buffer.- Parameters:
buffer- The specific buffer instance to check for.- Returns:
trueifdirectBufferAddress(ByteBuffer)can be called on the given buffer, otherwisefalse.
-
directBufferAddress
public static long directBufferAddress(java.nio.ByteBuffer buffer)
Obtain the native memory address of the given direct byte buffer, or throw an exception if it's not possible.- Parameters:
buffer- The buffer to get the native memory address for.- Returns:
- The native memory address of the give buffer.
-
directBuffer
public static java.nio.ByteBuffer directBuffer(long memoryAddress, int size)
-
hasVarHandle
public static boolean hasVarHandle()
-
hasJctoolsVarHandle
static boolean hasJctoolsVarHandle()
-
useVarHandleForMultiByteAccess
public static boolean useVarHandleForMultiByteAccess()
trueifVarHandleshould be used for multi-byte access. The multi-byte access strategy is determined as follows: 1) If the platform supports unaligned access natively, useUnsafeas the fastest option. 2) Otherwise, ifVarHandleis available, use it as a fallback. 3) Otherwise, fall back to manual byte-by-byte access.
-
canUnalignedAccess
public static boolean canUnalignedAccess()
trueif multi-byte access at arbitrary offsets is possible, either natively throughUnsafeor viaVarHandlewhere the JVM handles alignment and byte ordering internally.
-
findVarHandleOfIntField
public static VarHandle findVarHandleOfIntField(java.lang.invoke.MethodHandles.Lookup lookup, java.lang.Class<?> type, java.lang.String fieldName)
-
intBeArrayView
public static VarHandle intBeArrayView()
-
intLeArrayView
public static VarHandle intLeArrayView()
-
longBeArrayView
public static VarHandle longBeArrayView()
-
longLeArrayView
public static VarHandle longLeArrayView()
-
shortBeArrayView
public static VarHandle shortBeArrayView()
-
shortLeArrayView
public static VarHandle shortLeArrayView()
-
longBeByteBufferView
public static VarHandle longBeByteBufferView()
-
longLeByteBufferView
public static VarHandle longLeByteBufferView()
-
intBeByteBufferView
public static VarHandle intBeByteBufferView()
-
intLeByteBufferView
public static VarHandle intLeByteBufferView()
-
shortBeByteBufferView
public static VarHandle shortBeByteBufferView()
-
shortLeByteBufferView
public static VarHandle shortLeByteBufferView()
-
getObject
public static java.lang.Object getObject(java.lang.Object object, long fieldOffset)
-
getVolatileInt
public static int getVolatileInt(java.lang.Object object, long fieldOffset)
-
getInt
public static int getInt(java.lang.Object object, long fieldOffset)
-
putOrderedInt
public static void putOrderedInt(java.lang.Object object, long fieldOffset, int value)
-
getAndAddInt
public static int getAndAddInt(java.lang.Object object, long fieldOffset, int delta)
-
compareAndSwapInt
public static boolean compareAndSwapInt(java.lang.Object object, long fieldOffset, int expected, int value)
-
safeConstructPutInt
static void safeConstructPutInt(java.lang.Object object, long fieldOffset, int value)
-
getByte
public static byte getByte(long address)
-
getShort
public static short getShort(long address)
-
getInt
public static int getInt(long address)
-
getLong
public static long getLong(long address)
-
getByte
public static byte getByte(byte[] data, int index)
-
getByte
public static byte getByte(byte[] data, long index)
-
getShort
public static short getShort(byte[] data, int index)
-
getInt
public static int getInt(byte[] data, int index)
-
getInt
public static int getInt(int[] data, long index)
-
getLong
public static long getLong(byte[] data, int index)
-
getLong
public static long getLong(long[] data, long index)
-
toIntExact
private static int toIntExact(long value)
-
getLongSafe
private static long getLongSafe(byte[] bytes, int offset)
-
getIntSafe
private static int getIntSafe(byte[] bytes, int offset)
-
getShortSafe
private static short getShortSafe(byte[] bytes, int offset)
-
hashCodeAsciiCompute
private static int hashCodeAsciiCompute(java.lang.CharSequence value, int offset, int hash)Identical toPlatformDependent0.hashCodeAsciiCompute(long, int)but forCharSequence.
-
hashCodeAsciiSanitizeInt
private static int hashCodeAsciiSanitizeInt(java.lang.CharSequence value, int offset)Identical toPlatformDependent0.hashCodeAsciiSanitize(int)but forCharSequence.
-
hashCodeAsciiSanitizeShort
private static int hashCodeAsciiSanitizeShort(java.lang.CharSequence value, int offset)Identical toPlatformDependent0.hashCodeAsciiSanitize(short)but forCharSequence.
-
hashCodeAsciiSanitizeByte
private static int hashCodeAsciiSanitizeByte(char value)
Identical toPlatformDependent0.hashCodeAsciiSanitize(byte)but forCharSequence.
-
putByte
public static void putByte(long address, byte value)
-
putShort
public static void putShort(long address, short value)
-
putInt
public static void putInt(long address, int value)
-
putLong
public static void putLong(long address, long value)
-
putByte
public static void putByte(byte[] data, int index, byte value)
-
putByte
public static void putByte(java.lang.Object data, long offset, byte value)
-
putShort
public static void putShort(byte[] data, int index, short value)
-
putInt
public static void putInt(byte[] data, int index, int value)
-
putLong
public static void putLong(byte[] data, int index, long value)
-
putObject
public static void putObject(java.lang.Object o, long offset, java.lang.Object x)
-
objectFieldOffset
public static long objectFieldOffset(java.lang.reflect.Field field)
-
copyMemory
public static void copyMemory(long srcAddr, long dstAddr, long length)
-
copyMemory
public static void copyMemory(byte[] src, int srcIndex, long dstAddr, long length)
-
copyMemory
public static void copyMemory(byte[] src, int srcIndex, byte[] dst, int dstIndex, long length)
-
copyMemory
public static void copyMemory(long srcAddr, byte[] dst, int dstIndex, long length)
-
setMemory
public static void setMemory(byte[] dst, int dstIndex, long bytes, byte value)
-
setMemory
public static void setMemory(long address, long bytes, byte value)
-
hasAlignDirectByteBuffer
public static boolean hasAlignDirectByteBuffer()
-
alignDirectBuffer
public static java.nio.ByteBuffer alignDirectBuffer(java.nio.ByteBuffer buffer, int alignment)
-
align
public static long align(long value, int alignment)
-
offsetSlice
public static java.nio.ByteBuffer offsetSlice(java.nio.ByteBuffer buffer, int index, int length)
-
absolutePut
public static java.nio.ByteBuffer absolutePut(java.nio.ByteBuffer dst, int dstOffset, byte[] src, int srcOffset, int length)
-
absolutePut
public static java.nio.ByteBuffer absolutePut(java.nio.ByteBuffer dst, int dstOffset, java.nio.ByteBuffer src, int srcOffset, int length)
-
incrementMemoryCounter
static void incrementMemoryCounter(int capacity)
-
decrementMemoryCounter
static void decrementMemoryCounter(int capacity)
-
useDirectBufferNoCleaner
public static boolean useDirectBufferNoCleaner()
-
equals
public static boolean equals(byte[] bytes1, int startPos1, byte[] bytes2, int startPos2, int length)Compare twobytearrays for equality. For performance reasons no bounds checking on the parameters is performed.- Parameters:
bytes1- the first byte array.startPos1- the position (inclusive) to start comparing inbytes1.bytes2- the second byte array.startPos2- the position (inclusive) to start comparing inbytes2.length- the amount of bytes to compare. This is assumed to be validated as not going out of bounds by the caller.
-
isZero
public static boolean isZero(byte[] bytes, int startPos, int length)Determine if a subsection of an array is zero.- Parameters:
bytes- The byte array.startPos- The starting index (inclusive) inbytes.length- The amount of bytes to check for zero.- Returns:
falseifbytes[startPos:startsPos+length)contains a value other than zero.
-
equalsConstantTime
public static int equalsConstantTime(byte[] bytes1, int startPos1, byte[] bytes2, int startPos2, int length)Compare twobytearrays for equality without leaking timing information. For performance reasons no bounds checking on the parameters is performed.The
intreturn type is intentional and is designed to allow cascading of constant time operations:byte[] s1 = new {1, 2, 3}; byte[] s2 = new {1, 2, 3}; byte[] s3 = new {1, 2, 3}; byte[] s4 = new {4, 5, 6}; boolean equals = (equalsConstantTime(s1, 0, s2, 0, s1.length) & equalsConstantTime(s3, 0, s4, 0, s3.length)) != 0;- Parameters:
bytes1- the first byte array.startPos1- the position (inclusive) to start comparing inbytes1.bytes2- the second byte array.startPos2- the position (inclusive) to start comparing inbytes2.length- the amount of bytes to compare. This is assumed to be validated as not going out of bounds by the caller.- Returns:
0if not equal.1if equal.
-
hashCodeAscii
public static int hashCodeAscii(byte[] bytes, int startPos, int length)Calculate a hash code of a byte array assuming ASCII character encoding. The resulting hash code will be case insensitive.- Parameters:
bytes- The array which contains the data to hash.startPos- What index to start generating a hash code inbyteslength- The amount of bytes that should be accounted for in the computation.- Returns:
- The hash code of
bytesassuming ASCII character encoding. The resulting hash code will be case insensitive.
-
hashCodeAscii
public static int hashCodeAscii(java.lang.CharSequence bytes)
Calculate a hash code of a byte array assuming ASCII character encoding. The resulting hash code will be case insensitive.This method assumes that
bytesis equivalent to abyte[]but just usingCharSequencefor storage. The upper most byte of eachcharfrombytesis ignored.- Parameters:
bytes- The array which contains the data to hash (assumed to be equivalent to abyte[]).- Returns:
- The hash code of
bytesassuming ASCII character encoding. The resulting hash code will be case insensitive.
-
newMpscQueue
public static <T> java.util.Queue<T> newMpscQueue()
Create a newQueuewhich is safe to use for multiple producers (different threads) and a single consumer (one thread!).- Returns:
- A MPSC queue which may be unbounded.
-
newMpscQueue
public static <T> java.util.Queue<T> newMpscQueue(int maxCapacity)
Create a newQueuewhich is safe to use for multiple producers (different threads) and a single consumer (one thread!).
-
newMpscQueue
public static <T> java.util.Queue<T> newMpscQueue(int chunkSize, int maxCapacity)Create a newQueuewhich is safe to use for multiple producers (different threads) and a single consumer (one thread!). The queue will grow and shrink its capacity in units of the given chunk size.
-
newSpscQueue
public static <T> java.util.Queue<T> newSpscQueue()
Create a newQueuewhich is safe to use for single producer (one thread!) and a single consumer (one thread!).
-
newFixedMpscQueue
public static <T> java.util.Queue<T> newFixedMpscQueue(int capacity)
Create a newQueuewhich is safe to use for multiple producers (different threads) and a single consumer (one thread!) with the given fixescapacity.
-
newFixedMpscUnpaddedQueue
public static <T> java.util.Queue<T> newFixedMpscUnpaddedQueue(int capacity)
Create a new un-paddedQueuewhich is safe to use for multiple producers (different threads) and a single consumer (one thread!) with the given fixescapacity.
This should be preferred tonewFixedMpscQueue(int)when the queue is not to be heavily contended.
-
newFixedMpmcQueue
public static <T> java.util.Queue<T> newFixedMpmcQueue(int capacity)
Create a newQueuewhich is safe to use for multiple producers (different threads) and multiple consumers with the given fixescapacity.
-
getClassLoader
public static java.lang.ClassLoader getClassLoader(java.lang.Class<?> clazz)
Return theClassLoaderfor the givenClass.
-
getContextClassLoader
public static java.lang.ClassLoader getContextClassLoader()
Return the contextClassLoaderfor the currentThread.
-
getSystemClassLoader
public static java.lang.ClassLoader getSystemClassLoader()
Return the systemClassLoader.
-
newConcurrentDeque
public static <C> java.util.Deque<C> newConcurrentDeque()
Returns a new concurrentDeque.
-
threadLocalRandom
@Deprecated public static java.util.Random threadLocalRandom()
Deprecated.Use ThreadLocalRandom.current() instead.Return aRandomwhich is not-threadsafe and so can only be used from the same thread.
-
splittableRandomNextBytes
public static void splittableRandomNextBytes(java.util.SplittableRandom rng, byte[] data)
-
isWindows0
private static boolean isWindows0()
-
isOsx0
private static boolean isOsx0()
-
maybeSuperUser0
private static boolean maybeSuperUser0()
-
unsafeUnavailabilityCause0
private static java.lang.Throwable unsafeUnavailabilityCause0()
-
isJ9Jvm
public static boolean isJ9Jvm()
-
isJ9Jvm0
private static boolean isJ9Jvm0()
-
isIkvmDotNet
public static boolean isIkvmDotNet()
-
isIkvmDotNet0
private static boolean isIkvmDotNet0()
-
getMaxDirectMemorySizeArgPattern
private static java.util.regex.Pattern getMaxDirectMemorySizeArgPattern()
-
estimateMaxDirectMemory
public static long estimateMaxDirectMemory()
Compute an estimate of the maximum amount of direct memory available to this JVM.The computation is not cached, so you probably want to use
maxDirectMemory()instead.This will produce debug log output when called.
- Returns:
- The estimated max direct memory, in bytes.
-
tmpdir0
private static java.io.File tmpdir0()
-
toDirectory
private static java.io.File toDirectory(java.lang.String path)
-
bitMode0
private static int bitMode0()
-
addressSize0
private static int addressSize0()
-
byteArrayBaseOffset0
private static long byteArrayBaseOffset0()
-
equalsSafe
private static boolean equalsSafe(byte[] bytes1, int startPos1, byte[] bytes2, int startPos2, int length)
-
isZeroSafe
private static boolean isZeroSafe(byte[] bytes, int startPos, int length)
-
hashCodeAsciiSafe
static int hashCodeAsciiSafe(byte[] bytes, int startPos, int length)Package private for testing purposes only!
-
normalizedArch
public static java.lang.String normalizedArch()
-
normalizedOs
public static java.lang.String normalizedOs()
-
normalizedLinuxClassifiers
public static java.util.Set<java.lang.String> normalizedLinuxClassifiers()
-
createTempFile
public static java.io.File createTempFile(java.lang.String prefix, java.lang.String suffix, java.io.File directory) throws java.io.IOException- Throws:
java.io.IOException
-
addClassifier
private static void addClassifier(java.util.Set<java.lang.String> dest, java.lang.String... maybeClassifiers)Adds only those classifier strings to dest which are present in allowed.- Parameters:
dest- destination setmaybeClassifiers- potential classifiers to add
-
isAllowedClassifier
private static boolean isAllowedClassifier(java.lang.String classifier)
-
normalizeOsReleaseVariableValue
private static java.lang.String normalizeOsReleaseVariableValue(java.lang.String value)
-
normalize
private static java.lang.String normalize(java.lang.String value)
-
normalizeArch
private static java.lang.String normalizeArch(java.lang.String value)
-
normalizeOs
private static java.lang.String normalizeOs(java.lang.String value)
-
isJfrEnabled
public static boolean isJfrEnabled()
Check if JFR events are supported on this platform.
-
-