Skip to content

Commit 64f2be4

Browse files
committed
GH-172 load SA library from jmod file on JDK 9+
1 parent c790568 commit 64f2be4

File tree

5 files changed

+42
-26
lines changed

5 files changed

+42
-26
lines changed

visualvm/launcher/visualvm.conf

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
#
2-
# Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved.
2+
# Copyright (c) 2007, 2020, Oracle and/or its affiliates. All rights reserved.
33
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
#
55
# This code is free software; you can redistribute it and/or modify it
@@ -58,7 +58,7 @@ visualvm_default_cachedir="${DEFAULT_CACHEDIR_ROOT}/dev"
5858
# (can be overridden by explicit command line switches)
5959
#
6060

61-
visualvm_default_options="-J-client -J-Xms24m -J-Xmx768m -J-Dnetbeans.accept_license_class=org.graalvm.visualvm.modules.startup.AcceptLicense -J-Dsun.jvmstat.perdata.syncWaitMs=10000 -J-Dsun.java2d.noddraw=true -J-Dsun.java2d.d3d=false -J-Dorg.netbeans.core.TimeableEventQueue.quantum=360000 -J-Dpolyglot.js.nashorn-compat=true -J--add-exports=java.desktop/sun.awt=ALL-UNNAMED -J--add-exports=jdk.internal.jvmstat/sun.jvmstat.monitor.event=ALL-UNNAMED -J--add-exports=jdk.internal.jvmstat/sun.jvmstat.monitor=ALL-UNNAMED -J--add-exports=java.desktop/sun.swing=ALL-UNNAMED -J--add-exports=jdk.attach/sun.tools.attach=ALL-UNNAMED -J--add-opens=java.base/java.net=ALL-UNNAMED -J--add-opens=java.base/java.lang.ref=ALL-UNNAMED -J--add-opens=java.base/java.lang=ALL-UNNAMED -J--add-opens=java.desktop/javax.swing=ALL-UNNAMED -J--add-opens=java.desktop/javax.swing.plaf.basic=ALL-UNNAMED -J-XX:+IgnoreUnrecognizedVMOptions -J-Dnetbeans.logger.console=true -J-ea"
61+
visualvm_default_options="-J-client -J-Xms24m -J-Xmx768m -J-Dnetbeans.accept_license_class=org.graalvm.visualvm.modules.startup.AcceptLicense -J-Dsun.jvmstat.perdata.syncWaitMs=10000 -J-Dsun.java2d.noddraw=true -J-Dsun.java2d.d3d=false -J-Dorg.netbeans.core.TimeableEventQueue.quantum=360000 -J-Dpolyglot.js.nashorn-compat=true -J-Dsun.misc.URLClassPath.disableJarChecking=true -J--add-exports=java.desktop/sun.awt=ALL-UNNAMED -J--add-exports=jdk.internal.jvmstat/sun.jvmstat.monitor.event=ALL-UNNAMED -J--add-exports=jdk.internal.jvmstat/sun.jvmstat.monitor=ALL-UNNAMED -J--add-exports=java.desktop/sun.swing=ALL-UNNAMED -J--add-exports=jdk.attach/sun.tools.attach=ALL-UNNAMED -J--add-opens=java.base/java.net=ALL-UNNAMED -J--add-opens=java.base/java.lang.ref=ALL-UNNAMED -J--add-opens=java.base/java.lang=ALL-UNNAMED -J--add-opens=java.desktop/javax.swing=ALL-UNNAMED -J--add-opens=java.desktop/javax.swing.plaf.basic=ALL-UNNAMED -J-XX:+IgnoreUnrecognizedVMOptions -J-Dnetbeans.logger.console=true -J-ea"
6262
# for development purposes you may wish to append: -J-Dnetbeans.logger.console=true -J-ea
6363

6464
# Default location of JDK:

visualvm/sa/src/org/graalvm/visualvm/sa/Agent.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -39,12 +39,12 @@ class Agent {
3939

4040
private static Map<File,Agent> agentMap = new HashMap();
4141

42-
static Agent getAgent(File jdkHome,File saJarFile) throws ClassNotFoundException, InstantiationException, IllegalAccessException, MalformedURLException {
42+
static Agent getAgent(File jdkHome,File saLibFile) throws ClassNotFoundException, InstantiationException, IllegalAccessException, MalformedURLException {
4343
synchronized (agentMap) {
44-
Agent agent = agentMap.get(saJarFile);
44+
Agent agent = agentMap.get(saLibFile);
4545
if (agent == null) {
46-
agent = new Agent(jdkHome,saJarFile);
47-
agentMap.put(saJarFile,agent);
46+
agent = new Agent(jdkHome,saLibFile);
47+
agentMap.put(saLibFile,agent);
4848
}
4949
return agent;
5050
}
@@ -55,8 +55,8 @@ static Agent getAgent(File jdkHome,File saJarFile) throws ClassNotFoundException
5555
private VM vm;
5656
private Arguments args;
5757

58-
private Agent(File jdkHome,File saJarFile) throws ClassNotFoundException, InstantiationException, IllegalAccessException, MalformedURLException {
59-
saClassLoader = new SAWrapper(jdkHome,saJarFile);
58+
private Agent(File jdkHome,File saLibFile) throws ClassNotFoundException, InstantiationException, IllegalAccessException, MalformedURLException {
59+
saClassLoader = new SAWrapper(jdkHome,saLibFile);
6060
hotspotAgent = new SAObject(saClassLoader.HotSpotAgent().newInstance());
6161
}
6262

visualvm/sa/src/org/graalvm/visualvm/sa/SAWrapper.java

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -41,21 +41,28 @@ class SAWrapper {
4141
URLClassLoader loader;
4242
File libraryPath;
4343

44-
SAWrapper(File jdkHome, File saJarFile) throws MalformedURLException {
44+
SAWrapper(File jdkHome, File saLibFile) throws MalformedURLException {
4545
// By default SA agent classes prefer dbx debugger to proc debugger
4646
// and Windows process debugger to windbg debugger. SA expects
4747
// special properties to be set to choose other debuggers.
4848
// We will set those here before attaching to SA agent.
4949
System.setProperty("sun.jvm.hotspot.debugger.useProcDebugger", "true"); // NOI18N
5050
System.setProperty("sun.jvm.hotspot.debugger.useWindbgDebugger", "true"); // NOI18N
51-
URL[] saJarUrls = new URL[]{saJarFile.toURI().toURL()};
52-
String osArch = System.getProperty("os.arch"); // NOI18N
53-
if ("x86".equals(osArch)) {
54-
osArch = "i386";
51+
URL[] saLibUrls;
52+
if (saLibFile.getName().endsWith(".jmod")) { // NOI18N
53+
URL jmodUrl = new URL("jar:file:///"+saLibFile.getAbsolutePath()+"!/classes/"); // NOI18N
54+
saLibUrls = new URL[]{jmodUrl};
55+
libraryPath = new File(jdkHome, "lib/"); // NOI18N
56+
} else {
57+
saLibUrls = new URL[]{saLibFile.toURI().toURL()};
58+
String osArch = System.getProperty("os.arch"); // NOI18N
59+
if ("x86".equals(osArch)) {
60+
osArch = "i386";
61+
}
62+
libraryPath = new File(jdkHome, "jre/lib/" + osArch); // NOI18N
5563
}
56-
libraryPath = new File(jdkHome, "jre/lib/" + osArch); // NOI18N
5764
LOGGER.fine("Path " + libraryPath.getAbsolutePath()); // NOI18N
58-
loader = new URLClassLoader(saJarUrls) {
65+
loader = new URLClassLoader(saLibUrls) {
5966
@Override
6067
protected String findLibrary(String libname) {
6168
String name = System.mapLibraryName(libname);

visualvm/sa/src/org/graalvm/visualvm/sa/SaModelImpl.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -46,14 +46,14 @@ public class SaModelImpl extends SaModel {
4646
private String jvmArgs;
4747
private String commandLine;
4848

49-
SaModelImpl(File jdkHome,File sajar,int id) throws ClassNotFoundException, InstantiationException, IllegalAccessException, MalformedURLException, InvocationTargetException, NoSuchMethodException {
50-
agent = Agent.getAgent(jdkHome,sajar);
49+
SaModelImpl(File jdkHome,File saLib,int id) throws ClassNotFoundException, InstantiationException, IllegalAccessException, MalformedURLException, InvocationTargetException, NoSuchMethodException {
50+
agent = Agent.getAgent(jdkHome,saLib);
5151
pid = id;
5252
readData();
5353
}
5454

55-
SaModelImpl(File jdkHome,File sajar,File execFile,File coreFile) throws ClassNotFoundException, InstantiationException, IllegalAccessException, InvocationTargetException, MalformedURLException, NoSuchMethodException {
56-
agent = Agent.getAgent(jdkHome,sajar);
55+
SaModelImpl(File jdkHome,File saLib,File execFile,File coreFile) throws ClassNotFoundException, InstantiationException, IllegalAccessException, InvocationTargetException, MalformedURLException, NoSuchMethodException {
56+
agent = Agent.getAgent(jdkHome,saLib);
5757
executable = execFile.getAbsolutePath();
5858
core = coreFile.getAbsolutePath();
5959
readData();

visualvm/sa/src/org/graalvm/visualvm/sa/SaModelProvider.java

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ public class SaModelProvider extends AbstractModelProvider<SaModel, DataSource>
4747
private static final Logger LOGGER = Logger.getLogger(SaModelProvider.class.getName());
4848

4949
private static final String SA_JAR = "lib/sa-jdi.jar"; // NOI18N
50+
private static final String SA_JMOD = "jmods/jdk.hotspot.agent.jmod"; // NOI18N
5051

5152
SaModelProvider() {
5253
}
@@ -90,13 +91,13 @@ public SaModel createModelFor(DataSource ds) {
9091
File coreFile = coredump.getFile();
9192
if (executable.exists() && coreFile.exists()) {
9293
File jdkHome = executable.getParentFile().getParentFile();
93-
File saJar = getSaJar(jdkHome);
94+
File saLib = getSaJar(jdkHome);
9495

95-
if (saJar == null) {
96-
return null;
96+
if (saLib == null) {
97+
saLib = getSaJmod(jdkHome);
9798
}
9899
try {
99-
return new SaModelImpl(jdkHome,saJar,executable,coreFile);
100+
return new SaModelImpl(jdkHome,saLib,executable,coreFile);
100101
} catch (Exception ex) {
101102
LOGGER.log(Level.INFO, "Unable to retrieve SA agent", ex); // NOI18N
102103
}
@@ -118,9 +119,9 @@ private File getJdkHome(final JvmJvmstatModel jvmstat) {
118119
return null;
119120
}
120121

121-
static File getSaJar(File jdkHome) {
122+
private static File getJar(File jdkHome, String saName) {
122123
if (jdkHome != null) {
123-
File saJar = new File(jdkHome,SA_JAR);
124+
File saJar = new File(jdkHome,saName);
124125
try {
125126
if (saJar.exists()) {
126127
return saJar.getCanonicalFile();
@@ -131,7 +132,15 @@ static File getSaJar(File jdkHome) {
131132
}
132133
return null;
133134
}
134-
135+
136+
private static File getSaJar(File jdkHome) {
137+
return getJar(jdkHome, SA_JAR);
138+
}
139+
140+
private static File getSaJmod(File jdkHome) {
141+
return getJar(jdkHome, SA_JMOD);
142+
}
143+
135144
private static Boolean is64BitArchitecture(JvmJvmstatModel jvmstat) {
136145
String name = jvmstat.getVmName();
137146
if (name != null) {

0 commit comments

Comments
 (0)