test/hotspot/jtreg/vmTestbase/metaspace/gc/HighWaterMarkTest.java
author pliden
Wed, 09 Oct 2019 08:09:12 +0200
changeset 58511 eb68d459ba6a
parent 50404 5193c6b98cc7
permissions -rw-r--r--
8231489: GC watermark_0_1 failed due to "metaspace.gc.Fault: GC has happened too rare" Reviewed-by: tschatzl, sjohanss
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
50223
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
     1
/*
58511
eb68d459ba6a 8231489: GC watermark_0_1 failed due to "metaspace.gc.Fault: GC has happened too rare"
pliden
parents: 50404
diff changeset
     2
 * Copyright (c) 2013, 2019, Oracle and/or its affiliates. All rights reserved.
50223
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
     4
 *
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
     7
 * published by the Free Software Foundation.
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
     8
 *
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
    13
 * accompanied this code).
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
    14
 *
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
    18
 *
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
    21
 * questions.
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
    22
 */
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
    23
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
    24
package metaspace.gc;
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
    25
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
    26
import java.util.Arrays;
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
    27
import vm.share.VMRuntimeEnvUtils;
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
    28
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
    29
/**
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
    30
 * Test metaspace ergonomic.
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
    31
 *
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
    32
 * <ul>
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
    33
 * <li>MetaspaceSize
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
    34
 * <li>MaxMetaspaceSize
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
    35
 * <li>MinMetaspaceFreeRatio
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
    36
 * <li>MaxMetaspaceFreeRatio
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
    37
 * </ul>
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
    38
 *
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
    39
 * The test loads classes until the committed metaspace achieves the certain
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
    40
 * level between MetaspaceSize and MaxMetaspaceSize.
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
    41
 * Then it counts how many times GC has been induced.
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
    42
 * Test verifies that MinMetaspaceFreeRatio/MaxMetaspaceFreeRatio settings
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
    43
 * affect the frequency of GC. (High-water mark)
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
    44
 *
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
    45
 * Quoting: Java SE 8 HotSpot[tm] Virtual Machine Garbage Collection Tuning
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
    46
 * <pre>
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
    47
 * Class metadata is deallocated when the corresponding Java class is unloaded.
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
    48
 * Java classes are unloaded as a results of garbage collection and garbage
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
    49
 * collections may be induced in order to unload classes and deallocate class
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
    50
 * metadata. When the space used for class metadata reaches a certain level
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
    51
 * (call it a high-water mark), a garbage collection is induced.
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
    52
 * After the garbage collection the high-water mark may be raised or lowered
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
    53
 * depending on the amount of space freed from class metadata. The high-water
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
    54
 * mark would be raised so as not to induce another garbage collection too soon.
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
    55
 * The high-water mark is initially set to the value of the command-line
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
    56
 * flag MetaspaceSize . It is raised or lowered based on the flags
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
    57
 * MaxMetaspaceFreeRatio and MinMetaspaceFreeRatio.
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
    58
 * If the committed space available for class metadata as a percentage of
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
    59
 * the total committed space for class metadata is greater than
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
    60
 * MaxMetaspaceFreeRatio, the high-water mark will be lowered.
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
    61
 * If it is less than MinMetaspaceFreeRatio, the high-water mark will be raised.
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
    62
 * </pre>
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
    63
 */
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
    64
public class HighWaterMarkTest extends FirstGCTest {
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
    65
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
    66
    public static void main(String... args) {
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
    67
        new HighWaterMarkTest().run(args);
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
    68
    }
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
    69
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
    70
    // value given in -XX:MetaspaceSize=<value>
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
    71
    private long metaspaceSize = -1;
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
    72
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
    73
    // value given in -XX:MaxMetaspaceSize=<value>
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
    74
    private long maxMetaspaceSize = -1;
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
    75
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
    76
    // value given in -XX:MinMetaspaceFreeRatio=<value>
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
    77
    private long minMetaspaceFreeRatio = -1;
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
    78
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
    79
    // value given in -XX:MaxMetaspaceFreeRatio=<value>
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
    80
    private long maxMetaspaceFreeRatio = -1;
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
    81
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
    82
    /**
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
    83
     * Parses arguments and vm options.
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
    84
     * Throws Fault in cases of wrong values or missed parameters.
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
    85
     *
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
    86
     * @param args command line options
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
    87
     */
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
    88
    @Override
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
    89
    protected void parseArgs(String[] args) {
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
    90
        if (args.length > 0) {
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
    91
            printUsage();
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
    92
            throw new Fault("Illegal arguments: " + Arrays.asList(args));
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
    93
        }
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
    94
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
    95
        if (gclogFileName == null) {
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
    96
            printUsage();
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
    97
            throw new Fault("Log file name is not given");
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
    98
        }
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
    99
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
   100
        final String metaSize    = "-XX:MetaspaceSize=";
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
   101
        final String maxMetaSize = "-XX:MaxMetaspaceSize=";
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
   102
        final String minRatio    = "-XX:MinMetaspaceFreeRatio=";
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
   103
        final String maxRatio    = "-XX:MaxMetaspaceFreeRatio=";
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
   104
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
   105
        for (String va: vmArgs) {
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
   106
            if (va.startsWith(metaSize)) {
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
   107
                metaspaceSize = parseValue(va.substring(metaSize.length()));
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
   108
            } else if (va.startsWith(maxMetaSize)) {
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
   109
                maxMetaspaceSize = parseValue(va.substring(maxMetaSize.length()));
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
   110
            } else if (va.startsWith(minRatio)) {
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
   111
                minMetaspaceFreeRatio = parseValue(va.substring(minRatio.length()));
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
   112
            } else if (va.startsWith(maxRatio)) {
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
   113
                maxMetaspaceFreeRatio = parseValue(va.substring(maxRatio.length()));
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
   114
            }
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
   115
        }
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
   116
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
   117
        if (metaspaceSize < 0) {
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
   118
            printUsage();
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
   119
            throw new Fault("-XX:MetaspaceSize is not specified");
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
   120
        } else if (maxMetaspaceSize < 0) {
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
   121
            printUsage();
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
   122
            throw new Fault("-XX:MaxMetaspaceSize is not specified");
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
   123
        } else if (minMetaspaceFreeRatio < 0) {
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
   124
            printUsage();
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
   125
            throw new Fault("-XX:MinMetaspaceFreeRatio is not specified");
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
   126
        } else if (maxMetaspaceFreeRatio < 0) {
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
   127
            printUsage();
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
   128
            throw new Fault("-XX:MaxMetaspaceFreeRatio is not specified");
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
   129
        }
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
   130
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
   131
    }
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
   132
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
   133
    private void printUsage() {
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
   134
        System.err.println("Usage: ");
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
   135
        System.err.println("java [-Xlog:gc:<filename>] [-XX:MetaspaceSize=..] [-XX:MaxMetaspaceSize=..] [-XX:MinMetaspaceFreeRatio=..] [-XX:MaxMetaspaceFreeRatio=..] \\");
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
   136
        System.err.println("    " + HighWaterMarkTest.class.getCanonicalName());
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
   137
    }
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
   138
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
   139
    /**
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
   140
     * Check that MinMetaspaceFreeRatio/MaxMetaspaceFreeRatio settings
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
   141
     * affects the moment of the next GC.
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
   142
     *
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
   143
     * Eats memory until amount of committed metaspace achieves a certain level
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
   144
     * (between MetaspaceSize and MaxMetaspaceSize).
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
   145
     * Then checks how many times GC has been invoked.
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
   146
     *
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
   147
     */
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
   148
    @Override
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
   149
    public void doCheck() {
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
   150
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
   151
        // to avoid timeouts we limit the number of attempts
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
   152
        int attempts = 0;
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
   153
        int maxAttempts = 10_000;
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
   154
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
   155
        // in between metaspaceSize and maxMetaspaceSize
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
   156
        // no OOM is exepcted.
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
   157
        long committedLevel = (metaspaceSize + maxMetaspaceSize) / 2;
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
   158
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
   159
        while (getCommitted() < committedLevel && attempts < maxAttempts) {
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
   160
            attempts++;
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
   161
            loadNewClasses(9, true);  // load classes and keep references
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
   162
            loadNewClasses(1, false); // load classes without keeping references
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
   163
        }
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
   164
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
   165
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
   166
        System.out.println("% Classes loaded: " + attempts*10);
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
   167
        System.out.println("% Used metaspace    : " + bytes2k(getUsed()));
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
   168
        System.out.println("% Committed metaspce: " + bytes2k(getCommitted()));
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
   169
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
   170
        cleanLoadedClasses();
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
   171
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
   172
        if (attempts == maxAttempts) {
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
   173
            throw new Fault("Committed amount hasn't achieved " + bytes2k(committedLevel));
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
   174
        }
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
   175
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
   176
        int gcCount = getMetaspaceGCCount();
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
   177
        if (gcCount < 0) {
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
   178
            // perhpas, it's better to silently pass here... Let's see.
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
   179
            throw new Fault ("Unable to count full collections, could be an env issue");
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
   180
        }
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
   181
        System.out.println("% GC has been invoked: " + gcCount + " times");
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
   182
50404
5193c6b98cc7 8204163: Also detect concurrent GCs in MetaspaceBaseGC.java
stefank
parents: 50223
diff changeset
   183
        if (maxMetaspaceFreeRatio <= 1) {
5193c6b98cc7 8204163: Also detect concurrent GCs in MetaspaceBaseGC.java
stefank
parents: 50223
diff changeset
   184
            // min/max = 0/1  boundary value
5193c6b98cc7 8204163: Also detect concurrent GCs in MetaspaceBaseGC.java
stefank
parents: 50223
diff changeset
   185
            // GC should happen very often
5193c6b98cc7 8204163: Also detect concurrent GCs in MetaspaceBaseGC.java
stefank
parents: 50223
diff changeset
   186
            checkGCCount(gcCount, 20, -1);
5193c6b98cc7 8204163: Also detect concurrent GCs in MetaspaceBaseGC.java
stefank
parents: 50223
diff changeset
   187
        } else if (minMetaspaceFreeRatio >= 99) {
5193c6b98cc7 8204163: Also detect concurrent GCs in MetaspaceBaseGC.java
stefank
parents: 50223
diff changeset
   188
            // min/max = 99/100  boundary value
5193c6b98cc7 8204163: Also detect concurrent GCs in MetaspaceBaseGC.java
stefank
parents: 50223
diff changeset
   189
            // GC should happen very rare
5193c6b98cc7 8204163: Also detect concurrent GCs in MetaspaceBaseGC.java
stefank
parents: 50223
diff changeset
   190
            checkGCCount(gcCount, -1, 2);
5193c6b98cc7 8204163: Also detect concurrent GCs in MetaspaceBaseGC.java
stefank
parents: 50223
diff changeset
   191
        } else if (minMetaspaceFreeRatio >= 10  && maxMetaspaceFreeRatio <= 20) {
5193c6b98cc7 8204163: Also detect concurrent GCs in MetaspaceBaseGC.java
stefank
parents: 50223
diff changeset
   192
            // GC should happen quite often
5193c6b98cc7 8204163: Also detect concurrent GCs in MetaspaceBaseGC.java
stefank
parents: 50223
diff changeset
   193
            checkGCCount(gcCount, 3, 30);
5193c6b98cc7 8204163: Also detect concurrent GCs in MetaspaceBaseGC.java
stefank
parents: 50223
diff changeset
   194
        } else if (minMetaspaceFreeRatio >= 70  && maxMetaspaceFreeRatio <= 80) {
5193c6b98cc7 8204163: Also detect concurrent GCs in MetaspaceBaseGC.java
stefank
parents: 50223
diff changeset
   195
            // GC should happen quite often
5193c6b98cc7 8204163: Also detect concurrent GCs in MetaspaceBaseGC.java
stefank
parents: 50223
diff changeset
   196
            checkGCCount(gcCount, 1, 3);
50223
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
   197
        } else {
50404
5193c6b98cc7 8204163: Also detect concurrent GCs in MetaspaceBaseGC.java
stefank
parents: 50223
diff changeset
   198
            // hard to estimate
50223
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
   199
        }
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
   200
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
   201
    }
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
   202
    /**
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
   203
     * Checks that count of GC fits the expected range.
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
   204
     * Throws Fault if count is unexpected.
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
   205
     *
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
   206
     * @param count how many times GC has happened
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
   207
     * @param min   expected minimum, if under zero - undefined
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
   208
     * @param max   expected maximum, if under zero - undefined
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
   209
     */
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
   210
    void checkGCCount(int count, int min, int max) {
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
   211
        if (min < 0) {
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
   212
            if(count > max) {
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
   213
                throw new Fault("GC has happened too often: " + count + " times, " +
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
   214
                        "expected count: less than " + max);
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
   215
            }
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
   216
        } else if (max < 0) {
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
   217
            if(count < min) {
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
   218
                throw new Fault("GC has happened too rare: " + count + " times, " +
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
   219
                        "expected count greater than " + min);
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
   220
            }
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
   221
        } else if (count < min || count > max ) {
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
   222
            throw new Fault ("GC has happened " + count + " times, " +
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
   223
                    "approximate count is " + min + " to " + max);
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
   224
        }
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
   225
    }
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
   226
28a33a0dbf04 8199257: [TESTBUG] Open source VM testbase metaspace tests
mseledtsov
parents:
diff changeset
   227
}