Как запустить JOL на Java 9?

Я пытаюсь запустить программу используя jol с Java 9 но без везения.

У меня есть следующая зависимость в pom.xml:

<dependency>
    <groupId>org.openjdk.jol</groupId>
    <artifactId>jol-core</artifactId>
    <version>0.9</version>
</dependency>

Программа проста:

package org.example;

import org.openjdk.jol.vm.VM;

public class Example {
    public static void main(String[] args) throws Throwable {
        System.out.println(VM.current().details());
    }
}

Дескриптор модуля:

module java9 {
    requires jol.core;
}

Когда я запускаю программу из IDEA, я вижу следующий вывод:

# WARNING: Unable to get Instrumentation. Dynamic Attach failed.
You may add this JAR as -javaagent manually, or supply -Djdk.attach.allowAttachSelf

я добавил -Djdk.attach.allowAttachSelf=true к аргументам виртуальной машины в IDEA, но это не помогло (все тот же вывод).

PS Я могу успешно запустить программу из classpath. Тем не менее, интересно, как запустить его из пути к модулю.

1 ответ

Ну, я попытался отладить это немного дальше и обнаружил, что причина предупреждения InstrumentationSupport пытается DYNAMIC_ATTACH при запуске приложения. Соответствующий раздел dynamicAttach где код на самом деле использует VirtualMachine является

String name = "com.sun.tools.attach.VirtualMachine";
try {
    // JDK 9+ makes this class available on class path
    vmClass = ClassLoader.getSystemClassLoader().loadClass(name);
...

Класс не загружен изначально разрешенными модулями, поскольку его пакет экспортируется из jdk.attach модуль, который в данный момент отсутствует в дескрипторе модуля. Следовательно, вы можете обновить использование модулей как:

module java9 {    // module name 'joltrial' in output
    requires jol.core;
    requires jdk.attach;
} 

и затем разрешите самостоятельное присоединение, используя опцию VM как:-

-Djdk.attach.allowAttachSelf=true

При выполнении общего кода [ VM.current().details() ], выходные данные должны включать детали как -

/Library/Java/JavaVirtualMachines/jdk-9.0.1.jdk/Contents/Home/bin/java -Djdk.attach.allowAttachSelf=true "-javaagent:/Applications/IntelliJ IDEA 2017.3 CE EAP.app/Contents/lib/idea_rt.jar=53783:/Applications/IntelliJ IDEA 2017.3 CE EAP.app/Contents/bin" -Dfile.encoding=UTF-8 -p .../joltrial/target/classes:.../.m2/repository/org/openjdk/jol/jol-core/0.9/jol-core-0.9.jar -m joltrial/com.Sample
# WARNING: Unable to attach Serviceability Agent. Unable to attach even with module exceptions: [org.openjdk.jol.vm.sa.SASupportException: Sense failed., org.openjdk.jol.vm.sa.SASupportException: Sense failed., org.openjdk.jol.vm.sa.SASupportException: Sense failed.]
# Running 64-bit HotSpot VM.
# Using compressed oop with 3-bit shift.
# Using compressed klass with 3-bit shift.
# WARNING | Compressed references base/shifts are guessed by the experiment!
# WARNING | Therefore, computed addresses are just guesses, and ARE NOT RELIABLE.
# WARNING | Make sure to attach Serviceability Agent to get the reliable addresses.
# Objects are 8 bytes aligned.
# Field sizes by type: 4, 1, 1, 2, 2, 4, 4, 8, 8 [bytes]
# Array element sizes: 4, 1, 1, 2, 2, 4, 4, 8, 8 [bytes]

Process finished with exit code 0
Другие вопросы по тегам