test/hotspot/jtreg/gc/logging/TestPrintReferences.java
author tschatzl
Tue, 08 May 2018 10:01:29 +0200
changeset 50049 9d17c375dc30
parent 49808 f1dcdc3cd6b7
child 50395 41258f041b24
permissions -rw-r--r--
8202017: Merge Reference Enqueuing phase with phase 3 of Reference processing Summary: Do reference enqueuing work directly in phase 3 after every Reference. Reviewed-by: kbarrett, sangheki
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
33103
116b558af514 8136991: [REDO] Additional number of processed references printed with -XX:+PrintReferenceGC after JDK-8047125
brutisso
parents:
diff changeset
     1
/*
46795
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 41723
diff changeset
     2
 * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved.
33103
116b558af514 8136991: [REDO] Additional number of processed references printed with -XX:+PrintReferenceGC after JDK-8047125
brutisso
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
116b558af514 8136991: [REDO] Additional number of processed references printed with -XX:+PrintReferenceGC after JDK-8047125
brutisso
parents:
diff changeset
     4
 *
116b558af514 8136991: [REDO] Additional number of processed references printed with -XX:+PrintReferenceGC after JDK-8047125
brutisso
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
116b558af514 8136991: [REDO] Additional number of processed references printed with -XX:+PrintReferenceGC after JDK-8047125
brutisso
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
116b558af514 8136991: [REDO] Additional number of processed references printed with -XX:+PrintReferenceGC after JDK-8047125
brutisso
parents:
diff changeset
     7
 * published by the Free Software Foundation.
116b558af514 8136991: [REDO] Additional number of processed references printed with -XX:+PrintReferenceGC after JDK-8047125
brutisso
parents:
diff changeset
     8
 *
116b558af514 8136991: [REDO] Additional number of processed references printed with -XX:+PrintReferenceGC after JDK-8047125
brutisso
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
116b558af514 8136991: [REDO] Additional number of processed references printed with -XX:+PrintReferenceGC after JDK-8047125
brutisso
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
116b558af514 8136991: [REDO] Additional number of processed references printed with -XX:+PrintReferenceGC after JDK-8047125
brutisso
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
116b558af514 8136991: [REDO] Additional number of processed references printed with -XX:+PrintReferenceGC after JDK-8047125
brutisso
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
116b558af514 8136991: [REDO] Additional number of processed references printed with -XX:+PrintReferenceGC after JDK-8047125
brutisso
parents:
diff changeset
    13
 * accompanied this code).
116b558af514 8136991: [REDO] Additional number of processed references printed with -XX:+PrintReferenceGC after JDK-8047125
brutisso
parents:
diff changeset
    14
 *
116b558af514 8136991: [REDO] Additional number of processed references printed with -XX:+PrintReferenceGC after JDK-8047125
brutisso
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
116b558af514 8136991: [REDO] Additional number of processed references printed with -XX:+PrintReferenceGC after JDK-8047125
brutisso
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
116b558af514 8136991: [REDO] Additional number of processed references printed with -XX:+PrintReferenceGC after JDK-8047125
brutisso
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
116b558af514 8136991: [REDO] Additional number of processed references printed with -XX:+PrintReferenceGC after JDK-8047125
brutisso
parents:
diff changeset
    18
 *
116b558af514 8136991: [REDO] Additional number of processed references printed with -XX:+PrintReferenceGC after JDK-8047125
brutisso
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
116b558af514 8136991: [REDO] Additional number of processed references printed with -XX:+PrintReferenceGC after JDK-8047125
brutisso
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
116b558af514 8136991: [REDO] Additional number of processed references printed with -XX:+PrintReferenceGC after JDK-8047125
brutisso
parents:
diff changeset
    21
 * questions.
116b558af514 8136991: [REDO] Additional number of processed references printed with -XX:+PrintReferenceGC after JDK-8047125
brutisso
parents:
diff changeset
    22
 */
116b558af514 8136991: [REDO] Additional number of processed references printed with -XX:+PrintReferenceGC after JDK-8047125
brutisso
parents:
diff changeset
    23
116b558af514 8136991: [REDO] Additional number of processed references printed with -XX:+PrintReferenceGC after JDK-8047125
brutisso
parents:
diff changeset
    24
/*
116b558af514 8136991: [REDO] Additional number of processed references printed with -XX:+PrintReferenceGC after JDK-8047125
brutisso
parents:
diff changeset
    25
 * @test TestPrintReferences
47661
92bcf2ab0cb3 8188245: [Testbug] test/hotspot/jtreg/gc/logging/TestPrintReferences.java can fail
sangheki
parents: 47556
diff changeset
    26
 * @bug 8136991 8186402 8186465 8188245
33103
116b558af514 8136991: [REDO] Additional number of processed references printed with -XX:+PrintReferenceGC after JDK-8047125
brutisso
parents:
diff changeset
    27
 * @summary Validate the reference processing logging
116b558af514 8136991: [REDO] Additional number of processed references printed with -XX:+PrintReferenceGC after JDK-8047125
brutisso
parents:
diff changeset
    28
 * @key gc
40631
ed82623d7831 8157957: ClassNotFoundException: jdk.test.lib.JDKToolFinder
ctornqvi
parents: 36851
diff changeset
    29
 * @library /test/lib
36851
03e2f4d0a421 8153737: Unsupported Module
chegar
parents: 35061
diff changeset
    30
 * @modules java.base/jdk.internal.misc
33103
116b558af514 8136991: [REDO] Additional number of processed references printed with -XX:+PrintReferenceGC after JDK-8047125
brutisso
parents:
diff changeset
    31
 *          java.management
116b558af514 8136991: [REDO] Additional number of processed references printed with -XX:+PrintReferenceGC after JDK-8047125
brutisso
parents:
diff changeset
    32
 */
116b558af514 8136991: [REDO] Additional number of processed references printed with -XX:+PrintReferenceGC after JDK-8047125
brutisso
parents:
diff changeset
    33
46795
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 41723
diff changeset
    34
import java.lang.ref.SoftReference;
47661
92bcf2ab0cb3 8188245: [Testbug] test/hotspot/jtreg/gc/logging/TestPrintReferences.java can fail
sangheki
parents: 47556
diff changeset
    35
import java.math.BigDecimal;
46795
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 41723
diff changeset
    36
import java.util.ArrayList;
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 41723
diff changeset
    37
40631
ed82623d7831 8157957: ClassNotFoundException: jdk.test.lib.JDKToolFinder
ctornqvi
parents: 36851
diff changeset
    38
import jdk.test.lib.process.OutputAnalyzer;
ed82623d7831 8157957: ClassNotFoundException: jdk.test.lib.JDKToolFinder
ctornqvi
parents: 36851
diff changeset
    39
import jdk.test.lib.process.ProcessTools;
47556
1520941b7b5d 8186465: Each j.l.Reference elapsed time log is incorrect
sangheki
parents: 47216
diff changeset
    40
import java.util.regex.Pattern;
1520941b7b5d 8186465: Each j.l.Reference elapsed time log is incorrect
sangheki
parents: 47216
diff changeset
    41
import java.util.regex.Matcher;
33103
116b558af514 8136991: [REDO] Additional number of processed references printed with -XX:+PrintReferenceGC after JDK-8047125
brutisso
parents:
diff changeset
    42
116b558af514 8136991: [REDO] Additional number of processed references printed with -XX:+PrintReferenceGC after JDK-8047125
brutisso
parents:
diff changeset
    43
public class TestPrintReferences {
47556
1520941b7b5d 8186465: Each j.l.Reference elapsed time log is incorrect
sangheki
parents: 47216
diff changeset
    44
  static String output;
1520941b7b5d 8186465: Each j.l.Reference elapsed time log is incorrect
sangheki
parents: 47216
diff changeset
    45
  static final String doubleRegex = "[0-9]+[.,][0-9]+";
1520941b7b5d 8186465: Each j.l.Reference elapsed time log is incorrect
sangheki
parents: 47216
diff changeset
    46
  static final String referenceProcessing = "Reference Processing";
1520941b7b5d 8186465: Each j.l.Reference elapsed time log is incorrect
sangheki
parents: 47216
diff changeset
    47
  static final String softReference = "SoftReference";
1520941b7b5d 8186465: Each j.l.Reference elapsed time log is incorrect
sangheki
parents: 47216
diff changeset
    48
  static final String weakReference = "WeakReference";
1520941b7b5d 8186465: Each j.l.Reference elapsed time log is incorrect
sangheki
parents: 47216
diff changeset
    49
  static final String finalReference = "FinalReference";
1520941b7b5d 8186465: Each j.l.Reference elapsed time log is incorrect
sangheki
parents: 47216
diff changeset
    50
  static final String phantomReference = "PhantomReference";
1520941b7b5d 8186465: Each j.l.Reference elapsed time log is incorrect
sangheki
parents: 47216
diff changeset
    51
  static final String phase1 = "Phase1";
1520941b7b5d 8186465: Each j.l.Reference elapsed time log is incorrect
sangheki
parents: 47216
diff changeset
    52
  static final String phase2 = "Phase2";
1520941b7b5d 8186465: Each j.l.Reference elapsed time log is incorrect
sangheki
parents: 47216
diff changeset
    53
  static final String phase3 = "Phase3";
1520941b7b5d 8186465: Each j.l.Reference elapsed time log is incorrect
sangheki
parents: 47216
diff changeset
    54
  static final String gcLogTimeRegex = ".* GC\\([0-9]+\\) ";
1520941b7b5d 8186465: Each j.l.Reference elapsed time log is incorrect
sangheki
parents: 47216
diff changeset
    55
33103
116b558af514 8136991: [REDO] Additional number of processed references printed with -XX:+PrintReferenceGC after JDK-8047125
brutisso
parents:
diff changeset
    56
  public static void main(String[] args) throws Exception {
49808
f1dcdc3cd6b7 8201487: Do not rebalance reference processing queues if not doing parallel reference processing
tschatzl
parents: 47784
diff changeset
    57
    test(true);
f1dcdc3cd6b7 8201487: Do not rebalance reference processing queues if not doing parallel reference processing
tschatzl
parents: 47784
diff changeset
    58
    test(false);
47556
1520941b7b5d 8186465: Each j.l.Reference elapsed time log is incorrect
sangheki
parents: 47216
diff changeset
    59
  }
1520941b7b5d 8186465: Each j.l.Reference elapsed time log is incorrect
sangheki
parents: 47216
diff changeset
    60
1520941b7b5d 8186465: Each j.l.Reference elapsed time log is incorrect
sangheki
parents: 47216
diff changeset
    61
  static String indent(int count) {
1520941b7b5d 8186465: Each j.l.Reference elapsed time log is incorrect
sangheki
parents: 47216
diff changeset
    62
    return " {" + count + "}";
1520941b7b5d 8186465: Each j.l.Reference elapsed time log is incorrect
sangheki
parents: 47216
diff changeset
    63
  }
1520941b7b5d 8186465: Each j.l.Reference elapsed time log is incorrect
sangheki
parents: 47216
diff changeset
    64
49808
f1dcdc3cd6b7 8201487: Do not rebalance reference processing queues if not doing parallel reference processing
tschatzl
parents: 47784
diff changeset
    65
  public static void test(boolean parallelRefProcEnabled) throws Exception {
f1dcdc3cd6b7 8201487: Do not rebalance reference processing queues if not doing parallel reference processing
tschatzl
parents: 47784
diff changeset
    66
    ProcessBuilder pb_enabled = ProcessTools.createJavaProcessBuilder("-Xlog:gc+phases+ref=debug",
f1dcdc3cd6b7 8201487: Do not rebalance reference processing queues if not doing parallel reference processing
tschatzl
parents: 47784
diff changeset
    67
                                                                      "-XX:+UseG1GC",
f1dcdc3cd6b7 8201487: Do not rebalance reference processing queues if not doing parallel reference processing
tschatzl
parents: 47784
diff changeset
    68
                                                                      "-Xmx32M",
f1dcdc3cd6b7 8201487: Do not rebalance reference processing queues if not doing parallel reference processing
tschatzl
parents: 47784
diff changeset
    69
                                                                      // Explicit thread setting is required to avoid using only 1 thread
f1dcdc3cd6b7 8201487: Do not rebalance reference processing queues if not doing parallel reference processing
tschatzl
parents: 47784
diff changeset
    70
                                                                      "-XX:" + (parallelRefProcEnabled ? "+" : "-") + "ParallelRefProcEnabled",
f1dcdc3cd6b7 8201487: Do not rebalance reference processing queues if not doing parallel reference processing
tschatzl
parents: 47784
diff changeset
    71
                                                                      "-XX:ParallelGCThreads=2",
f1dcdc3cd6b7 8201487: Do not rebalance reference processing queues if not doing parallel reference processing
tschatzl
parents: 47784
diff changeset
    72
                                                                      GCTest.class.getName());
f1dcdc3cd6b7 8201487: Do not rebalance reference processing queues if not doing parallel reference processing
tschatzl
parents: 47784
diff changeset
    73
    OutputAnalyzer output = new OutputAnalyzer(pb_enabled.start());
f1dcdc3cd6b7 8201487: Do not rebalance reference processing queues if not doing parallel reference processing
tschatzl
parents: 47784
diff changeset
    74
f1dcdc3cd6b7 8201487: Do not rebalance reference processing queues if not doing parallel reference processing
tschatzl
parents: 47784
diff changeset
    75
    checkLogFormat(output, parallelRefProcEnabled);
f1dcdc3cd6b7 8201487: Do not rebalance reference processing queues if not doing parallel reference processing
tschatzl
parents: 47784
diff changeset
    76
    checkLogValue(output);
f1dcdc3cd6b7 8201487: Do not rebalance reference processing queues if not doing parallel reference processing
tschatzl
parents: 47784
diff changeset
    77
f1dcdc3cd6b7 8201487: Do not rebalance reference processing queues if not doing parallel reference processing
tschatzl
parents: 47784
diff changeset
    78
    output.shouldHaveExitValue(0);
f1dcdc3cd6b7 8201487: Do not rebalance reference processing queues if not doing parallel reference processing
tschatzl
parents: 47784
diff changeset
    79
  }
f1dcdc3cd6b7 8201487: Do not rebalance reference processing queues if not doing parallel reference processing
tschatzl
parents: 47784
diff changeset
    80
47556
1520941b7b5d 8186465: Each j.l.Reference elapsed time log is incorrect
sangheki
parents: 47216
diff changeset
    81
  // Find the first Reference Processing log and check its format.
49808
f1dcdc3cd6b7 8201487: Do not rebalance reference processing queues if not doing parallel reference processing
tschatzl
parents: 47784
diff changeset
    82
  public static void checkLogFormat(OutputAnalyzer output, boolean parallelRefProcEnabled) {
46795
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 41723
diff changeset
    83
    String countRegex = "[0-9]+";
47556
1520941b7b5d 8186465: Each j.l.Reference elapsed time log is incorrect
sangheki
parents: 47216
diff changeset
    84
    String timeRegex = doubleRegex + "ms";
1520941b7b5d 8186465: Each j.l.Reference elapsed time log is incorrect
sangheki
parents: 47216
diff changeset
    85
    String totalRegex = gcLogTimeRegex + indent(4) + referenceProcessing + ": " + timeRegex + "\n";
49808
f1dcdc3cd6b7 8201487: Do not rebalance reference processing queues if not doing parallel reference processing
tschatzl
parents: 47784
diff changeset
    86
    String balanceRegex = parallelRefProcEnabled ? gcLogTimeRegex + indent(8) + "Balance queues: " + timeRegex + "\n" : "";
47556
1520941b7b5d 8186465: Each j.l.Reference elapsed time log is incorrect
sangheki
parents: 47216
diff changeset
    87
    String softRefRegex = gcLogTimeRegex + indent(6) + softReference + ": " + timeRegex + "\n";
1520941b7b5d 8186465: Each j.l.Reference elapsed time log is incorrect
sangheki
parents: 47216
diff changeset
    88
    String weakRefRegex = gcLogTimeRegex + indent(6) + weakReference + ": " + timeRegex + "\n";
1520941b7b5d 8186465: Each j.l.Reference elapsed time log is incorrect
sangheki
parents: 47216
diff changeset
    89
    String finalRefRegex = gcLogTimeRegex + indent(6) + finalReference + ": " + timeRegex + "\n";
1520941b7b5d 8186465: Each j.l.Reference elapsed time log is incorrect
sangheki
parents: 47216
diff changeset
    90
    String phantomRefRegex = gcLogTimeRegex + indent(6) + phantomReference + ": " + timeRegex + "\n";
1520941b7b5d 8186465: Each j.l.Reference elapsed time log is incorrect
sangheki
parents: 47216
diff changeset
    91
    String refDetailRegex = gcLogTimeRegex + indent(8) + phase2 + ": " + timeRegex + "\n" +
1520941b7b5d 8186465: Each j.l.Reference elapsed time log is incorrect
sangheki
parents: 47216
diff changeset
    92
                            gcLogTimeRegex + indent(8) + phase3 + ": " + timeRegex + "\n" +
1520941b7b5d 8186465: Each j.l.Reference elapsed time log is incorrect
sangheki
parents: 47216
diff changeset
    93
                            gcLogTimeRegex + indent(8) + "Discovered: " + countRegex + "\n" +
1520941b7b5d 8186465: Each j.l.Reference elapsed time log is incorrect
sangheki
parents: 47216
diff changeset
    94
                            gcLogTimeRegex + indent(8) + "Cleared: " + countRegex + "\n";
1520941b7b5d 8186465: Each j.l.Reference elapsed time log is incorrect
sangheki
parents: 47216
diff changeset
    95
    String softRefDetailRegex = gcLogTimeRegex + indent(8) + phase1 + ": " + timeRegex + "\n" + refDetailRegex;
33103
116b558af514 8136991: [REDO] Additional number of processed references printed with -XX:+PrintReferenceGC after JDK-8047125
brutisso
parents:
diff changeset
    96
46795
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 41723
diff changeset
    97
    output.shouldMatch(/* Total Reference processing time */
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 41723
diff changeset
    98
                       totalRegex +
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 41723
diff changeset
    99
                       /* SoftReference processing */
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 41723
diff changeset
   100
                       softRefRegex + balanceRegex + softRefDetailRegex +
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 41723
diff changeset
   101
                       /* WeakReference processing */
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 41723
diff changeset
   102
                       weakRefRegex + balanceRegex + refDetailRegex +
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 41723
diff changeset
   103
                       /* FinalReference processing */
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 41723
diff changeset
   104
                       finalRefRegex + balanceRegex + refDetailRegex +
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 41723
diff changeset
   105
                       /* PhantomReference processing */
50049
9d17c375dc30 8202017: Merge Reference Enqueuing phase with phase 3 of Reference processing
tschatzl
parents: 49808
diff changeset
   106
                       phantomRefRegex + balanceRegex + refDetailRegex
46795
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 41723
diff changeset
   107
                       );
47556
1520941b7b5d 8186465: Each j.l.Reference elapsed time log is incorrect
sangheki
parents: 47216
diff changeset
   108
  }
33103
116b558af514 8136991: [REDO] Additional number of processed references printed with -XX:+PrintReferenceGC after JDK-8047125
brutisso
parents:
diff changeset
   109
47556
1520941b7b5d 8186465: Each j.l.Reference elapsed time log is incorrect
sangheki
parents: 47216
diff changeset
   110
  // After getting time value, update 'output' for next use.
47661
92bcf2ab0cb3 8188245: [Testbug] test/hotspot/jtreg/gc/logging/TestPrintReferences.java can fail
sangheki
parents: 47556
diff changeset
   111
  public static BigDecimal getTimeValue(String name, int indentCount) {
47556
1520941b7b5d 8186465: Each j.l.Reference elapsed time log is incorrect
sangheki
parents: 47216
diff changeset
   112
    // Pattern of 'name', 'value' and some extra strings.
1520941b7b5d 8186465: Each j.l.Reference elapsed time log is incorrect
sangheki
parents: 47216
diff changeset
   113
    String patternString = gcLogTimeRegex + indent(indentCount) + name + ": " + "(" + doubleRegex + ")";
1520941b7b5d 8186465: Each j.l.Reference elapsed time log is incorrect
sangheki
parents: 47216
diff changeset
   114
    Matcher m = Pattern.compile(patternString).matcher(output);
1520941b7b5d 8186465: Each j.l.Reference elapsed time log is incorrect
sangheki
parents: 47216
diff changeset
   115
     if (!m.find()) {
1520941b7b5d 8186465: Each j.l.Reference elapsed time log is incorrect
sangheki
parents: 47216
diff changeset
   116
      throw new RuntimeException("Could not find time log for " + patternString);
1520941b7b5d 8186465: Each j.l.Reference elapsed time log is incorrect
sangheki
parents: 47216
diff changeset
   117
     }
1520941b7b5d 8186465: Each j.l.Reference elapsed time log is incorrect
sangheki
parents: 47216
diff changeset
   118
1520941b7b5d 8186465: Each j.l.Reference elapsed time log is incorrect
sangheki
parents: 47216
diff changeset
   119
    String match = m.group();
1520941b7b5d 8186465: Each j.l.Reference elapsed time log is incorrect
sangheki
parents: 47216
diff changeset
   120
    String value = m.group(1);
1520941b7b5d 8186465: Each j.l.Reference elapsed time log is incorrect
sangheki
parents: 47216
diff changeset
   121
1520941b7b5d 8186465: Each j.l.Reference elapsed time log is incorrect
sangheki
parents: 47216
diff changeset
   122
    double result = Double.parseDouble(value);
1520941b7b5d 8186465: Each j.l.Reference elapsed time log is incorrect
sangheki
parents: 47216
diff changeset
   123
1520941b7b5d 8186465: Each j.l.Reference elapsed time log is incorrect
sangheki
parents: 47216
diff changeset
   124
    int index = output.indexOf(match);
1520941b7b5d 8186465: Each j.l.Reference elapsed time log is incorrect
sangheki
parents: 47216
diff changeset
   125
    if (index != -1) {
1520941b7b5d 8186465: Each j.l.Reference elapsed time log is incorrect
sangheki
parents: 47216
diff changeset
   126
      output = output.substring(index, output.length());
1520941b7b5d 8186465: Each j.l.Reference elapsed time log is incorrect
sangheki
parents: 47216
diff changeset
   127
    }
1520941b7b5d 8186465: Each j.l.Reference elapsed time log is incorrect
sangheki
parents: 47216
diff changeset
   128
47661
92bcf2ab0cb3 8188245: [Testbug] test/hotspot/jtreg/gc/logging/TestPrintReferences.java can fail
sangheki
parents: 47556
diff changeset
   129
    // Convert to BigDecimal to control the precision of floating point arithmetic.
92bcf2ab0cb3 8188245: [Testbug] test/hotspot/jtreg/gc/logging/TestPrintReferences.java can fail
sangheki
parents: 47556
diff changeset
   130
    return BigDecimal.valueOf(result);
47556
1520941b7b5d 8186465: Each j.l.Reference elapsed time log is incorrect
sangheki
parents: 47216
diff changeset
   131
  }
1520941b7b5d 8186465: Each j.l.Reference elapsed time log is incorrect
sangheki
parents: 47216
diff changeset
   132
1520941b7b5d 8186465: Each j.l.Reference elapsed time log is incorrect
sangheki
parents: 47216
diff changeset
   133
  // Reference log is printing 1 decimal place of elapsed time.
1520941b7b5d 8186465: Each j.l.Reference elapsed time log is incorrect
sangheki
parents: 47216
diff changeset
   134
  // So sum of each sub-phases could be slightly larger than the enclosing phase in some cases.
47661
92bcf2ab0cb3 8188245: [Testbug] test/hotspot/jtreg/gc/logging/TestPrintReferences.java can fail
sangheki
parents: 47556
diff changeset
   135
  // e.g. If there are 3 sub-phases:
92bcf2ab0cb3 8188245: [Testbug] test/hotspot/jtreg/gc/logging/TestPrintReferences.java can fail
sangheki
parents: 47556
diff changeset
   136
  //      Actual value:  SoftReference(5.55) = phase1(1.85) + phase2(1.85) + phase3(1.85)
47556
1520941b7b5d 8186465: Each j.l.Reference elapsed time log is incorrect
sangheki
parents: 47216
diff changeset
   137
  //      Log value:     SoftReference(5.6) = phase1(1.9) + phase2(1.9) + phase3(1.9)
1520941b7b5d 8186465: Each j.l.Reference elapsed time log is incorrect
sangheki
parents: 47216
diff changeset
   138
  //      When checked:  5.6 < 5.7 (sum of phase1~3)
47784
1360c7949d2f 8190353: [Testbug] test/hotspot/jtreg/gc/logging/TestPrintReferences.java can still fail
sjohanss
parents: 47661
diff changeset
   139
  // Because of this we need method to verify that our measurements and calculations are valid.
1360c7949d2f 8190353: [Testbug] test/hotspot/jtreg/gc/logging/TestPrintReferences.java can still fail
sjohanss
parents: 47661
diff changeset
   140
  public static boolean greaterThanOrApproximatelyEqual(BigDecimal phaseTime, BigDecimal sumOfSubPhasesTime, BigDecimal tolerance) {
1360c7949d2f 8190353: [Testbug] test/hotspot/jtreg/gc/logging/TestPrintReferences.java can still fail
sjohanss
parents: 47661
diff changeset
   141
    if (phaseTime.compareTo(sumOfSubPhasesTime) >= 0) {
1360c7949d2f 8190353: [Testbug] test/hotspot/jtreg/gc/logging/TestPrintReferences.java can still fail
sjohanss
parents: 47661
diff changeset
   142
      // phaseTime is greater than or equal.
1360c7949d2f 8190353: [Testbug] test/hotspot/jtreg/gc/logging/TestPrintReferences.java can still fail
sjohanss
parents: 47661
diff changeset
   143
      return true;
1360c7949d2f 8190353: [Testbug] test/hotspot/jtreg/gc/logging/TestPrintReferences.java can still fail
sjohanss
parents: 47661
diff changeset
   144
    }
47556
1520941b7b5d 8186465: Each j.l.Reference elapsed time log is incorrect
sangheki
parents: 47216
diff changeset
   145
47784
1360c7949d2f 8190353: [Testbug] test/hotspot/jtreg/gc/logging/TestPrintReferences.java can still fail
sjohanss
parents: 47661
diff changeset
   146
    BigDecimal diff = sumOfSubPhasesTime.subtract(phaseTime);
1360c7949d2f 8190353: [Testbug] test/hotspot/jtreg/gc/logging/TestPrintReferences.java can still fail
sjohanss
parents: 47661
diff changeset
   147
    if (diff.compareTo(tolerance) <= 0) {
1360c7949d2f 8190353: [Testbug] test/hotspot/jtreg/gc/logging/TestPrintReferences.java can still fail
sjohanss
parents: 47661
diff changeset
   148
      // Difference is within tolerance, so approximately equal.
1360c7949d2f 8190353: [Testbug] test/hotspot/jtreg/gc/logging/TestPrintReferences.java can still fail
sjohanss
parents: 47661
diff changeset
   149
      return true;
1360c7949d2f 8190353: [Testbug] test/hotspot/jtreg/gc/logging/TestPrintReferences.java can still fail
sjohanss
parents: 47661
diff changeset
   150
    }
1360c7949d2f 8190353: [Testbug] test/hotspot/jtreg/gc/logging/TestPrintReferences.java can still fail
sjohanss
parents: 47661
diff changeset
   151
1360c7949d2f 8190353: [Testbug] test/hotspot/jtreg/gc/logging/TestPrintReferences.java can still fail
sjohanss
parents: 47661
diff changeset
   152
    // sumOfSubPhasesTime is greater than phaseTime and not within tolerance.
1360c7949d2f 8190353: [Testbug] test/hotspot/jtreg/gc/logging/TestPrintReferences.java can still fail
sjohanss
parents: 47661
diff changeset
   153
    return false;
47556
1520941b7b5d 8186465: Each j.l.Reference elapsed time log is incorrect
sangheki
parents: 47216
diff changeset
   154
  }
1520941b7b5d 8186465: Each j.l.Reference elapsed time log is incorrect
sangheki
parents: 47216
diff changeset
   155
47661
92bcf2ab0cb3 8188245: [Testbug] test/hotspot/jtreg/gc/logging/TestPrintReferences.java can fail
sangheki
parents: 47556
diff changeset
   156
  public static BigDecimal checkPhaseTime(String refType) {
92bcf2ab0cb3 8188245: [Testbug] test/hotspot/jtreg/gc/logging/TestPrintReferences.java can fail
sangheki
parents: 47556
diff changeset
   157
    BigDecimal phaseTime = getTimeValue(refType, 2);
92bcf2ab0cb3 8188245: [Testbug] test/hotspot/jtreg/gc/logging/TestPrintReferences.java can fail
sangheki
parents: 47556
diff changeset
   158
    BigDecimal sumOfSubPhasesTime = BigDecimal.valueOf(0.0);
47556
1520941b7b5d 8186465: Each j.l.Reference elapsed time log is incorrect
sangheki
parents: 47216
diff changeset
   159
1520941b7b5d 8186465: Each j.l.Reference elapsed time log is incorrect
sangheki
parents: 47216
diff changeset
   160
    if (softReference.equals(refType)) {
47661
92bcf2ab0cb3 8188245: [Testbug] test/hotspot/jtreg/gc/logging/TestPrintReferences.java can fail
sangheki
parents: 47556
diff changeset
   161
      sumOfSubPhasesTime = sumOfSubPhasesTime.add(getTimeValue(phase1, 4));
47556
1520941b7b5d 8186465: Each j.l.Reference elapsed time log is incorrect
sangheki
parents: 47216
diff changeset
   162
    }
47661
92bcf2ab0cb3 8188245: [Testbug] test/hotspot/jtreg/gc/logging/TestPrintReferences.java can fail
sangheki
parents: 47556
diff changeset
   163
    sumOfSubPhasesTime = sumOfSubPhasesTime.add(getTimeValue(phase2, 4));
92bcf2ab0cb3 8188245: [Testbug] test/hotspot/jtreg/gc/logging/TestPrintReferences.java can fail
sangheki
parents: 47556
diff changeset
   164
    sumOfSubPhasesTime = sumOfSubPhasesTime.add(getTimeValue(phase3, 4));
47556
1520941b7b5d 8186465: Each j.l.Reference elapsed time log is incorrect
sangheki
parents: 47216
diff changeset
   165
47661
92bcf2ab0cb3 8188245: [Testbug] test/hotspot/jtreg/gc/logging/TestPrintReferences.java can fail
sangheki
parents: 47556
diff changeset
   166
    // If there are 3 sub-phases, we should allow 0.1 tolerance.
92bcf2ab0cb3 8188245: [Testbug] test/hotspot/jtreg/gc/logging/TestPrintReferences.java can fail
sangheki
parents: 47556
diff changeset
   167
    final BigDecimal toleranceFor3SubPhases = BigDecimal.valueOf(0.1);
47784
1360c7949d2f 8190353: [Testbug] test/hotspot/jtreg/gc/logging/TestPrintReferences.java can still fail
sjohanss
parents: 47661
diff changeset
   168
    if (!greaterThanOrApproximatelyEqual(phaseTime, sumOfSubPhasesTime, toleranceFor3SubPhases)) {
47661
92bcf2ab0cb3 8188245: [Testbug] test/hotspot/jtreg/gc/logging/TestPrintReferences.java can fail
sangheki
parents: 47556
diff changeset
   169
      throw new RuntimeException(refType +" time(" + phaseTime +
92bcf2ab0cb3 8188245: [Testbug] test/hotspot/jtreg/gc/logging/TestPrintReferences.java can fail
sangheki
parents: 47556
diff changeset
   170
                                 "ms) is less than the sum(" + sumOfSubPhasesTime + "ms) of each phases");
47556
1520941b7b5d 8186465: Each j.l.Reference elapsed time log is incorrect
sangheki
parents: 47216
diff changeset
   171
    }
1520941b7b5d 8186465: Each j.l.Reference elapsed time log is incorrect
sangheki
parents: 47216
diff changeset
   172
47661
92bcf2ab0cb3 8188245: [Testbug] test/hotspot/jtreg/gc/logging/TestPrintReferences.java can fail
sangheki
parents: 47556
diff changeset
   173
    return phaseTime;
47556
1520941b7b5d 8186465: Each j.l.Reference elapsed time log is incorrect
sangheki
parents: 47216
diff changeset
   174
  }
1520941b7b5d 8186465: Each j.l.Reference elapsed time log is incorrect
sangheki
parents: 47216
diff changeset
   175
47661
92bcf2ab0cb3 8188245: [Testbug] test/hotspot/jtreg/gc/logging/TestPrintReferences.java can fail
sangheki
parents: 47556
diff changeset
   176
  // Find the first concurrent Reference Processing log and compare phase time vs. sum of sub-phases.
47556
1520941b7b5d 8186465: Each j.l.Reference elapsed time log is incorrect
sangheki
parents: 47216
diff changeset
   177
  public static void checkLogValue(OutputAnalyzer out) {
1520941b7b5d 8186465: Each j.l.Reference elapsed time log is incorrect
sangheki
parents: 47216
diff changeset
   178
    output = out.getStdout();
1520941b7b5d 8186465: Each j.l.Reference elapsed time log is incorrect
sangheki
parents: 47216
diff changeset
   179
47661
92bcf2ab0cb3 8188245: [Testbug] test/hotspot/jtreg/gc/logging/TestPrintReferences.java can fail
sangheki
parents: 47556
diff changeset
   180
    BigDecimal refProcTime = getTimeValue(referenceProcessing, 0);
47556
1520941b7b5d 8186465: Each j.l.Reference elapsed time log is incorrect
sangheki
parents: 47216
diff changeset
   181
47661
92bcf2ab0cb3 8188245: [Testbug] test/hotspot/jtreg/gc/logging/TestPrintReferences.java can fail
sangheki
parents: 47556
diff changeset
   182
    BigDecimal sumOfSubPhasesTime = checkPhaseTime(softReference);
92bcf2ab0cb3 8188245: [Testbug] test/hotspot/jtreg/gc/logging/TestPrintReferences.java can fail
sangheki
parents: 47556
diff changeset
   183
    sumOfSubPhasesTime = sumOfSubPhasesTime.add(checkPhaseTime(weakReference));
92bcf2ab0cb3 8188245: [Testbug] test/hotspot/jtreg/gc/logging/TestPrintReferences.java can fail
sangheki
parents: 47556
diff changeset
   184
    sumOfSubPhasesTime = sumOfSubPhasesTime.add(checkPhaseTime(finalReference));
92bcf2ab0cb3 8188245: [Testbug] test/hotspot/jtreg/gc/logging/TestPrintReferences.java can fail
sangheki
parents: 47556
diff changeset
   185
    sumOfSubPhasesTime = sumOfSubPhasesTime.add(checkPhaseTime(phantomReference));
47556
1520941b7b5d 8186465: Each j.l.Reference elapsed time log is incorrect
sangheki
parents: 47216
diff changeset
   186
47661
92bcf2ab0cb3 8188245: [Testbug] test/hotspot/jtreg/gc/logging/TestPrintReferences.java can fail
sangheki
parents: 47556
diff changeset
   187
    // If there are 4 sub-phases, we should allow 0.2 tolerance.
92bcf2ab0cb3 8188245: [Testbug] test/hotspot/jtreg/gc/logging/TestPrintReferences.java can fail
sangheki
parents: 47556
diff changeset
   188
    final BigDecimal toleranceFor4SubPhases = BigDecimal.valueOf(0.2);
47784
1360c7949d2f 8190353: [Testbug] test/hotspot/jtreg/gc/logging/TestPrintReferences.java can still fail
sjohanss
parents: 47661
diff changeset
   189
    if (!greaterThanOrApproximatelyEqual(refProcTime, sumOfSubPhasesTime, toleranceFor4SubPhases)) {
47556
1520941b7b5d 8186465: Each j.l.Reference elapsed time log is incorrect
sangheki
parents: 47216
diff changeset
   190
      throw new RuntimeException("Reference Processing time(" + refProcTime + "ms) is less than the sum("
47661
92bcf2ab0cb3 8188245: [Testbug] test/hotspot/jtreg/gc/logging/TestPrintReferences.java can fail
sangheki
parents: 47556
diff changeset
   191
                                 + sumOfSubPhasesTime + "ms) of each phases");
47556
1520941b7b5d 8186465: Each j.l.Reference elapsed time log is incorrect
sangheki
parents: 47216
diff changeset
   192
    }
33103
116b558af514 8136991: [REDO] Additional number of processed references printed with -XX:+PrintReferenceGC after JDK-8047125
brutisso
parents:
diff changeset
   193
  }
116b558af514 8136991: [REDO] Additional number of processed references printed with -XX:+PrintReferenceGC after JDK-8047125
brutisso
parents:
diff changeset
   194
116b558af514 8136991: [REDO] Additional number of processed references printed with -XX:+PrintReferenceGC after JDK-8047125
brutisso
parents:
diff changeset
   195
  static class GCTest {
47556
1520941b7b5d 8186465: Each j.l.Reference elapsed time log is incorrect
sangheki
parents: 47216
diff changeset
   196
    static final int SIZE = 512 * 1024;
1520941b7b5d 8186465: Each j.l.Reference elapsed time log is incorrect
sangheki
parents: 47216
diff changeset
   197
    static Object[] dummy = new Object[SIZE];
46795
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 41723
diff changeset
   198
33103
116b558af514 8136991: [REDO] Additional number of processed references printed with -XX:+PrintReferenceGC after JDK-8047125
brutisso
parents:
diff changeset
   199
    public static void main(String [] args) {
47556
1520941b7b5d 8186465: Each j.l.Reference elapsed time log is incorrect
sangheki
parents: 47216
diff changeset
   200
      for (int i = 0; i < SIZE; i++) {
1520941b7b5d 8186465: Each j.l.Reference elapsed time log is incorrect
sangheki
parents: 47216
diff changeset
   201
        dummy[i] = new SoftReference<>(new Object());
46795
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 41723
diff changeset
   202
      }
33103
116b558af514 8136991: [REDO] Additional number of processed references printed with -XX:+PrintReferenceGC after JDK-8047125
brutisso
parents:
diff changeset
   203
    }
116b558af514 8136991: [REDO] Additional number of processed references printed with -XX:+PrintReferenceGC after JDK-8047125
brutisso
parents:
diff changeset
   204
  }
116b558af514 8136991: [REDO] Additional number of processed references printed with -XX:+PrintReferenceGC after JDK-8047125
brutisso
parents:
diff changeset
   205
}