Java 17 bug (?) on Windows with MemorySegment.asSlice and offset = 3705032704

Radosław Smogura mail at smogura.eu
Thu May 12 09:12:51 UTC 2022


Hi,

I guess differences between Windows & Linux comes from processing signal or other checks happening during execution.

If I remember well how pages are mapped, then.

3,705,032,704 is the start address of next memory page, which looks like not mapped (I think that even pages is not in memory it should not cause fault, but just program should work a bit slower).

3705032702   ÷   4096 = 904,548.9995117188

904548   ×   4096 = 3,705,028,608 - start of first mapped paged

3,705,028,608 + 4096 = 3,705,032,704 - next mapped page.

Kind regards,
Rado
________________________________
From: panama-dev <panama-dev-retn at openjdk.java.net> on behalf of erel at eth.gl <erel at eth.gl>
Sent: Thursday, May 12, 2022 07:38
To: panama-dev at openjdk.java.net <panama-dev at openjdk.java.net>
Subject: Java 17 bug (?) on Windows with MemorySegment.asSlice and offset = 3705032704

Hi,

It doesn’t happen on Linux. I’ve tested it with Oracle Java 17.0.3.1 and OpenJDK 17.0.2.



Code:

package test.test;



import java.io.RandomAccessFile;

import java.nio.channels.FileChannel.MapMode;

import java.nio.file.Path;



import jdk.incubator.foreign.MemorySegment;

import jdk.incubator.foreign.ResourceScope;



public class Test {



      public static void main(String[] args) throws Exception {

            System.out.println(System.getProperty("sun.arch.data.model"));

            System.out.println(System.getProperty("os.arch"));

            System.out.println(System.getProperty("java.version"));

            Path p = Path.of("test.dat");

            RandomAccessFile raf = new RandomAccessFile("test.dat", "rw");

            raf.setLength(8000000000L); //~8gb

            raf.close();

            MemorySegment mappedMemorySegment = MemorySegment.mapFile(p, 0, p.toFile().length(), MapMode.READ_WRITE, ResourceScope.newSharedScope());

            System.out.println("byteSize: " + mappedMemorySegment.byteSize());

            long offset = 3705032702L;

            while (true) {

                  System.out.println("offset: " + offset);

                  MemorySegment target = mappedMemorySegment.asSlice(offset, 1);

                  offset = offset + 1;

                  try {

                        target.force();

                  } catch (Exception e) {

                        e.printStackTrace();

                        return;

                  }

            }

      }

}



Output:

WARNING: Using incubator modules: jdk.incubator.foreign

64

amd64

17.0.3.1

byteSize: 8000000000

offset: 3705032702

offset: 3705032703

offset: 3705032704

java.io.UncheckedIOException: java.io.IOException: Attempt to access invalid address

       at java.base/java.nio.MappedMemoryUtils.force(MappedMemoryUtils.java:102)

       at java.base/java.nio.Buffer$1.force(Buffer.java:839)

       at java.base/jdk.internal.misc.ScopedMemoryAccess.forceInternal(ScopedMemoryAccess.java:337)

       at java.base/jdk.internal.misc.ScopedMemoryAccess.force(ScopedMemoryAccess.java:325)

       at jdk.incubator.foreign/jdk.internal.foreign.MappedMemorySegmentImpl.force(MappedMemorySegmentImpl.java:104)

       at test.test.Test.main(Test.java:30)

Caused by: java.io.IOException: Attempt to access invalid address

       at java.base/java.nio.MappedMemoryUtils.force0(Native Method)

       at java.base/java.nio.MappedMemoryUtils.force(MappedMemoryUtils.java:100)

       ... 5 more



This is a blocking issue for us. Suggestions will be welcomed.



Thanks,

Erel





More information about the panama-dev mailing list