test/hotspot/jtreg/serviceability/jvmti/HeapMonitor/MyPackage/HeapMonitorStatObjectCorrectnessTest.java
author jcbeyler
Tue, 17 Jul 2018 19:59:38 -0700
changeset 51138 914f305ba6fa
parent 51136 6d6611346837
child 51559 57f1bf06742e
permissions -rw-r--r--
8205725: Update the JVMTI Spec for Heap Sampling Summary: Update the JVMTI Spec for Heap Sampling 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
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    26
/**
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    27
 * @test
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    28
 * @build Frame HeapMonitor
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    29
 * @summary Verifies the JVMTI Heap Monitor sampling via object allocation.
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    30
 * @compile HeapMonitorStatObjectCorrectnessTest.java
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    31
 * @run main/othervm/native -agentlib:HeapMonitorTest MyPackage.HeapMonitorStatObjectCorrectnessTest
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    32
 */
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    33
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    34
/** This test is checking the object allocation path works with heap sampling. */
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    35
public class HeapMonitorStatObjectCorrectnessTest {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    36
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    37
  // Do 200000 iterations and expect maxIteration / multiplier samples.
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    38
  private static final int maxIteration = 200000;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    39
  private static BigObject obj;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    40
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    41
  private native static boolean statsHaveExpectedNumberSamples(int expected, int percentError);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    42
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    43
  private static void allocate() {
51136
6d6611346837 8205541: serviceability/jvmti/HeapMonitor/MyPackage/HeapMonitorStatArrayCorrectnessTest.java fails with Should not have any events stored yet.
jcbeyler
parents: 50579
diff changeset
    44
    emptyStorage();
6d6611346837 8205541: serviceability/jvmti/HeapMonitor/MyPackage/HeapMonitorStatArrayCorrectnessTest.java fails with Should not have any events stored yet.
jcbeyler
parents: 50579
diff changeset
    45
6d6611346837 8205541: serviceability/jvmti/HeapMonitor/MyPackage/HeapMonitorStatArrayCorrectnessTest.java fails with Should not have any events stored yet.
jcbeyler
parents: 50579
diff changeset
    46
    HeapMonitor.enableSamplingEvents();
50579
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    47
    for (int j = 0; j < maxIteration; j++) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    48
      obj = new BigObject();
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    49
    }
51136
6d6611346837 8205541: serviceability/jvmti/HeapMonitor/MyPackage/HeapMonitorStatArrayCorrectnessTest.java fails with Should not have any events stored yet.
jcbeyler
parents: 50579
diff changeset
    50
    HeapMonitor.disableSamplingEvents();
50579
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    51
  }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    52
51138
914f305ba6fa 8205725: Update the JVMTI Spec for Heap Sampling
jcbeyler
parents: 51136
diff changeset
    53
  private static void testBigAllocationInterval() {
50579
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    54
    final int sizeObject = 1400;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    55
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    56
    // 111 is as good a number as any.
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    57
    final int samplingMultiplier = 111;
51138
914f305ba6fa 8205725: Update the JVMTI Spec for Heap Sampling
jcbeyler
parents: 51136
diff changeset
    58
    HeapMonitor.setSamplingInterval(samplingMultiplier * sizeObject);
50579
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    59
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    60
    allocate();
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    61
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    62
    // For simplifications, the code is allocating:
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    63
    //   (BigObject size) * maxIteration.
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    64
    //
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    65
    // We ignore the class memory usage apart from field memory usage for BigObject. BigObject
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    66
    // allocates 250 long, so 2000 bytes, so whatever is used for the class is negligible.
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    67
    //
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    68
    // That means that with maxIterations, the loop in the method allocate requests:
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    69
    //    maxIterations * 2000 bytes.
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    70
    //
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    71
    // Via the enable sampling, the code requests a sample every samplingMultiplier * sizeObject bytes.
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    72
    //
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    73
    // Therefore, the expected sample number is:
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    74
    //   (maxIterations * sizeObject) / (samplingMultiplier * sizeObject);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    75
    //
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    76
    // Which becomes:
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    77
    //   maxIterations / samplingMultiplier
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    78
    double expected = maxIteration;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    79
    expected /= samplingMultiplier;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    80
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    81
    // 10% error ensures a sanity test without becoming flaky.
51138
914f305ba6fa 8205725: Update the JVMTI Spec for Heap Sampling
jcbeyler
parents: 51136
diff changeset
    82
    // Flakiness is due to the fact that this test is dependent on the sampling interval, which is a
914f305ba6fa 8205725: Update the JVMTI Spec for Heap Sampling
jcbeyler
parents: 51136
diff changeset
    83
    // statistical geometric variable around the sampling interval. This means that the test could be
50579
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    84
    // unlucky and not achieve the mean average fast enough for the test case.
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    85
    if (!HeapMonitor.statsHaveExpectedNumberSamples((int) expected, 10)) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    86
      throw new RuntimeException("Statistics should show about " + expected + " samples.");
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    87
    }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    88
  }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    89
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    90
  private static void emptyStorage() {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    91
    HeapMonitor.resetEventStorage();
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    92
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    93
    if (!HeapMonitor.eventStorageIsEmpty()) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    94
      throw new RuntimeException("Statistics should be null to begin with.");
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    95
    }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    96
  }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    97
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    98
  private static void testEveryAllocationSampled() {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    99
    // 0 means sample every allocation.
51138
914f305ba6fa 8205725: Update the JVMTI Spec for Heap Sampling
jcbeyler
parents: 51136
diff changeset
   100
    HeapMonitor.setSamplingInterval(0);
50579
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   101
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   102
    allocate();
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   103
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   104
    double expected = maxIteration;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   105
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   106
    // 10% error ensures a sanity test without becoming flaky.
51138
914f305ba6fa 8205725: Update the JVMTI Spec for Heap Sampling
jcbeyler
parents: 51136
diff changeset
   107
    // Flakiness is due to the fact that this test is dependent on the sampling interval, which is a
914f305ba6fa 8205725: Update the JVMTI Spec for Heap Sampling
jcbeyler
parents: 51136
diff changeset
   108
    // statistical geometric variable around the sampling interval. This means that the test could be
50579
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   109
    // unlucky and not achieve the mean average fast enough for the test case.
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   110
    if (!HeapMonitor.statsHaveExpectedNumberSamples((int) expected, 10)) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   111
      throw new RuntimeException("Statistics should show about " + expected + " samples.");
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   112
    }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   113
  }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   114
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   115
  public static void main(String[] args) {
51138
914f305ba6fa 8205725: Update the JVMTI Spec for Heap Sampling
jcbeyler
parents: 51136
diff changeset
   116
    testBigAllocationInterval();
50579
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   117
    testEveryAllocationSampled();
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   118
  }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   119
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   120
  /**
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   121
   * Big class on purpose to just be able to ignore the class memory space overhead.
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   122
   *
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   123
   * Class contains 175 long fields, so 175 * 8 = 1400 bytes.
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   124
   */
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   125
  private static class BigObject {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   126
    private long a0_0, a0_1, a0_2, a0_3, a0_4, a0_5, a0_6, a0_7, a0_8, a0_9;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   127
    private long a1_0, a1_1, a1_2, a1_3, a1_4, a1_5, a1_6, a1_7, a1_8, a1_9;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   128
    private long a2_0, a2_1, a2_2, a2_3, a2_4, a2_5, a2_6, a2_7, a2_8, a2_9;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   129
    private long a3_0, a3_1, a3_2, a3_3, a3_4, a3_5, a3_6, a3_7, a3_8, a3_9;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   130
    private long a4_0, a4_1, a4_2, a4_3, a4_4, a4_5, a4_6, a4_7, a4_8, a4_9;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   131
    private long a5_0, a5_1, a5_2, a5_3, a5_4, a5_5, a5_6, a5_7, a5_8, a5_9;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   132
    private long a6_0, a6_1, a6_2, a6_3, a6_4, a6_5, a6_6, a6_7, a6_8, a6_9;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   133
    private long a7_0, a7_1, a7_2, a7_3, a7_4, a7_5, a7_6, a7_7, a7_8, a7_9;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   134
    private long a8_0, a8_1, a8_2, a8_3, a8_4, a8_5, a8_6, a8_7, a8_8, a8_9;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   135
    private long a9_0, a9_1, a9_2, a9_3, a9_4, a9_5, a9_6, a9_7, a9_8, a9_9;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   136
    private long a10_0, a10_1, a10_2, a10_3, a10_4, a10_5, a10_6, a10_7, a10_8, a10_9;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   137
    private long a11_0, a11_1, a11_2, a11_3, a11_4, a11_5, a11_6, a11_7, a11_8, a11_9;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   138
    private long a12_0, a12_1, a12_2, a12_3, a12_4, a12_5, a12_6, a12_7, a12_8, a12_9;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   139
    private long a13_0, a13_1, a13_2, a13_3, a13_4, a13_5, a13_6, a13_7, a13_8, a13_9;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   140
    private long a14_0, a14_1, a14_2, a14_3, a14_4, a14_5, a14_6, a14_7, a14_8, a14_9;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   141
    private long a15_0, a15_1, a15_2, a15_3, a15_4, a15_5, a15_6, a15_7, a15_8, a15_9;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   142
    private long a16_0, a16_1, a16_2, a16_3, a16_4, a16_5, a16_6, a16_7, a16_8, a16_9;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   143
    private long a17_0, a17_1, a17_2, a17_3, a17_4;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   144
  }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   145
}