MuzzleWeakReferenceTest.java 1.3 KB

1234567891011121314151617181920212223242526272829303132
  1. package muzzle;
  2. import datadog.trace.agent.tooling.muzzle.Reference;
  3. import datadog.trace.agent.tooling.muzzle.ReferenceCreator;
  4. import datadog.trace.agent.tooling.muzzle.ReferenceMatcher;
  5. import datadog.trace.util.gc.GCUtils;
  6. import java.lang.ref.WeakReference;
  7. import java.net.URL;
  8. import java.net.URLClassLoader;
  9. public class MuzzleWeakReferenceTest {
  10. /*
  11. * Spock holds strong references to all local variables. For weak reference testing we must create our strong references away from Spock in this java class.
  12. *
  13. * Even returning a WeakReference<ClassLoader> is enough for spock to create a strong ref.
  14. */
  15. public static boolean classLoaderRefIsGarbageCollected() throws InterruptedException {
  16. ClassLoader loader = new URLClassLoader(new URL[0], null);
  17. final WeakReference<ClassLoader> clRef = new WeakReference<>(loader);
  18. final Reference[] refs =
  19. ReferenceCreator.createReferencesFrom(
  20. TestClasses.MethodBodyAdvice.class.getName(),
  21. MuzzleWeakReferenceTest.class.getClassLoader())
  22. .values()
  23. .toArray(new Reference[0]);
  24. final ReferenceMatcher refMatcher = new ReferenceMatcher(refs);
  25. refMatcher.getMismatchedReferenceSources(loader);
  26. loader = null;
  27. GCUtils.awaitGC(clRef);
  28. return clRef.get() == null;
  29. }
  30. }