diff --git a/visualvm/libs.profiler/lib.profiler.heap/src/org/graalvm/visualvm/lib/jfluid/heap/AbstractLongMap.java b/visualvm/libs.profiler/lib.profiler.heap/src/org/graalvm/visualvm/lib/jfluid/heap/AbstractLongMap.java index 07acfbfc21..0ff314ea05 100644 --- a/visualvm/libs.profiler/lib.profiler.heap/src/org/graalvm/visualvm/lib/jfluid/heap/AbstractLongMap.java +++ b/visualvm/libs.profiler/lib.profiler.heap/src/org/graalvm/visualvm/lib/jfluid/heap/AbstractLongMap.java @@ -205,6 +205,18 @@ private static boolean isLinux() { return osName.endsWith("Linux"); // NOI18N } + private static boolean isMacOS() { + String osName = System.getProperty("os.name"); // NOI18N + + return "Mac OS X".equals(osName); // NOI18N + } + + private static boolean isAarch64() { + String osArch = System.getProperty("os.arch"); // NOI18N + + return "aarch64".equals(osArch); // NOI18N + } + abstract Entry createEntry(long index); abstract Entry createEntry(long index,long value); @@ -379,7 +391,7 @@ public void force() throws IOException { private static class MemoryMappedData extends AbstractData { - private static final FileChannel.MapMode MAP_MODE = isLinux() ? FileChannel.MapMode.PRIVATE : FileChannel.MapMode.READ_WRITE; + private static final FileChannel.MapMode MAP_MODE = computeMapMode(); //~ Instance fields ------------------------------------------------------------------------------------------------------ @@ -439,6 +451,12 @@ private static MappedByteBuffer createBuffer(RandomAccessFile file, long length) return channel.map(MAP_MODE, 0, length); } } + + private static FileChannel.MapMode computeMapMode() { + if (isLinux()) return FileChannel.MapMode.PRIVATE; + if (isMacOS() && isAarch64()) return FileChannel.MapMode.PRIVATE; + return FileChannel.MapMode.READ_WRITE; + } } private static class LongMemoryMappedData extends AbstractData {