Поддерживает ли OpenJ9 аннотацию sun.misc.Contended? - PullRequest
0 голосов
/ 16 ноября 2018

Я создал программу, чтобы проверить, действует ли @sun.misc.Contended.Идея состоит в том, что когда действует @Contended, смещения полей в аннотированном классе будут больше.

Я могу увидеть ожидаемую разницу в смещениях в OpenJDK, если указать флаг -XX:-RestrictContended.Я не вижу никакой разницы в OpenJ9 11 (jdk-11.0.1 + 13, Eclipse OpenJ9 VM-11.0.1) через.

Выход OpenJDK -

readOnly: 12
writeOnly: 16
----
readOnly: 12
writeOnly: 144

Выход OpenJ9

1012

Программа

import sun.misc.Unsafe;

import java.lang.reflect.Field;
import java.lang.reflect.Modifier;

public class Main {
    public static class Baseline {
        int readOnly;
        int writeOnly;
    }

    public static class Contended {
        int readOnly;

        @sun.misc.Contended
        int writeOnly;
    }

    public static void main(String[] args) throws Exception {
        Baseline b = new Baseline();
        Contended s = new Contended();

        printOffsets(b);
        System.out.println("----");
        printOffsets(s);
    }

    // https://blog.hazelcast.com/using-sun-misc-unsafe-in-java-9/
    @SuppressWarnings("restriction")
    private static Unsafe getUnsafe() throws NoSuchFieldException, IllegalAccessException {
        Field singleoneInstanceField = Unsafe.class.getDeclaredField("theUnsafe");
        singleoneInstanceField.setAccessible(true);
        return (Unsafe) singleoneInstanceField.get(null);
    }

    // http://mishadoff.com/blog/java-magic-part-4-sun-dot-misc-dot-unsafe/
    public static void printOffsets(Object o) throws Exception {
        Unsafe u = getUnsafe();
        Class c = o.getClass();
        for (Field f : c.getDeclaredFields()) {
            if ((f.getModifiers() & Modifier.STATIC) == 0) {
                printOffset(u, f);
            }
        }
    }

    public static void printOffset(Unsafe u, Field f) {
            long offset = u.objectFieldOffset(f);
            System.out.println(f.getName() + ": " + offset);
    }
}

1 Ответ

0 голосов
/ 16 ноября 2018

В настоящее время OpenJ9 поддерживает @Contended только на уровне класса.

...