test/hotspot/jtreg/gc/logging/TestMetaSpaceLog.java
author chegar
Thu, 17 Oct 2019 20:54:25 +0100
branchdatagramsocketimpl-branch
changeset 58679 9c3209ff7550
parent 58678 9cf78a70fa4f
parent 58056 db92a157dd70
permissions -rw-r--r--
datagramsocketimpl-branch: merge with default
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
52027
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
     1
/*
53523
4c5184c56dc2 8214799: Add package declaration to each JTREG test case in the gc folder
lkorinth
parents: 52027
diff changeset
     2
 * Copyright (c) 2018, 2019, Oracle and/or its affiliates. All rights reserved.
52027
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
     3
 * Copyright (c) 2018, Google and/or its affiliates. All rights reserved.
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
     4
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
     5
 *
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
     6
 * This code is free software; you can redistribute it and/or modify it
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
     7
 * under the terms of the GNU General Public License version 2 only, as
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
     8
 * published by the Free Software Foundation.
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
     9
 *
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
    10
 * This code is distributed in the hope that it will be useful, but WITHOUT
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
    11
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
    12
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
    13
 * version 2 for more details (a copy is included in the LICENSE file that
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
    14
 * accompanied this code).
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
    15
 *
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
    16
 * You should have received a copy of the GNU General Public License version
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
    17
 * 2 along with this work; if not, write to the Free Software Foundation,
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
    18
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
    19
 *
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
    20
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
    21
 * or visit www.oracle.com if you need additional information or have any
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
    22
 * questions.
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
    23
 */
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
    24
53523
4c5184c56dc2 8214799: Add package declaration to each JTREG test case in the gc folder
lkorinth
parents: 52027
diff changeset
    25
package gc.logging;
4c5184c56dc2 8214799: Add package declaration to each JTREG test case in the gc folder
lkorinth
parents: 52027
diff changeset
    26
52027
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
    27
import java.io.File;
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
    28
import java.net.URL;
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
    29
import java.net.URLClassLoader;
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
    30
import java.util.regex.Pattern;
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
    31
import java.util.regex.Matcher;
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
    32
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
    33
import jdk.test.lib.Asserts;
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
    34
import jdk.test.lib.process.OutputAnalyzer;
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
    35
import jdk.test.lib.process.ProcessTools;
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
    36
import sun.hotspot.WhiteBox;
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
    37
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
    38
/*
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
    39
 * @test TestMetaSpaceLog
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
    40
 * @bug 8211123
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
    41
 * @summary Ensure that the Metaspace is updated in the log
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
    42
 * @key gc
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
    43
 * @library /test/lib
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
    44
 * @modules java.base/jdk.internal.misc
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
    45
 *          java.management
55203
8e31e083fe3c 8212630: jtreg/gc/logging/TestMetaSpaceLog.java failed with Agent timed out
kbarrett
parents: 54638
diff changeset
    46
 * @requires vm.gc != "Epsilon"
8e31e083fe3c 8212630: jtreg/gc/logging/TestMetaSpaceLog.java failed with Agent timed out
kbarrett
parents: 54638
diff changeset
    47
 * @requires vm.gc != "Z"
8e31e083fe3c 8212630: jtreg/gc/logging/TestMetaSpaceLog.java failed with Agent timed out
kbarrett
parents: 54638
diff changeset
    48
 * @requires vm.gc != "Shenandoah"
52027
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
    49
 *
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
    50
 * @compile TestMetaSpaceLog.java
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
    51
 * @run driver ClassFileInstaller sun.hotspot.WhiteBox
55203
8e31e083fe3c 8212630: jtreg/gc/logging/TestMetaSpaceLog.java failed with Agent timed out
kbarrett
parents: 54638
diff changeset
    52
 * @run driver gc.logging.TestMetaSpaceLog
52027
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
    53
 */
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
    54
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
    55
public class TestMetaSpaceLog {
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
    56
  private static Pattern metaSpaceRegexp;
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
    57
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
    58
  static {
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
    59
    // Do this once here.
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
    60
    metaSpaceRegexp = Pattern.compile(".*Metaspace: ([0-9]+).*->([0-9]+).*");
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
    61
  }
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
    62
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
    63
  public static void main(String[] args) throws Exception {
55203
8e31e083fe3c 8212630: jtreg/gc/logging/TestMetaSpaceLog.java failed with Agent timed out
kbarrett
parents: 54638
diff changeset
    64
    testMetaSpaceUpdate();
52027
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
    65
  }
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
    66
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
    67
  private static void verifyContainsMetaSpaceUpdate(OutputAnalyzer output) {
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
    68
    // At least one metaspace line from GC should show GC being collected.
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
    69
    boolean foundCollectedMetaSpace = output.asLines().stream()
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
    70
        .filter(s -> s.contains("[gc,metaspace"))
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
    71
        .anyMatch(TestMetaSpaceLog::check);
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
    72
    Asserts.assertTrue(foundCollectedMetaSpace);
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
    73
  }
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
    74
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
    75
  private static boolean check(String line) {
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
    76
    Matcher m = metaSpaceRegexp.matcher(line);
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
    77
    Asserts.assertTrue(m.matches(), "Unexpected line for metaspace logging: " + line);
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
    78
    long before = Long.parseLong(m.group(1));
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
    79
    long after  = Long.parseLong(m.group(2));
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
    80
    return before > after;
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
    81
  }
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
    82
55203
8e31e083fe3c 8212630: jtreg/gc/logging/TestMetaSpaceLog.java failed with Agent timed out
kbarrett
parents: 54638
diff changeset
    83
  private static void testMetaSpaceUpdate() throws Exception {
52027
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
    84
    // Propagate test.src for the jar file.
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
    85
    String testSrc= "-Dtest.src=" + System.getProperty("test.src", ".");
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
    86
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
    87
    ProcessBuilder pb =
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
    88
      ProcessTools.createJavaProcessBuilder(
55203
8e31e083fe3c 8212630: jtreg/gc/logging/TestMetaSpaceLog.java failed with Agent timed out
kbarrett
parents: 54638
diff changeset
    89
          true,
52027
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
    90
          "-Xlog:gc*",
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
    91
          "-Xbootclasspath/a:.",
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
    92
          "-XX:+UnlockDiagnosticVMOptions",
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
    93
          "-XX:+WhiteBoxAPI",
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
    94
          "-Xmx1000M",
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
    95
          "-Xms1000M",
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
    96
          testSrc, StressMetaSpace.class.getName());
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
    97
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
    98
    OutputAnalyzer output = null;
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
    99
    try {
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
   100
      output = new OutputAnalyzer(pb.start());
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
   101
      verifyContainsMetaSpaceUpdate(output);
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
   102
    } catch (Exception e) {
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
   103
      // For error diagnosis: print and throw.
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
   104
      e.printStackTrace();
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
   105
      output.reportDiagnosticSummary();
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
   106
      throw e;
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
   107
    }
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
   108
  }
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
   109
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
   110
  static class StressMetaSpace {
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
   111
    private static URL[] urls = new URL[1];
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
   112
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
   113
    static {
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
   114
      try {
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
   115
        File jarFile = new File(System.getProperty("test.src") + "/testcases.jar");
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
   116
        urls[0] = jarFile.toURI().toURL();
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
   117
      } catch (Exception e) {
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
   118
        e.printStackTrace();
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
   119
      }
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
   120
    }
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
   121
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
   122
    public static void main(String args[]) {
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
   123
      WhiteBox wb = WhiteBox.getWhiteBox();
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
   124
      for(int i = 0; i < 10000; i++) {
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
   125
        loadClass(wb);
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
   126
      }
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
   127
      wb.fullGC();
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
   128
    }
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
   129
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
   130
    public static void loadClass(WhiteBox wb) {
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
   131
      try {
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
   132
        URLClassLoader ucl = new URLClassLoader(urls);
58056
db92a157dd70 8212117: Class.forName may return a reference to a loaded but not linked Class
bchristi
parents: 55203
diff changeset
   133
        ucl.loadClass("case00");
52027
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
   134
      } catch (Exception e) {
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
   135
        e.printStackTrace();
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
   136
      }
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
   137
    }
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
   138
  }
549bc49734e8 8211123: GC Metaspace printing after full gc
jcbeyler
parents:
diff changeset
   139
}