Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/openjdk-multiarch-jdk8u
Path: blob/aarch64-shenandoah-jdk8u272-b10/hotspot/test/gc/g1/TestSummarizeRSetStatsTools.java
32284 views
1
/*
2
* Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
3
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4
*
5
* This code is free software; you can redistribute it and/or modify it
6
* under the terms of the GNU General Public License version 2 only, as
7
* published by the Free Software Foundation.
8
*
9
* This code is distributed in the hope that it will be useful, but WITHOUT
10
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12
* version 2 for more details (a copy is included in the LICENSE file that
13
* accompanied this code).
14
*
15
* You should have received a copy of the GNU General Public License version
16
* 2 along with this work; if not, write to the Free Software Foundation,
17
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18
*
19
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20
* or visit www.oracle.com if you need additional information or have any
21
* questions.
22
*/
23
24
/*
25
* Common helpers for TestSummarizeRSetStats* tests
26
*/
27
28
import sun.management.ManagementFactoryHelper;
29
import com.sun.management.HotSpotDiagnosticMXBean;
30
import com.sun.management.VMOption;
31
32
import com.oracle.java.testlibrary.*;
33
import java.util.regex.Matcher;
34
import java.util.regex.Pattern;
35
import java.lang.Thread;
36
import java.util.ArrayList;
37
import java.util.Arrays;
38
39
class VerifySummaryOutput {
40
// 4M size, both are directly allocated into the old gen
41
static Object[] largeObject1 = new Object[1024 * 1024];
42
static Object[] largeObject2 = new Object[1024 * 1024];
43
44
static int[] temp;
45
46
public static void main(String[] args) {
47
// create some cross-references between these objects
48
for (int i = 0; i < largeObject1.length; i++) {
49
largeObject1[i] = largeObject2;
50
}
51
52
for (int i = 0; i < largeObject2.length; i++) {
53
largeObject2[i] = largeObject1;
54
}
55
56
int numGCs = Integer.parseInt(args[0]);
57
58
if (numGCs > 0) {
59
// try to force a minor collection: the young gen is 4M, the
60
// amount of data allocated below is roughly that (4*1024*1024 +
61
// some header data)
62
for (int i = 0; i < 1024 ; i++) {
63
temp = new int[1024];
64
}
65
}
66
67
for (int i = 0; i < numGCs - 1; i++) {
68
System.gc();
69
}
70
}
71
}
72
73
public class TestSummarizeRSetStatsTools {
74
75
// the VM is currently run using G1GC, i.e. trying to test G1 functionality.
76
public static boolean testingG1GC() {
77
HotSpotDiagnosticMXBean diagnostic = ManagementFactoryHelper.getDiagnosticMXBean();
78
79
VMOption option = diagnostic.getVMOption("UseG1GC");
80
if (option.getValue().equals("false")) {
81
System.out.println("Skipping this test. It is only a G1 test.");
82
return false;
83
}
84
return true;
85
}
86
87
public static String runTest(String[] additionalArgs, int numGCs) throws Exception {
88
ArrayList<String> finalargs = new ArrayList<String>();
89
String[] defaultArgs = new String[] {
90
"-XX:+UseG1GC",
91
"-Xmn4m",
92
"-Xmx20m",
93
"-XX:InitiatingHeapOccupancyPercent=100", // we don't want the additional GCs due to initial marking
94
"-XX:+PrintGC",
95
"-XX:+UnlockDiagnosticVMOptions",
96
"-XX:G1HeapRegionSize=1M",
97
};
98
99
finalargs.addAll(Arrays.asList(defaultArgs));
100
101
if (additionalArgs != null) {
102
finalargs.addAll(Arrays.asList(additionalArgs));
103
}
104
105
finalargs.add(VerifySummaryOutput.class.getName());
106
finalargs.add(String.valueOf(numGCs));
107
108
ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(
109
finalargs.toArray(new String[0]));
110
OutputAnalyzer output = new OutputAnalyzer(pb.start());
111
112
output.shouldHaveExitValue(0);
113
114
String result = output.getStdout();
115
return result;
116
}
117
118
private static void checkCounts(int expected, int actual, String which) throws Exception {
119
if (expected != actual) {
120
throw new Exception("RSet summaries mention " + which + " regions an incorrect number of times. Expected " + expected + ", got " + actual);
121
}
122
}
123
124
public static void expectPerRegionRSetSummaries(String result, int expectedCumulative, int expectedPeriodic) throws Exception {
125
expectRSetSummaries(result, expectedCumulative, expectedPeriodic);
126
int actualYoung = result.split("Young regions").length - 1;
127
int actualHumonguous = result.split("Humonguous regions").length - 1;
128
int actualFree = result.split("Free regions").length - 1;
129
int actualOther = result.split("Old regions").length - 1;
130
131
// the strings we check for above are printed four times per summary
132
int expectedPerRegionTypeInfo = (expectedCumulative + expectedPeriodic) * 4;
133
134
checkCounts(expectedPerRegionTypeInfo, actualYoung, "Young");
135
checkCounts(expectedPerRegionTypeInfo, actualHumonguous, "Humonguous");
136
checkCounts(expectedPerRegionTypeInfo, actualFree, "Free");
137
checkCounts(expectedPerRegionTypeInfo, actualOther, "Old");
138
}
139
140
public static void expectRSetSummaries(String result, int expectedCumulative, int expectedPeriodic) throws Exception {
141
int actualTotal = result.split("concurrent refinement").length - 1;
142
int actualCumulative = result.split("Cumulative RS summary").length - 1;
143
144
if (expectedCumulative != actualCumulative) {
145
throw new Exception("Incorrect amount of RSet summaries at the end. Expected " + expectedCumulative + ", got " + actualCumulative);
146
}
147
148
if (expectedPeriodic != (actualTotal - actualCumulative)) {
149
throw new Exception("Incorrect amount of per-period RSet summaries at the end. Expected " + expectedPeriodic + ", got " + (actualTotal - actualCumulative));
150
}
151
}
152
}
153
154
155