diff -r 2c3cc4b01880 -r c16ac7a2eba4 test/jdk/jdk/jfr/event/oldobject/TestLargeRootSet.java --- a/test/jdk/jdk/jfr/event/oldobject/TestLargeRootSet.java Wed Oct 30 16:14:56 2019 +0100 +++ b/test/jdk/jdk/jfr/event/oldobject/TestLargeRootSet.java Wed Oct 30 19:43:52 2019 +0100 @@ -26,15 +26,19 @@ import java.util.ArrayList; import java.util.List; +import java.util.Random; +import java.util.Vector; import java.util.concurrent.BrokenBarrierException; import java.util.concurrent.CyclicBarrier; import jdk.jfr.Recording; import jdk.jfr.consumer.RecordedClass; import jdk.jfr.consumer.RecordedEvent; +import jdk.jfr.consumer.RecordedFrame; +import jdk.jfr.consumer.RecordedMethod; import jdk.jfr.consumer.RecordedObject; +import jdk.jfr.consumer.RecordedStackTrace; import jdk.jfr.internal.test.WhiteBox; -import jdk.test.lib.Asserts; import jdk.test.lib.jfr.EventNames; import jdk.test.lib.jfr.Events; @@ -50,13 +54,13 @@ public class TestLargeRootSet { private static final int THREAD_COUNT = 50; + private static final Random RANDOM = new Random(4711); + public static Vector temporaries = new Vector<>(OldObjects.MIN_SIZE); private static class RootThread extends Thread { private final CyclicBarrier barrier; private int maxDepth = OldObjects.MIN_SIZE / THREAD_COUNT; - public List temporaries = new ArrayList<>(maxDepth); - RootThread(CyclicBarrier cb) { this.barrier = cb; } @@ -67,8 +71,9 @@ private void buildRootObjects() { if (maxDepth-- > 0) { - // Allocate array to trigger sampling code path for interpreter / c1 - StackObject[] stackObject = new StackObject[0]; + // Allocate array to trigger sampling code path for interpreter + // / c1 + StackObject[] stackObject = new StackObject[RANDOM.nextInt(7)]; temporaries.add(stackObject); // make sure object escapes buildRootObjects(); } else { @@ -91,37 +96,73 @@ public static void main(String[] args) throws Exception { WhiteBox.setWriteAllObjectSamples(true); - - List threads = new ArrayList<>(); - try (Recording r = new Recording()) { - r.enable(EventNames.OldObjectSample).withStackTrace().with("cutoff", "infinity"); - r.start(); - CyclicBarrier cb = new CyclicBarrier(THREAD_COUNT + 1); - for (int i = 0; i < THREAD_COUNT; i++) { - RootThread t = new RootThread(cb); - t.start(); - if (i % 10 == 0) { - // Give threads some breathing room before starting next batch - Thread.sleep(100); + int attempt = 1; + while (true) { + System.out.println(); + System.out.println(); + System.out.println("ATTEMPT: " + attempt); + System.out.println("===================================="); + List threads = new ArrayList<>(); + try (Recording r = new Recording()) { + r.enable(EventNames.OldObjectSample).withStackTrace().with("cutoff", "infinity"); + r.start(); + CyclicBarrier cb = new CyclicBarrier(THREAD_COUNT + 1); + for (int i = 0; i < THREAD_COUNT; i++) { + RootThread t = new RootThread(cb); + t.start(); + if (i % 10 == 0) { + // Give threads some breathing room before starting next + // batch + Thread.sleep(100); + } + threads.add(t); } - threads.add(t); - } - cb.await(); - System.gc(); - r.stop(); - cb.await(); - List events = Events.fromRecording(r); - Events.hasEvents(events); - for (RecordedEvent e : events) { - RecordedObject ro = e.getValue("object"); - RecordedClass rc = ro.getValue("type"); - System.out.println(rc.getName()); - if (rc.getName().equals(StackObject[].class.getName())) { - return; // ok + cb.await(); + System.gc(); + r.stop(); + cb.await(); + List events = Events.fromRecording(r); + Events.hasEvents(events); + int sample = 0; + for (RecordedEvent e : events) { + RecordedObject ro = e.getValue("object"); + RecordedClass rc = ro.getValue("type"); + System.out.println("Sample: " + sample); + System.out.println(" - allocationTime: " + e.getInstant("allocationTime")); + System.out.println(" - type: " + rc.getName()); + RecordedObject root = e.getValue("root"); + if (root != null) { + System.out.println(" - root:"); + System.out.println(" - description: " + root.getValue("description")); + System.out.println(" - system: " + root.getValue("system")); + System.out.println(" - type: " + root.getValue("type")); + } else { + System.out.println(" - root: N/A"); + } + RecordedStackTrace stack = e.getStackTrace(); + if (stack != null) { + System.out.println(" - stack:"); + int frameCount = 0; + for (RecordedFrame frame : stack.getFrames()) { + RecordedMethod m = frame.getMethod(); + System.out.println(" " + m.getType().getName() + "." + m.getName() + "(...)"); + frameCount++; + if (frameCount == 10) { + break; + } + } + } else { + System.out.println(" - stack: N/A"); + } + System.out.println(); + if (rc.getName().equals(StackObject[].class.getName())) { + return; // ok + } + sample++; } } - Asserts.fail("Could not find root object"); + attempt++; } } + } -