test/jdk/jdk/jfr/event/oldobject/TestLargeRootSet.java
changeset 58863 c16ac7a2eba4
parent 51991 ad00713a0562
equal deleted inserted replaced
58861:2c3cc4b01880 58863:c16ac7a2eba4
    24  */
    24  */
    25 package jdk.jfr.event.oldobject;
    25 package jdk.jfr.event.oldobject;
    26 
    26 
    27 import java.util.ArrayList;
    27 import java.util.ArrayList;
    28 import java.util.List;
    28 import java.util.List;
       
    29 import java.util.Random;
       
    30 import java.util.Vector;
    29 import java.util.concurrent.BrokenBarrierException;
    31 import java.util.concurrent.BrokenBarrierException;
    30 import java.util.concurrent.CyclicBarrier;
    32 import java.util.concurrent.CyclicBarrier;
    31 
    33 
    32 import jdk.jfr.Recording;
    34 import jdk.jfr.Recording;
    33 import jdk.jfr.consumer.RecordedClass;
    35 import jdk.jfr.consumer.RecordedClass;
    34 import jdk.jfr.consumer.RecordedEvent;
    36 import jdk.jfr.consumer.RecordedEvent;
       
    37 import jdk.jfr.consumer.RecordedFrame;
       
    38 import jdk.jfr.consumer.RecordedMethod;
    35 import jdk.jfr.consumer.RecordedObject;
    39 import jdk.jfr.consumer.RecordedObject;
       
    40 import jdk.jfr.consumer.RecordedStackTrace;
    36 import jdk.jfr.internal.test.WhiteBox;
    41 import jdk.jfr.internal.test.WhiteBox;
    37 import jdk.test.lib.Asserts;
       
    38 import jdk.test.lib.jfr.EventNames;
    42 import jdk.test.lib.jfr.EventNames;
    39 import jdk.test.lib.jfr.Events;
    43 import jdk.test.lib.jfr.Events;
    40 
    44 
    41 /**
    45 /**
    42  * @test
    46  * @test
    48  * @run main/othervm -XX:TLABSize=2k jdk.jfr.event.oldobject.TestLargeRootSet
    52  * @run main/othervm -XX:TLABSize=2k jdk.jfr.event.oldobject.TestLargeRootSet
    49  */
    53  */
    50 public class TestLargeRootSet {
    54 public class TestLargeRootSet {
    51 
    55 
    52     private static final int THREAD_COUNT = 50;
    56     private static final int THREAD_COUNT = 50;
       
    57     private static final Random RANDOM = new Random(4711);
       
    58     public static Vector<StackObject[]> temporaries = new Vector<>(OldObjects.MIN_SIZE);
    53 
    59 
    54     private static class RootThread extends Thread {
    60     private static class RootThread extends Thread {
    55         private final CyclicBarrier barrier;
    61         private final CyclicBarrier barrier;
    56         private int maxDepth = OldObjects.MIN_SIZE / THREAD_COUNT;
    62         private int maxDepth = OldObjects.MIN_SIZE / THREAD_COUNT;
    57 
       
    58         public List<StackObject[]> temporaries = new ArrayList<>(maxDepth);
       
    59 
    63 
    60         RootThread(CyclicBarrier cb) {
    64         RootThread(CyclicBarrier cb) {
    61             this.barrier = cb;
    65             this.barrier = cb;
    62         }
    66         }
    63 
    67 
    65             buildRootObjects();
    69             buildRootObjects();
    66         }
    70         }
    67 
    71 
    68         private void buildRootObjects() {
    72         private void buildRootObjects() {
    69             if (maxDepth-- > 0) {
    73             if (maxDepth-- > 0) {
    70                 // Allocate array to trigger sampling code path for interpreter / c1
    74                 // Allocate array to trigger sampling code path for interpreter
    71                 StackObject[] stackObject = new StackObject[0];
    75                 // / c1
       
    76                 StackObject[] stackObject = new StackObject[RANDOM.nextInt(7)];
    72                 temporaries.add(stackObject); // make sure object escapes
    77                 temporaries.add(stackObject); // make sure object escapes
    73                 buildRootObjects();
    78                 buildRootObjects();
    74             } else {
    79             } else {
    75                 temporaries.clear();
    80                 temporaries.clear();
    76                 try {
    81                 try {
    89     private static class StackObject {
    94     private static class StackObject {
    90     }
    95     }
    91 
    96 
    92     public static void main(String[] args) throws Exception {
    97     public static void main(String[] args) throws Exception {
    93         WhiteBox.setWriteAllObjectSamples(true);
    98         WhiteBox.setWriteAllObjectSamples(true);
    94 
    99         int attempt = 1;
    95         List<RootThread> threads = new ArrayList<>();
   100         while (true) {
    96         try (Recording r = new Recording()) {
   101             System.out.println();
    97             r.enable(EventNames.OldObjectSample).withStackTrace().with("cutoff", "infinity");
   102             System.out.println();
    98             r.start();
   103             System.out.println("ATTEMPT: " + attempt);
    99             CyclicBarrier cb = new CyclicBarrier(THREAD_COUNT + 1);
   104             System.out.println("====================================");
   100             for (int i = 0; i < THREAD_COUNT; i++) {
   105             List<RootThread> threads = new ArrayList<>();
   101                 RootThread t = new RootThread(cb);
   106             try (Recording r = new Recording()) {
   102                 t.start();
   107                 r.enable(EventNames.OldObjectSample).withStackTrace().with("cutoff", "infinity");
   103                 if (i % 10 == 0) {
   108                 r.start();
   104                     // Give threads some breathing room before starting next batch
   109                 CyclicBarrier cb = new CyclicBarrier(THREAD_COUNT + 1);
   105                     Thread.sleep(100);
   110                 for (int i = 0; i < THREAD_COUNT; i++) {
       
   111                     RootThread t = new RootThread(cb);
       
   112                     t.start();
       
   113                     if (i % 10 == 0) {
       
   114                         // Give threads some breathing room before starting next
       
   115                         // batch
       
   116                         Thread.sleep(100);
       
   117                     }
       
   118                     threads.add(t);
   106                 }
   119                 }
   107                 threads.add(t);
   120                 cb.await();
   108             }
   121                 System.gc();
   109             cb.await();
   122                 r.stop();
   110             System.gc();
   123                 cb.await();
   111             r.stop();
   124                 List<RecordedEvent> events = Events.fromRecording(r);
   112             cb.await();
   125                 Events.hasEvents(events);
   113             List<RecordedEvent> events = Events.fromRecording(r);
   126                 int sample = 0;
   114             Events.hasEvents(events);
   127                 for (RecordedEvent e : events) {
   115             for (RecordedEvent e : events) {
   128                     RecordedObject ro = e.getValue("object");
   116                 RecordedObject ro = e.getValue("object");
   129                     RecordedClass rc = ro.getValue("type");
   117                 RecordedClass rc = ro.getValue("type");
   130                     System.out.println("Sample: " + sample);
   118                 System.out.println(rc.getName());
   131                     System.out.println(" - allocationTime: " + e.getInstant("allocationTime"));
   119                 if (rc.getName().equals(StackObject[].class.getName())) {
   132                     System.out.println(" - type: " + rc.getName());
   120                     return; // ok
   133                     RecordedObject root = e.getValue("root");
       
   134                     if (root != null) {
       
   135                         System.out.println(" - root:");
       
   136                         System.out.println("   - description: " + root.getValue("description"));
       
   137                         System.out.println("   - system: " + root.getValue("system"));
       
   138                         System.out.println("   - type: " + root.getValue("type"));
       
   139                     } else {
       
   140                         System.out.println(" - root: N/A");
       
   141                     }
       
   142                     RecordedStackTrace stack = e.getStackTrace();
       
   143                     if (stack != null) {
       
   144                         System.out.println(" - stack:");
       
   145                         int frameCount = 0;
       
   146                         for (RecordedFrame frame : stack.getFrames()) {
       
   147                             RecordedMethod m = frame.getMethod();
       
   148                             System.out.println("      " + m.getType().getName() + "." + m.getName() + "(...)");
       
   149                             frameCount++;
       
   150                             if (frameCount == 10) {
       
   151                                 break;
       
   152                             }
       
   153                         }
       
   154                     } else {
       
   155                         System.out.println(" - stack: N/A");
       
   156                     }
       
   157                     System.out.println();
       
   158                     if (rc.getName().equals(StackObject[].class.getName())) {
       
   159                         return; // ok
       
   160                     }
       
   161                     sample++;
   121                 }
   162                 }
   122             }
   163             }
   123             Asserts.fail("Could not find root object");
   164             attempt++;
   124         }
   165         }
   125     }
   166     }
       
   167 
   126 }
   168 }
   127