On 19/05/2017 08:08, Rafael Winterhalter wrote:
Hi Alan,
I just retested with the most recent Java 9 snapshot and this is what
I get:
rafael@rafc:~/jdk9-test/greetingsapp$ ./bin/java
-javaagent:/home/rafael/.m2/repository/sample-agent/sample-agent/1.0-SNAPSHOT/sample-agent-1.0-SNAPSHOT.jar
-m com.greetings/com.greetings.Main
Error occurred during initialization of VM
Could not find agent library instrument on the library path, with
error: libinstrument.so: cannot open shared object file: No such file
or directory
rafael@rafc:~/jdk9-test/greetingsapp$ ./bin/java --add-modules
java.instrument
-javaagent:/home/rafael/.m2/repository/sample-agent/sample-agent/1.0-SNAPSHOT/sample-agent-1.0-SNAPSHOT.jar
-m com.greetings/com.greetings.Main
Error occurred during initialization of VM
Could not find agent library instrument on the library path, with
error: libinstrument.so: cannot open shared object file: No such file
or directory
rafael@rafc:~/jdk9-test/greetingsapp$ ./bin/java --add-modules
java.instrument -m com.greetings/com.greetings.MainError occurred
during initialization of boot layer
java.lang.module.FindException: Module java.instrument not found
Do I understand you correctly that you expect the last outcome also as
a result for the first command?
If the run-time image does not contain java.instrument then the error
for each of these cases should be like the last one ("Module
java.instrument not found"). We have it right for -Dcom.sun.management.*
and -XX:+EnableJVMCI but not -javaagent. The reason for the strange
error with -javaagent is because java agents are implemented as a JVM TI
agent that is loaded early in VM startup, long before the root modules
are resolved. I will create a bug for this.
I argue that this outcome would still be rather suprising for most
Java users. Many monitoring tools use Java agents to hook into Java
processes and those tools have become omnipresent in most production
environments. Also, it is very unlikely that a main application module
would require the java.instrument module as it is only useful to Java
agents. As a result, Java agents and the tooling that relies on them
would stop working for the majority of jlink modules. Furthermore, the
agent attachment also fails if a Javaagent does not require the
Instrumentation interface what makes this problem even less intuitive.
(The reason being the lack of libinstrument.)
The jlink user is a power user and so decides the modules and features
to include in the run-time image.
If the jlink user doesn't select the VM type when creating the run-time
image then the attach mechanism will work (because it is compiled into
libjvm.so) and the troubleshooting tools should work fine. However some
features that are exposed via the attach mechanism may not be present,
specifically VirtualMachine.startManagementAgent and
VirtualMachine.startLocalManagementAgent will fail if module
jdk.management.agent is not included, and VirtualMachine.loadAgent will
fail if module java.instrument is not included.
If the jlink user is targeting an embedded system or wants to create a
minimal image to put in a docker container then maybe they select the
minimal VM, in which case the serviceability features (including the VM
side of the attach mechanism) are not included. It gets harder again for
troubleshooting when additional jlink power options are used to strip
debug attributes. That's the trade-off.
As I said, the goal has always been to allow someone create a run-time
image that only contains java.base. I'm not sure that subsuming
java.instrument into java.base is right. Introducing options to ask
jlink to exclude modules creates the potential for conflict on the
command line. One thing that jlink could do is emit a warning that the
resulting run-time image doesn't have the management and instrumentation
features, might that be the right balance.
On the above machine, a jlink image is incapable of starting despite
the _JAVA_OPTIONS only specifying standard features that are
guaranteed by the JVM independently of a specific VM vendor.
There isn't any guarantee, a point that was clarified in the
java.instrument spec in Java SE 8 (JDK-8006565). The motivation for the
clarification at the time was embedded deployments and the Compact
Profiles defined for Java SE 8 (compact1 and compact2 didn't include the
java.lang.instrument package).
-Alan