diff --git a/src/java.base/share/classes/jdk/internal/foreign/SegmentFactories.java b/src/java.base/share/classes/jdk/internal/foreign/SegmentFactories.java index 3edcac2e44c92..914050c4859a2 100644 --- a/src/java.base/share/classes/jdk/internal/foreign/SegmentFactories.java +++ b/src/java.base/share/classes/jdk/internal/foreign/SegmentFactories.java @@ -212,7 +212,7 @@ private static long allocateNativeInternal(long byteSize, long byteAlignment, Me allocationBase = allocateMemoryWrapper(allocationSize); result = Utils.alignUp(allocationBase, byteAlignment); } else { - allocationSize = alignedSize; + allocationSize = Math.max(alignedSize, byteAlignment); if (shouldReserve) { AbstractMemorySegmentImpl.NIO_ACCESS.reserveMemory(allocationSize, byteSize); } diff --git a/test/jdk/java/foreign/TestMemoryAlignment.java b/test/jdk/java/foreign/TestMemoryAlignment.java index 44d28a07b05e3..a73635c8f08df 100644 --- a/test/jdk/java/foreign/TestMemoryAlignment.java +++ b/test/jdk/java/foreign/TestMemoryAlignment.java @@ -60,8 +60,14 @@ public void testAlignedAccess(long align) { assertEquals(aligned.byteAlignment(), align); //unreasonable alignment here, to make sure access throws VarHandle vh = aligned.varHandle(); try (Arena arena = Arena.ofConfined()) { - MemorySegment segment = arena.allocate(aligned);; + MemorySegment segment = arena.allocate(aligned); vh.set(segment, 0L, -42); + + // Allocate another segment and fill it with data to + // check that the first segment is not overwritten + MemorySegment nextSegment = arena.allocate(aligned); + vh.set(nextSegment, 0L, 0xffffff); + int val = (int)vh.get(segment, 0L); assertEquals(val, -42); }