Skip to content

Latest commit

 

History

History
60 lines (53 loc) · 1.83 KB

README.md

File metadata and controls

60 lines (53 loc) · 1.83 KB

Unsafe utils

Allows more convenient access to java's Unsafe API.

How to use

Object access

To access objects use ObjectMemory class. Methods require to pass object reference and field offset. To get field offset use fieldOffset method.

SomeClass obj = new SomeClass();
obj.field1 = 123;
long longField = ObjectMemory.fieldOffset(SomeClass.class, "field1");
long value = ObjectMemory.getLong(obj, longField);

Array access

To access arrays use ArrayMemory class. Methods require to pass array reference and offset or index. Offset is calculated as offset for first element
and element index multiplied by element size. To get first element's offset use firstElementOffset method.

By index
int value = ArrayMemory.getInt(array, 4);
By offset
long offset = ArrayMemory.firstElementOffset() + 2 * SystemTypeSizes.intSize();
int value = ArrayMemory.getInt(array, offset);

Sizes for types are available through SystemTypeSizes class.

Off heap access

To access native memory use OffHeapMemory class.

long address = OffHeapMemory.allocate(100 * SystemTypeSizes.intSize());
long offset = SystemTypeSizes.intSize() * 10;
OffHeapMemory.setInt(address + offset, 123);
int value = OffHeapMemory.getInt(address + offset);
OffHeapMemory.free(address);

Be aware native memory should be freed manually.

Memory fences

Class MemoryFence allows to class memory fences. There are store, load and full fences provided by JVM.

MemoryFence.full();

Installation

Packages are available through Maven Central repository.

Maven
<dependency>
    <groupId>io.github.thepun</groupId>
    <artifactId>unsafe-utils</artifactId>
    <version>1.1</version>
</dependency>
Gradle
compile group: 'io.github.thepun', name: 'unsafe-utils', version: '1.1'