Arena@FunctionalInterface public interface SegmentAllocator
allocate(long, long) method. A segment allocator defines several methods which can be useful to create segments from several kinds of Java values such as primitives and arrays. SegmentAllocator is a functional interface. Clients can easily obtain a new segment allocator by using either a lambda expression or a method reference:
SegmentAllocator autoAllocator = (byteSize, byteAlignment) -> Arena.ofAuto().allocate(byteSize, byteAlignment);
This interface defines factories for commonly used allocators:
slicingAllocator(MemorySegment) obtains an efficient slicing allocator, where memory is allocated by repeatedly slicing the provided memory segment;prefixAllocator(MemorySegment) obtains an allocator which wraps a segment and recycles its content upon each new allocation request. Passing a segment allocator to an API can be especially useful in circumstances where a client wants to communicate where the results of a certain operation (performed by the API) should be stored, as a memory segment. For instance, downcall method handlesRESTRICTED can accept an additional SegmentAllocator parameter if the underlying foreign function is known to return a struct by-value. Effectively, the allocator parameter tells the linker where to store the return value of the foreign function.
allocate(long, long) method is not thread-safe. Furthermore, memory segments allocated by a segment allocator can be associated with different lifetimes, and can even be backed by overlapping regions of memory. For these reasons, clients should generally only interact with a segment allocator they own. Clients should consider using an arena instead, which, provides strong thread-safety, lifetime and non-overlapping guarantees.
| Modifier and Type | Method | Description |
|---|---|---|
default MemorySegment |
allocate |
Returns a new memory segment with the given byteSize. |
MemorySegment |
allocate |
Returns a new memory segment with the given byteSize and byteAlignment. |
default MemorySegment |
allocate |
Returns a new memory segment with the given layout. |
default MemorySegment |
allocate |
Returns a new memory segment with the given elementLayout and count. |
default MemorySegment |
allocateFrom |
Returns a new memory segment initialized with the address of the provided memory segment. |
default MemorySegment |
allocateFrom |
Returns a new memory segment initialized with the provided byte value. |
default MemorySegment |
allocateFrom |
Returns a new memory segment initialized with the elements in the provided byte array. |
default MemorySegment |
allocateFrom |
Returns a new memory segment initialized with the provided char value. |
default MemorySegment |
allocateFrom |
Returns a new memory segment initialized with the elements in the provided char array. |
default MemorySegment |
allocateFrom |
Returns a new memory segment initialized with the provided double value. |
default MemorySegment |
allocateFrom |
Returns a new memory segment initialized with the elements in the provided double array. |
default MemorySegment |
allocateFrom |
Returns a new memory segment initialized with the provided float value. |
default MemorySegment |
allocateFrom |
Returns a new memory segment initialized with the elements in the provided float array. |
default MemorySegment |
allocateFrom |
Returns a new memory segment initialized with the provided int value. |
default MemorySegment |
allocateFrom |
Returns a new memory segment initialized with the elements in the provided int array. |
default MemorySegment |
allocateFrom |
Returns a new memory segment initialized with the provided long value. |
default MemorySegment |
allocateFrom |
Returns a new memory segment initialized with the elements in the provided long array. |
default MemorySegment |
allocateFrom |
Returns a new memory segment initialized with the provided short value. |
default MemorySegment |
allocateFrom |
Returns a new memory segment initialized with the elements in the provided short array. |
default MemorySegment |
allocateFrom |
Returns a new memory segment initialized with the contents of the provided segment. |
default MemorySegment |
allocateFrom |
Converts a Java string into a null-terminated C string using the UTF-8 charset, storing the result into a memory segment. |
default MemorySegment |
allocateFrom |
Converts a Java string into a null-terminated C string using the provided charset, and storing the result into a memory segment. |
static SegmentAllocator |
prefixAllocator |
Returns a segment allocator that responds to allocation requests by recycling a single segment. |
static SegmentAllocator |
slicingAllocator |
Returns a segment allocator that responds to allocation requests by returning consecutive slices obtained from the provided segment. |
default MemorySegment allocateFrom(String str)
Calling this method is equivalent to the following code:
allocateFrom(str, StandardCharsets.UTF_8);
str - the Java string to be converted into a C stringdefault MemorySegment allocateFrom(String str, Charset charset)
This method always replaces malformed-input and unmappable-character sequences with this charset's default replacement byte array. The CharsetEncoder class should be used when more control over the encoding process is required.
If the given string contains any '\0' characters, they will be copied as well. This means that, depending on the method used to read the string, such as MemorySegment.getString(long), the string will appear truncated when read again.
this.allocate(B + N), where: B is the size, in bytes, of the string encoded using the provided charset (e.g. str.getBytes(charset).length);N is the size (in bytes) of the terminator char according to the provided charset. For instance, this is 1 for StandardCharsets.US_ASCII and 2 for StandardCharsets.UTF_16.str - the Java string to be converted into a C stringcharset - the charset used to encode the string bytesIllegalArgumentException - if charset is not a standard charset
default MemorySegment allocateFrom(ValueLayout.OfByte layout, byte value)
The size of the allocated memory segment is the size of the given layout. The given value is written into the segment according to the byte order and alignment constraint of the given layout.
MemorySegment seg = allocate(Objects.requireNonNull(layout));
seg.set(layout, 0, value);
return seg;
layout - the layout of the block of memory to be allocatedvalue - the value to be set in the newly allocated memory segmentdefault MemorySegment allocateFrom(ValueLayout.OfChar layout, char value)
The size of the allocated memory segment is the size of the given layout. The given value is written into the segment according to the byte order and alignment constraint of the given layout.
MemorySegment seg = allocate(Objects.requireNonNull(layout));
seg.set(layout, 0, value);
return seg;
layout - the layout of the block of memory to be allocatedvalue - the value to be set in the newly allocated memory segmentdefault MemorySegment allocateFrom(ValueLayout.OfShort layout, short value)
The size of the allocated memory segment is the size of the given layout. The given value is written into the segment according to the byte order and alignment constraint of the given layout.
MemorySegment seg = allocate(Objects.requireNonNull(layout));
seg.set(layout, 0, value);
return seg;
layout - the layout of the block of memory to be allocatedvalue - the value to be set in the newly allocated memory segmentdefault MemorySegment allocateFrom(ValueLayout.OfInt layout, int value)
The size of the allocated memory segment is the size of the given layout. The given value is written into the segment according to the byte order and alignment constraint of the given layout.
MemorySegment seg = allocate(Objects.requireNonNull(layout));
seg.set(layout, 0, value);
return seg;
layout - the layout of the block of memory to be allocatedvalue - the value to be set in the newly allocated memory segmentdefault MemorySegment allocateFrom(ValueLayout.OfFloat layout, float value)
The size of the allocated memory segment is the size of the given layout. The given value is written into the segment according to the byte order and alignment constraint of the given layout.
MemorySegment seg = allocate(Objects.requireNonNull(layout));
seg.set(layout, 0, value);
return seg;
layout - the layout of the block of memory to be allocatedvalue - the value to be set in the newly allocated memory segmentdefault MemorySegment allocateFrom(ValueLayout.OfLong layout, long value)
The size of the allocated memory segment is the size of the given layout. The given value is written into the segment according to the byte order and alignment constraint of the given layout.
MemorySegment seg = allocate(Objects.requireNonNull(layout));
seg.set(layout, 0, value);
return seg;
layout - the layout of the block of memory to be allocatedvalue - the value to be set in the newly allocated memory segmentdefault MemorySegment allocateFrom(ValueLayout.OfDouble layout, double value)
The size of the allocated memory segment is the size of the given layout. The given value is written into the segment according to the byte order and alignment constraint of the given layout.
MemorySegment seg = allocate(Objects.requireNonNull(layout));
seg.set(layout, 0, value);
return seg;
layout - the layout of the block of memory to be allocatedvalue - the value to be set in the newly allocated memory segmentdefault MemorySegment allocateFrom(AddressLayout layout, MemorySegment value)
The address value might be narrowed according to the platform address size (see ValueLayout.ADDRESS).
The size of the allocated memory segment is the size of the given layout. The given value is written into the segment according to the byte order and alignment constraint of the given layout.
Objects.requireNonNull(value);
MemorySegment seg = allocate(Objects.requireNonNull(layout));
seg.set(layout, 0, value);
return seg;
layout - the layout of the block of memory to be allocatedvalue - the value to be set in the newly allocated memory segmentIllegalArgumentException - if value is not a native segmentdefault MemorySegment allocateFrom(ValueLayout elementLayout, MemorySegment source, ValueLayout sourceElementLayout, long sourceOffset, long elementCount)
The size of the allocated memory segment is the elementLayout.byteSize() * elementCount. The contents of the source segment is copied into the result segment element by element, according to the byte order and alignment constraint of the given element layout.
MemorySegment dest = this.allocate(elementLayout, elementCount);
MemorySegment.copy(source, sourceElementLayout, sourceOffset, dest, elementLayout, 0, elementCount);
return dest;
elementLayout - the element layout of the allocated arraysource - the source segmentsourceElementLayout - the element layout of the source segmentsourceOffset - the starting offset, in bytes, of the source segmentelementCount - the number of elements in the source segment to be copiedIllegalArgumentException - if elementLayout.byteSize() != sourceElementLayout.byteSize()
IllegalArgumentException - if the source segment/offset are incompatible with the alignment constraint in the source element layoutIllegalArgumentException - if elementLayout.byteAlignment() > elementLayout.byteSize()
IllegalArgumentException - if sourceElementLayout.byteAlignment() > sourceElementLayout.byteSize()
IllegalStateException - if the scope associated with source is not alive
WrongThreadException - if this method is called from a thread T, such that source.isAccessibleBy(T) == false
IllegalArgumentException - if elementCount * sourceElementLayout.byteSize() overflowsIllegalArgumentException - if elementCount < 0
IndexOutOfBoundsException - if sourceOffset > source.byteSize() - (elementCount * sourceElementLayout.byteSize())
IndexOutOfBoundsException - if sourceOffset < 0
default MemorySegment allocateFrom(ValueLayout.OfByte elementLayout, byte... elements)
The size of the allocated memory segment is elementLayout.byteSize() * elements.length. The contents of the source array is copied into the result segment element by element, according to the byte order and alignment constraint of the given element layout.
this.allocateFrom(layout, MemorySegment.ofArray(array),
ValueLayout.JAVA_BYTE, 0, array.length)
elementLayout - the element layout of the array to be allocatedelements - the byte elements to be copied to the newly allocated memory blockIllegalArgumentException - if elementLayout.byteAlignment() > elementLayout.byteSize()
default MemorySegment allocateFrom(ValueLayout.OfShort elementLayout, short... elements)
The size of the allocated memory segment is elementLayout.byteSize() * elements.length. The contents of the source array are copied into the result segment element by element, according to the byte order and alignment constraint of the given element layout.
this.allocateFrom(layout, MemorySegment.ofArray(array),
ValueLayout.JAVA_SHORT, 0, array.length)
elementLayout - the element layout of the array to be allocatedelements - the short elements to be copied to the newly allocated memory blockIllegalArgumentException - if elementLayout.byteAlignment() > elementLayout.byteSize()
default MemorySegment allocateFrom(ValueLayout.OfChar elementLayout, char... elements)
The size of the allocated memory segment is elementLayout.byteSize() * elements.length. The contents of the source array is copied into the result segment element by element, according to the byte order and alignment constraint of the given element layout.
this.allocateFrom(layout, MemorySegment.ofArray(array),
ValueLayout.JAVA_CHAR, 0, array.length)
elementLayout - the element layout of the array to be allocatedelements - the char elements to be copied to the newly allocated memory blockIllegalArgumentException - if elementLayout.byteAlignment() > elementLayout.byteSize()
default MemorySegment allocateFrom(ValueLayout.OfInt elementLayout, int... elements)
The size of the allocated memory segment is elementLayout.byteSize() * elements.length. The contents of the source array is copied into the result segment element by element, according to the byte order and alignment constraint of the given element layout.
this.allocateFrom(layout, MemorySegment.ofArray(array),
ValueLayout.JAVA_INT, 0, array.length)
elementLayout - the element layout of the array to be allocatedelements - the int elements to be copied to the newly allocated memory blockIllegalArgumentException - if elementLayout.byteAlignment() > elementLayout.byteSize()
default MemorySegment allocateFrom(ValueLayout.OfFloat elementLayout, float... elements)
The size of the allocated memory segment is elementLayout.byteSize() * elements.length. The contents of the source array is copied into the result segment element by element, according to the byte order and alignment constraint of the given element layout.
this.allocateFrom(layout, MemorySegment.ofArray(array),
ValueLayout.JAVA_FLOAT, 0, array.length)
elementLayout - the element layout of the array to be allocatedelements - the float elements to be copied to the newly allocated memory blockIllegalArgumentException - if elementLayout.byteAlignment() > elementLayout.byteSize()
default MemorySegment allocateFrom(ValueLayout.OfLong elementLayout, long... elements)
The size of the allocated memory segment is elementLayout.byteSize() * elements.length. The contents of the source array is copied into the result segment element by element, according to the byte order and alignment constraint of the given element layout.
this.allocateFrom(layout, MemorySegment.ofArray(array),
ValueLayout.JAVA_LONG, 0, array.length)
elementLayout - the element layout of the array to be allocatedelements - the long elements to be copied to the newly allocated memory blockIllegalArgumentException - if elementLayout.byteAlignment() > elementLayout.byteSize()
default MemorySegment allocateFrom(ValueLayout.OfDouble elementLayout, double... elements)
The size of the allocated memory segment is elementLayout.byteSize() * elements.length. The contents of the source array is copied into the result segment element by element, according to the byte order and alignment constraint of the given element layout.
this.allocateFrom(layout, MemorySegment.ofArray(array),
ValueLayout.JAVA_DOUBLE, 0, array.length)
elementLayout - the element layout of the array to be allocatedelements - the double elements to be copied to the newly allocated memory blockIllegalArgumentException - if elementLayout.byteAlignment() > elementLayout.byteSize()
default MemorySegment allocate(MemoryLayout layout)
this.allocate(layout.byteSize(), layout.byteAlignment()).layout - the layout of the block of memory to be allocateddefault MemorySegment allocate(MemoryLayout elementLayout, long count)
elementLayout and count.this.allocate(MemoryLayout.sequenceLayout(count, elementLayout)).elementLayout - the array element layoutcount - the array element countelementLayout and count
IllegalArgumentException - if elementLayout.byteSize() * count overflowsIllegalArgumentException - if count < 0
default MemorySegment allocate(long byteSize)
byteSize.this.allocate(byteSize, 1).byteSize - the size (in bytes) of the block of memory to be allocatedbyteSize
IllegalArgumentException - if byteSize < 0
MemorySegment allocate(long byteSize, long byteAlignment)
byteSize and byteAlignment.byteSize - the size (in bytes) of the block of memory to be allocatedbyteAlignment - the alignment (in bytes) of the block of memory to be allocatedbyteSize and byteAlignment
IllegalArgumentException - if byteSize < 0, byteAlignment <= 0, or if byteAlignment is not a power of 2static SegmentAllocator slicingAllocator(MemorySegment segment)
The returned allocator throws IndexOutOfBoundsException when a slice of the provided segment with the requested size and alignment cannot be found.
segment - the segment from which the returned allocator should slice fromIllegalArgumentException - if the segment is read-only
static SegmentAllocator prefixAllocator(MemorySegment segment)
0, hence the name prefix allocator. Equivalent to (but likely more efficient than) the following code:
MemorySegment segment = ...
SegmentAllocator prefixAllocator = (size, align) -> segment.asSlice(0, size, align);
IndexOutOfBoundsException when a slice of the provided segment with the requested size and alignment cannot be found.segment - the memory segment to be recycled by the returned allocatorIllegalArgumentException - if the segment is read-only
© 1993, 2025, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from Debian's OpenJDK Development Kit package.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses (see Debian package).
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.
https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/lang/foreign/SegmentAllocator.html