--- 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<StackObject[]> 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<StackObject[]> 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<RootThread> 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<RootThread> 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<RecordedEvent> 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<RecordedEvent> 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++;
}
}
+
}
-