test/hotspot/jtreg/serviceability/jvmti/HeapMonitor/MyPackage/HeapMonitor.java
author jcbeyler
Thu, 19 Jul 2018 18:21:24 -0700
changeset 51210 e750c1a054fa
parent 51138 914f305ba6fa
child 51559 57f1bf06742e
permissions -rw-r--r--
8207765: HeapMonitorStatIntervalTest.java fails with ZGC Summary: Add a calculation of array sizes before test to satisfy ZGC support Reviewed-by: amenkov, sspitsyn Contributed-by: jcbeyler@google.com
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
50579
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
     1
/*
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
     2
 * Copyright (c) 2018, Google and/or its affiliates. All rights reserved.
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
     4
 *
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
     7
 * published by the Free Software Foundation.
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
     8
 *
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    13
 * accompanied this code).
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    14
 *
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    18
 *
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    21
 * questions.
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    22
 */
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    23
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    24
package MyPackage;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    25
51074
bf686c47c109 8206960: HeapMonitor tests fail with Graal
jcbeyler
parents: 50579
diff changeset
    26
import java.lang.management.ManagementFactory;
50579
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    27
import java.util.ArrayList;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    28
import java.util.List;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    29
51074
bf686c47c109 8206960: HeapMonitor tests fail with Graal
jcbeyler
parents: 50579
diff changeset
    30
import com.sun.management.HotSpotDiagnosticMXBean;
bf686c47c109 8206960: HeapMonitor tests fail with Graal
jcbeyler
parents: 50579
diff changeset
    31
import com.sun.management.VMOption;
bf686c47c109 8206960: HeapMonitor tests fail with Graal
jcbeyler
parents: 50579
diff changeset
    32
50579
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    33
/** API for handling the underlying heap sampling monitoring system. */
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    34
public class HeapMonitor {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    35
  private static int[][] arrays;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    36
  private static int allocationIterations = 1000;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    37
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    38
  static {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    39
    try {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    40
      System.loadLibrary("HeapMonitorTest");
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    41
    } catch (UnsatisfiedLinkError ule) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    42
      System.err.println("Could not load HeapMonitor library");
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    43
      System.err.println("java.library.path: " + System.getProperty("java.library.path"));
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    44
      throw ule;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    45
    }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    46
  }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    47
51138
914f305ba6fa 8205725: Update the JVMTI Spec for Heap Sampling
jcbeyler
parents: 51074
diff changeset
    48
  /** Set a specific sampling interval, 0 samples every allocation. */
914f305ba6fa 8205725: Update the JVMTI Spec for Heap Sampling
jcbeyler
parents: 51074
diff changeset
    49
  public native static void setSamplingInterval(int interval);
50579
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    50
  public native static void enableSamplingEvents();
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    51
  public native static boolean enableSamplingEventsForTwoThreads(Thread firstThread, Thread secondThread);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    52
  public native static void disableSamplingEvents();
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    53
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    54
  /**
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    55
   * Allocate memory but first create a stack trace.
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    56
   *
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    57
   * @return list of frames for the allocation.
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    58
   */
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    59
  public static List<Frame> allocate() {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    60
    int sum = 0;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    61
    List<Frame> frames = new ArrayList<Frame>();
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    62
    allocate(frames);
51074
bf686c47c109 8206960: HeapMonitor tests fail with Graal
jcbeyler
parents: 50579
diff changeset
    63
    frames.add(new Frame("allocate", "()Ljava/util/List;", "HeapMonitor.java", 62));
50579
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    64
    return frames;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    65
  }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    66
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    67
  private static void allocate(List<Frame> frames) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    68
    int sum = 0;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    69
    for (int j = 0; j < allocationIterations; j++) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    70
      sum += actuallyAllocate();
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    71
    }
51074
bf686c47c109 8206960: HeapMonitor tests fail with Graal
jcbeyler
parents: 50579
diff changeset
    72
    frames.add(new Frame("actuallyAllocate", "()I", "HeapMonitor.java", 97));
bf686c47c109 8206960: HeapMonitor tests fail with Graal
jcbeyler
parents: 50579
diff changeset
    73
    frames.add(new Frame("allocate", "(Ljava/util/List;)V", "HeapMonitor.java", 70));
50579
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    74
  }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    75
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    76
  public static List<Frame> repeatAllocate(int max) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    77
    List<Frame> frames = null;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    78
    for (int i = 0; i < max; i++) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    79
      frames = allocate();
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    80
    }
51074
bf686c47c109 8206960: HeapMonitor tests fail with Graal
jcbeyler
parents: 50579
diff changeset
    81
    frames.add(new Frame("repeatAllocate", "(I)Ljava/util/List;", "HeapMonitor.java", 79));
50579
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    82
    return frames;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    83
  }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    84
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    85
  private static int actuallyAllocate() {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    86
    int sum = 0;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    87
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    88
    // Let us assume that a 1-element array is 24 bytes of memory and we want
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    89
    // 2MB allocated.
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    90
    int iterations = (1 << 19) / 6;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    91
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    92
    if (arrays == null) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    93
      arrays = new int[iterations][];
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    94
    }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    95
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    96
    for (int i = 0; i < iterations; i++) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    97
      int tmp[] = new int[1];
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    98
      // Force it to be kept and, at the same time, wipe out any previous data.
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    99
      arrays[i] = tmp;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   100
      sum += arrays[0][0];
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   101
    }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   102
    return sum;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   103
  }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   104
51210
e750c1a054fa 8207765: HeapMonitorStatIntervalTest.java fails with ZGC
jcbeyler
parents: 51138
diff changeset
   105
  private static double averageOneElementSize;
e750c1a054fa 8207765: HeapMonitorStatIntervalTest.java fails with ZGC
jcbeyler
parents: 51138
diff changeset
   106
  private static native double getAverageSize();
e750c1a054fa 8207765: HeapMonitorStatIntervalTest.java fails with ZGC
jcbeyler
parents: 51138
diff changeset
   107
e750c1a054fa 8207765: HeapMonitorStatIntervalTest.java fails with ZGC
jcbeyler
parents: 51138
diff changeset
   108
  // Calculate the size of a 1-element array in order to assess average sampling interval
e750c1a054fa 8207765: HeapMonitorStatIntervalTest.java fails with ZGC
jcbeyler
parents: 51138
diff changeset
   109
  // via the HeapMonitorStatIntervalTest. This is needed because various GCs could add
e750c1a054fa 8207765: HeapMonitorStatIntervalTest.java fails with ZGC
jcbeyler
parents: 51138
diff changeset
   110
  // extra memory to arrays.
e750c1a054fa 8207765: HeapMonitorStatIntervalTest.java fails with ZGC
jcbeyler
parents: 51138
diff changeset
   111
  // This is done by allocating a 1-element array and then looking in the heap monitoring
e750c1a054fa 8207765: HeapMonitorStatIntervalTest.java fails with ZGC
jcbeyler
parents: 51138
diff changeset
   112
  // samples for the average size of objects collected.
e750c1a054fa 8207765: HeapMonitorStatIntervalTest.java fails with ZGC
jcbeyler
parents: 51138
diff changeset
   113
  public static void calculateAverageOneElementSize() {
e750c1a054fa 8207765: HeapMonitorStatIntervalTest.java fails with ZGC
jcbeyler
parents: 51138
diff changeset
   114
    enableSamplingEvents();
e750c1a054fa 8207765: HeapMonitorStatIntervalTest.java fails with ZGC
jcbeyler
parents: 51138
diff changeset
   115
    // Assume a size of 24 for the average size.
e750c1a054fa 8207765: HeapMonitorStatIntervalTest.java fails with ZGC
jcbeyler
parents: 51138
diff changeset
   116
    averageOneElementSize = 24;
e750c1a054fa 8207765: HeapMonitorStatIntervalTest.java fails with ZGC
jcbeyler
parents: 51138
diff changeset
   117
e750c1a054fa 8207765: HeapMonitorStatIntervalTest.java fails with ZGC
jcbeyler
parents: 51138
diff changeset
   118
    // Call allocateSize once, this allocates the internal array for the iterations.
e750c1a054fa 8207765: HeapMonitorStatIntervalTest.java fails with ZGC
jcbeyler
parents: 51138
diff changeset
   119
    int totalSize = 10 * 1024 * 1024;
e750c1a054fa 8207765: HeapMonitorStatIntervalTest.java fails with ZGC
jcbeyler
parents: 51138
diff changeset
   120
    allocateSize(totalSize);
e750c1a054fa 8207765: HeapMonitorStatIntervalTest.java fails with ZGC
jcbeyler
parents: 51138
diff changeset
   121
e750c1a054fa 8207765: HeapMonitorStatIntervalTest.java fails with ZGC
jcbeyler
parents: 51138
diff changeset
   122
    // Reset the storage and now really track the size of the elements.
e750c1a054fa 8207765: HeapMonitorStatIntervalTest.java fails with ZGC
jcbeyler
parents: 51138
diff changeset
   123
    resetEventStorage();
e750c1a054fa 8207765: HeapMonitorStatIntervalTest.java fails with ZGC
jcbeyler
parents: 51138
diff changeset
   124
    allocateSize(totalSize);
e750c1a054fa 8207765: HeapMonitorStatIntervalTest.java fails with ZGC
jcbeyler
parents: 51138
diff changeset
   125
    disableSamplingEvents();
e750c1a054fa 8207765: HeapMonitorStatIntervalTest.java fails with ZGC
jcbeyler
parents: 51138
diff changeset
   126
e750c1a054fa 8207765: HeapMonitorStatIntervalTest.java fails with ZGC
jcbeyler
parents: 51138
diff changeset
   127
    // Get the actual average size.
e750c1a054fa 8207765: HeapMonitorStatIntervalTest.java fails with ZGC
jcbeyler
parents: 51138
diff changeset
   128
    averageOneElementSize = getAverageSize();
e750c1a054fa 8207765: HeapMonitorStatIntervalTest.java fails with ZGC
jcbeyler
parents: 51138
diff changeset
   129
    if (averageOneElementSize == 0) {
e750c1a054fa 8207765: HeapMonitorStatIntervalTest.java fails with ZGC
jcbeyler
parents: 51138
diff changeset
   130
      throw new RuntimeException("Could not calculate the average size of a 1-element array.");
e750c1a054fa 8207765: HeapMonitorStatIntervalTest.java fails with ZGC
jcbeyler
parents: 51138
diff changeset
   131
    }
e750c1a054fa 8207765: HeapMonitorStatIntervalTest.java fails with ZGC
jcbeyler
parents: 51138
diff changeset
   132
  }
e750c1a054fa 8207765: HeapMonitorStatIntervalTest.java fails with ZGC
jcbeyler
parents: 51138
diff changeset
   133
50579
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   134
  public static int allocateSize(int totalSize) {
51210
e750c1a054fa 8207765: HeapMonitorStatIntervalTest.java fails with ZGC
jcbeyler
parents: 51138
diff changeset
   135
    if (averageOneElementSize == 0) {
e750c1a054fa 8207765: HeapMonitorStatIntervalTest.java fails with ZGC
jcbeyler
parents: 51138
diff changeset
   136
      throw new RuntimeException("Average size of a 1-element array was not calculated.");
e750c1a054fa 8207765: HeapMonitorStatIntervalTest.java fails with ZGC
jcbeyler
parents: 51138
diff changeset
   137
    }
e750c1a054fa 8207765: HeapMonitorStatIntervalTest.java fails with ZGC
jcbeyler
parents: 51138
diff changeset
   138
50579
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   139
    int sum = 0;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   140
51210
e750c1a054fa 8207765: HeapMonitorStatIntervalTest.java fails with ZGC
jcbeyler
parents: 51138
diff changeset
   141
    int iterations = (int) (totalSize / averageOneElementSize);
50579
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   142
51210
e750c1a054fa 8207765: HeapMonitorStatIntervalTest.java fails with ZGC
jcbeyler
parents: 51138
diff changeset
   143
    if (arrays == null || arrays.length < iterations) {
50579
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   144
      arrays = new int[iterations][];
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   145
    }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   146
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   147
    System.out.println("Allocating for " + iterations);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   148
    for (int i = 0; i < iterations; i++) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   149
      int tmp[] = new int[1];
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   150
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   151
      // Force it to be kept and, at the same time, wipe out any previous data.
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   152
      arrays[i] = tmp;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   153
      sum += arrays[0][0];
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   154
    }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   155
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   156
    return sum;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   157
  }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   158
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   159
  /** Remove the reference to the global array to free data at the next GC. */
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   160
  public static void freeStorage() {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   161
    arrays = null;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   162
  }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   163
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   164
  public static int[][][] sampleEverything() {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   165
    enableSamplingEvents();
51138
914f305ba6fa 8205725: Update the JVMTI Spec for Heap Sampling
jcbeyler
parents: 51074
diff changeset
   166
    setSamplingInterval(0);
50579
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   167
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   168
    // Loop around an allocation loop and wait until the tlabs have settled.
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   169
    final int maxTries = 10;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   170
    int[][][] result = new int[maxTries][][];
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   171
    for (int i = 0; i < maxTries; i++) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   172
      final int maxInternalTries = 400;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   173
      result[i] = new int[maxInternalTries][];
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   174
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   175
      resetEventStorage();
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   176
      for (int j = 0; j < maxInternalTries; j++) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   177
        final int size = 1000;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   178
        result[i][j] = new int[size];
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   179
      }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   180
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   181
      int sampledEvents = sampledEvents();
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   182
      if (sampledEvents == maxInternalTries) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   183
        return result;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   184
      }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   185
    }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   186
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   187
    throw new RuntimeException("Could not set the sampler");
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   188
  }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   189
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   190
  public native static int sampledEvents();
51074
bf686c47c109 8206960: HeapMonitor tests fail with Graal
jcbeyler
parents: 50579
diff changeset
   191
  public native static boolean obtainedEvents(Frame[] frames, boolean checkLines);
bf686c47c109 8206960: HeapMonitor tests fail with Graal
jcbeyler
parents: 50579
diff changeset
   192
  public native static boolean garbageContains(Frame[] frames, boolean checkLines);
50579
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   193
  public native static boolean eventStorageIsEmpty();
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   194
  public native static void resetEventStorage();
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   195
  public native static int getEventStorageElementCount();
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   196
  public native static void forceGarbageCollection();
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   197
  public native static boolean enableVMEvents();
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   198
51074
bf686c47c109 8206960: HeapMonitor tests fail with Graal
jcbeyler
parents: 50579
diff changeset
   199
  private static boolean getCheckLines() {
bf686c47c109 8206960: HeapMonitor tests fail with Graal
jcbeyler
parents: 50579
diff changeset
   200
    boolean checkLines = true;
bf686c47c109 8206960: HeapMonitor tests fail with Graal
jcbeyler
parents: 50579
diff changeset
   201
bf686c47c109 8206960: HeapMonitor tests fail with Graal
jcbeyler
parents: 50579
diff changeset
   202
    // Do not check lines for Graal since it is not always "precise" with BCIs at uncommon traps.
bf686c47c109 8206960: HeapMonitor tests fail with Graal
jcbeyler
parents: 50579
diff changeset
   203
    try {
bf686c47c109 8206960: HeapMonitor tests fail with Graal
jcbeyler
parents: 50579
diff changeset
   204
      HotSpotDiagnosticMXBean bean = ManagementFactory.getPlatformMXBean(HotSpotDiagnosticMXBean.class);
bf686c47c109 8206960: HeapMonitor tests fail with Graal
jcbeyler
parents: 50579
diff changeset
   205
bf686c47c109 8206960: HeapMonitor tests fail with Graal
jcbeyler
parents: 50579
diff changeset
   206
      VMOption enableJVMCI = bean.getVMOption("EnableJVMCI");
bf686c47c109 8206960: HeapMonitor tests fail with Graal
jcbeyler
parents: 50579
diff changeset
   207
      VMOption useJVMCICompiler = bean.getVMOption("UseJVMCICompiler");
bf686c47c109 8206960: HeapMonitor tests fail with Graal
jcbeyler
parents: 50579
diff changeset
   208
      String compiler = System.getProperty("jvmci.Compiler");
bf686c47c109 8206960: HeapMonitor tests fail with Graal
jcbeyler
parents: 50579
diff changeset
   209
bf686c47c109 8206960: HeapMonitor tests fail with Graal
jcbeyler
parents: 50579
diff changeset
   210
      checkLines = !(enableJVMCI.getValue().equals("true")
bf686c47c109 8206960: HeapMonitor tests fail with Graal
jcbeyler
parents: 50579
diff changeset
   211
          && useJVMCICompiler.getValue().equals("true") && compiler.equals("graal"));
bf686c47c109 8206960: HeapMonitor tests fail with Graal
jcbeyler
parents: 50579
diff changeset
   212
    } catch (Exception e) {
bf686c47c109 8206960: HeapMonitor tests fail with Graal
jcbeyler
parents: 50579
diff changeset
   213
      // NOP.
bf686c47c109 8206960: HeapMonitor tests fail with Graal
jcbeyler
parents: 50579
diff changeset
   214
    }
bf686c47c109 8206960: HeapMonitor tests fail with Graal
jcbeyler
parents: 50579
diff changeset
   215
bf686c47c109 8206960: HeapMonitor tests fail with Graal
jcbeyler
parents: 50579
diff changeset
   216
    return checkLines;
bf686c47c109 8206960: HeapMonitor tests fail with Graal
jcbeyler
parents: 50579
diff changeset
   217
  }
bf686c47c109 8206960: HeapMonitor tests fail with Graal
jcbeyler
parents: 50579
diff changeset
   218
bf686c47c109 8206960: HeapMonitor tests fail with Graal
jcbeyler
parents: 50579
diff changeset
   219
  public static boolean obtainedEvents(Frame[] frames) {
bf686c47c109 8206960: HeapMonitor tests fail with Graal
jcbeyler
parents: 50579
diff changeset
   220
    return obtainedEvents(frames, getCheckLines());
bf686c47c109 8206960: HeapMonitor tests fail with Graal
jcbeyler
parents: 50579
diff changeset
   221
  }
bf686c47c109 8206960: HeapMonitor tests fail with Graal
jcbeyler
parents: 50579
diff changeset
   222
bf686c47c109 8206960: HeapMonitor tests fail with Graal
jcbeyler
parents: 50579
diff changeset
   223
  public static boolean garbageContains(Frame[] frames) {
bf686c47c109 8206960: HeapMonitor tests fail with Graal
jcbeyler
parents: 50579
diff changeset
   224
    return garbageContains(frames, getCheckLines());
bf686c47c109 8206960: HeapMonitor tests fail with Graal
jcbeyler
parents: 50579
diff changeset
   225
  }
bf686c47c109 8206960: HeapMonitor tests fail with Graal
jcbeyler
parents: 50579
diff changeset
   226
50579
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   227
  public static boolean statsHaveExpectedNumberSamples(int expected, int acceptedErrorPercentage) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   228
    double actual = getEventStorageElementCount();
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   229
    double diffPercentage = Math.abs(actual - expected) / expected;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   230
    return diffPercentage < acceptedErrorPercentage;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   231
  }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   232
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   233
  public static void setAllocationIterations(int iterations) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   234
    allocationIterations = iterations;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   235
  }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   236
}