Skip to content

Commit db10955

Browse files
authored
Remove map based WeakCache implementation (#4846)
* Replace WeakCache usage with DDCaches.newFixedSizeWeakKeyCache * Bump ClassLoaderMatchers and InstrumenterState caches based on tests with large modular web-apps * Reduce seenDomains cache capacity based on tests with large modular web-apps * Multiply identityHashCode by -127 to get a better spread
1 parent ef93a5d commit db10955

File tree

12 files changed

+32
-231
lines changed

12 files changed

+32
-231
lines changed

dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/WeakCache.java

Lines changed: 0 additions & 29 deletions
This file was deleted.

dd-java-agent/agent-builder/src/main/java/datadog/trace/agent/tooling/AgentInstaller.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,9 +41,8 @@ public class AgentInstaller {
4141

4242
static {
4343
addByteBuddyRawSetting();
44-
// register weak map/cache suppliers as early as possible
44+
// register weak map supplier as early as possible
4545
WeakMaps.registerAsSupplier();
46-
WeakCaches.registerAsSupplier();
4746
}
4847

4948
public static void installBytebuddyAgent(final Instrumentation inst) {

dd-java-agent/agent-builder/src/main/java/datadog/trace/agent/tooling/bytebuddy/DDCachingPoolStrategy.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@
44
import static datadog.trace.bootstrap.AgentClassLoading.LOCATING_CLASS;
55

66
import com.googlecode.concurrentlinkedhashmap.ConcurrentLinkedHashMap;
7-
import datadog.trace.agent.tooling.WeakCaches;
87
import datadog.trace.api.InstrumenterConfig;
9-
import datadog.trace.bootstrap.WeakCache;
8+
import datadog.trace.api.cache.DDCache;
9+
import datadog.trace.api.cache.DDCaches;
1010
import java.lang.ref.WeakReference;
1111
import java.util.concurrent.ConcurrentMap;
1212
import java.util.function.Function;
@@ -74,8 +74,8 @@ public static void registerAsSupplier() {
7474
* <li>Allow for quick fast path equivalence check of composite keys
7575
* </ul>
7676
*/
77-
final WeakCache<ClassLoader, WeakReference<ClassLoader>> loaderRefCache =
78-
WeakCaches.newWeakCache(LOADER_CAPACITY);
77+
final DDCache<ClassLoader, WeakReference<ClassLoader>> loaderRefCache =
78+
DDCaches.newFixedSizeWeakKeyCache(LOADER_CAPACITY);
7979

8080
/**
8181
* Single shared Type.Resolution cache -- uses a composite key -- conceptually of loader & name

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package datadog.trace.agent.tooling;
22

3-
import datadog.trace.bootstrap.WeakCache;
3+
import datadog.trace.api.cache.DDCache;
4+
import datadog.trace.api.cache.DDCaches;
45
import datadog.trace.util.Strings;
56
import java.util.Arrays;
67
import java.util.concurrent.atomic.AtomicLongArray;
@@ -32,8 +33,8 @@ public interface Observer {
3233
private static long[] defaultState = {};
3334

3435
/** Tracks which instrumentations were applied (per-class-loader) and which were blocked. */
35-
private static final WeakCache<ClassLoader, AtomicLongArray> classLoaderStates =
36-
WeakCaches.newWeakCache(64);
36+
private static final DDCache<ClassLoader, AtomicLongArray> classLoaderStates =
37+
DDCaches.newFixedSizeWeakKeyCache(512);
3738

3839
private static Observer observer;
3940

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

Lines changed: 0 additions & 90 deletions
This file was deleted.

dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/bytebuddy/ClassFileLocators.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@
44
import static datadog.trace.util.Strings.getResourceName;
55

66
import datadog.trace.agent.tooling.Utils;
7-
import datadog.trace.agent.tooling.WeakCaches;
87
import datadog.trace.api.InstrumenterConfig;
9-
import datadog.trace.bootstrap.WeakCache;
8+
import datadog.trace.api.cache.DDCache;
9+
import datadog.trace.api.cache.DDCaches;
1010
import java.io.IOException;
1111
import java.io.InputStream;
1212
import java.lang.ref.WeakReference;
@@ -22,8 +22,8 @@
2222
* cannot find the desired resource, check up the classloader hierarchy until a resource is found.
2323
*/
2424
public final class ClassFileLocators {
25-
private static final WeakCache<ClassLoader, DDClassFileLocator> classFileLocators =
26-
WeakCaches.newWeakCache(64);
25+
private static final DDCache<ClassLoader, DDClassFileLocator> classFileLocators =
26+
DDCaches.newFixedSizeWeakKeyCache(64);
2727

2828
private static final ClassFileLocator bootClassFileLocator =
2929
new ClassFileLocator() {

dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/bytebuddy/TypeInfoCache.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
package datadog.trace.agent.tooling.bytebuddy;
22

33
import com.googlecode.concurrentlinkedhashmap.ConcurrentLinkedHashMap;
4-
import datadog.trace.agent.tooling.WeakCaches;
5-
import datadog.trace.bootstrap.WeakCache;
4+
import datadog.trace.api.cache.DDCache;
5+
import datadog.trace.api.cache.DDCaches;
66
import java.lang.ref.WeakReference;
77
import java.net.URL;
88
import java.util.Objects;
@@ -58,7 +58,8 @@ private static LoaderId loaderId(ClassLoader loader) {
5858
static final ClassLoader BOOTSTRAP_LOADER = null;
5959
static final LoaderId BOOTSTRAP_LOADER_ID = null;
6060

61-
private static final WeakCache<ClassLoader, LoaderId> loaderIds = WeakCaches.newWeakCache(64);
61+
private static final DDCache<ClassLoader, LoaderId> loaderIds =
62+
DDCaches.newFixedSizeWeakKeyCache(64);
6263

6364
/** Supports classloader comparisons without strongly referencing the classloader. */
6465
private static final class LoaderId extends WeakReference<ClassLoader> {

dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/bytebuddy/matcher/ClassLoaderMatchers.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@
33
import static datadog.trace.bootstrap.AgentClassLoading.PROBING_CLASSLOADER;
44
import static net.bytebuddy.matcher.ElementMatchers.any;
55

6-
import datadog.trace.agent.tooling.WeakCaches;
76
import datadog.trace.api.InstrumenterConfig;
87
import datadog.trace.api.Tracer;
8+
import datadog.trace.api.cache.DDCache;
9+
import datadog.trace.api.cache.DDCaches;
910
import datadog.trace.bootstrap.PatchLogger;
10-
import datadog.trace.bootstrap.WeakCache;
1111
import datadog.trace.util.Strings;
1212
import java.util.ArrayList;
1313
import java.util.BitSet;
@@ -128,7 +128,7 @@ private static boolean loadsExpectedClass(
128128
static final List<String> hasClassResourceNames = new ArrayList<>();
129129

130130
/** Cache of classloader-instance -> has-class mask. */
131-
static final WeakCache<ClassLoader, BitSet> hasClassCache = WeakCaches.newWeakCache(64);
131+
static final DDCache<ClassLoader, BitSet> hasClassCache = DDCaches.newFixedSizeWeakKeyCache(512);
132132

133133
/** Distinct result used to mark an incompatible classloader that the tracer should skip. */
134134
static final BitSet INCOMPATIBLE_CLASS_LOADER = new BitSet();

dd-java-agent/agent-tooling/src/test/groovy/datadog/trace/agent/tooling/WeakCacheTest.groovy

Lines changed: 0 additions & 84 deletions
This file was deleted.

internal-api/src/main/java/datadog/trace/api/cache/FixedSizeCache.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,8 @@ static final class IdentityHash<K, V> extends FixedSizeCache<K, V> {
139139
}
140140

141141
int hash(K key) {
142-
return System.identityHashCode(key);
142+
int hash = System.identityHashCode(key);
143+
return hash - (hash << 7); // multiply by -127 to improve identityHashCode spread
143144
}
144145

145146
boolean equals(K key, Pair<K, V> current) {

internal-api/src/main/java/datadog/trace/api/cache/FixedSizeWeakKeyCache.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ public final V computeIfAbsent(K key, Function<K, ? extends V> producer) {
6464

6565
int hash = System.identityHashCode(key);
6666

67-
int h = hash;
67+
int h = hash - (hash << 7); // multiply by -127 to improve identityHashCode spread
6868
int firstPos = h & mask;
6969
V value;
7070

telemetry/src/main/java/datadog/telemetry/dependency/LocationsCollectingTransformer.java

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package datadog.telemetry.dependency;
22

3-
import datadog.trace.agent.tooling.WeakCaches;
4-
import datadog.trace.bootstrap.WeakCache;
3+
import datadog.trace.api.cache.DDCache;
4+
import datadog.trace.api.cache.DDCaches;
55
import java.lang.instrument.ClassFileTransformer;
66
import java.net.URL;
77
import java.security.CodeSource;
@@ -12,14 +12,16 @@
1212
class LocationsCollectingTransformer implements ClassFileTransformer {
1313
private static final Logger log = LoggerFactory.getLogger(LocationsCollectingTransformer.class);
1414

15-
private static final int MAX_CACHED_JARS = 4096;
15+
private static final int MAX_CACHED_JARS = 1024;
1616
private final DependencyServiceImpl dependencyService;
17-
private final WeakCache<ProtectionDomain, Boolean> seenDomains =
18-
WeakCaches.newWeakCache(MAX_CACHED_JARS);
17+
private final DDCache<ProtectionDomain, Boolean> seenDomains =
18+
DDCaches.newFixedSizeWeakKeyCache(MAX_CACHED_JARS);
19+
20+
private final ProtectionDomain tracerDomain =
21+
LocationsCollectingTransformer.class.getProtectionDomain();
1922

2023
public LocationsCollectingTransformer(DependencyServiceImpl dependencyService) {
2124
this.dependencyService = dependencyService;
22-
seenDomains.put(LocationsCollectingTransformer.class.getProtectionDomain(), true);
2325
}
2426

2527
@Override
@@ -29,7 +31,7 @@ public byte[] transform(
2931
Class<?> classBeingRedefined,
3032
ProtectionDomain protectionDomain,
3133
byte[] classfileBuffer) {
32-
if (protectionDomain != null) {
34+
if (protectionDomain != null && !protectionDomain.equals(tracerDomain)) {
3335
seenDomains.computeIfAbsent(protectionDomain, this::addDependency);
3436
}
3537
// returning 'null' is the best way to indicate that no transformation has been done.

0 commit comments

Comments
 (0)