Skip to content

Commit b14de7f

Browse files
committed
Do not capture entire module instanc at prepareInstrumentation
1 parent 3267e4c commit b14de7f

2 files changed

Lines changed: 17 additions & 16 deletions

File tree

dd-java-agent/agent-installer/src/main/java/datadog/trace/agent/tooling/CombiningTransformerBuilder.java

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -131,16 +131,25 @@ private void prepareInstrumentation(InstrumenterModule module, int instrumentati
131131

132132
adviceShader = AdviceShader.with(module);
133133

134-
// Resolve helper names lazily, so agent install doesn't load every module's generated $Muzzle
135-
// class.
134+
// Resolve helper names lazily, and capture only GC-neutral values (not the module instance)
135+
// so that the instrumenter can still be unloaded after setup, and load $Muzzle via the
136+
// extended class loader like the muzzle check does.
137+
final String instrumentationClass = module.getClass().getName();
138+
final String[] declaredHelperClassNames = module.helperClassNames();
139+
final boolean injectHelperDependencies = module.injectHelperDependencies();
136140
helperTransformer =
137141
new HelperTransformer(
138142
module.useAgentCodeSource(),
139143
adviceShader,
140144
module.getClass().getSimpleName(),
141145
() -> {
142-
String[] helperClassNames = module.getAllHelperClassNames();
143-
if (module.injectHelperDependencies()) {
146+
String[] helperClassNames =
147+
InstrumenterModule.loadStaticMuzzleHelperClassNames(
148+
Utils.getExtendedClassLoader(), instrumentationClass);
149+
if (null == helperClassNames) {
150+
helperClassNames = declaredHelperClassNames;
151+
}
152+
if (injectHelperDependencies) {
144153
helperClassNames = HelperScanner.withClassDependencies(helperClassNames);
145154
}
146155
return helperClassNames;

dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/InstrumenterModule.java

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -113,26 +113,18 @@ public static ReferenceMatcher loadStaticMuzzleReferences(
113113
}
114114

115115
/**
116-
* @return the full, load-ordered set of helper classes to inject into the user's classloader: the
117-
* helpers inferred at build time from the advice/helper byte-code, unioned with any {@link
118-
* #helperClassNames() manually-declared} additions. Falls back to {@link #helperClassNames()}
119-
* when no generated {@code $Muzzle} is available.
116+
* @return the build-time inferred and manually-declared helper class names captured by {@code
117+
* $Muzzle}, or {@code null} when none are available and fall back to {@link
118+
* #helperClassNames()}.
120119
*/
121-
public final String[] getAllHelperClassNames() {
122-
String[] generated =
123-
loadStaticMuzzleHelperClassNames(getClass().getClassLoader(), getClass().getName());
124-
return null != generated ? generated : helperClassNames();
125-
}
126-
127-
static String[] loadStaticMuzzleHelperClassNames(
120+
public static String[] loadStaticMuzzleHelperClassNames(
128121
ClassLoader classLoader, String instrumentationClass) {
129122
String muzzleClass = instrumentationClass + "$Muzzle";
130123
try {
131124
// helper class names captured at build-time; see MuzzleGenerator
132125
return (String[])
133126
classLoader.loadClass(muzzleClass).getMethod("helperClassNames").invoke(null);
134127
} catch (Throwable e) {
135-
// no generated helper list: caller falls back to helperClassNames()
136128
return null;
137129
}
138130
}

0 commit comments

Comments
 (0)