Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndrew Johnson2019-08-18 03:26:04 -0400
committerGerrit Code Review @ Eclipse.org2019-08-18 03:26:04 -0400
commit0a3b37555f5980ada138254120622cd56630bebe (patch)
tree09933d57bf9156cb853c369b8a3c5e3c35ec7b86
parent13234932e4e70d98ba68b2883d2f0c0de16313a3 (diff)
parent9cd4ef30ec713d60eaa81fc1d83005fbcd7a3dbb (diff)
downloadorg.eclipse.mat-0a3b37555f5980ada138254120622cd56630bebe.tar.gz
org.eclipse.mat-0a3b37555f5980ada138254120622cd56630bebe.tar.xz
org.eclipse.mat-0a3b37555f5980ada138254120622cd56630bebe.zip
Merge "277422: Nice if heap parsing was multi-threaded"
-rw-r--r--plugins/org.eclipse.mat.tests/META-INF/tests/performance.xml2
-rw-r--r--plugins/org.eclipse.mat.tests/src/org/eclipse/mat/tests/regression/Application.java14
-rw-r--r--plugins/org.eclipse.mat.tests/src/org/eclipse/mat/tests/regression/PerfData.java34
-rw-r--r--plugins/org.eclipse.mat.tests/src/org/eclipse/mat/tests/regression/TestApplication.java254
-rw-r--r--plugins/org.eclipse.mat.tests/src/org/eclipse/mat/tests/regression/TestParseApp.java29
-rw-r--r--plugins/org.eclipse.mat.tests/src/org/eclipse/mat/tests/regression/TestSuiteResult.java12
6 files changed, 287 insertions, 58 deletions
diff --git a/plugins/org.eclipse.mat.tests/META-INF/tests/performance.xml b/plugins/org.eclipse.mat.tests/META-INF/tests/performance.xml
index 2c3bdeb3..24b0f86d 100644
--- a/plugins/org.eclipse.mat.tests/META-INF/tests/performance.xml
+++ b/plugins/org.eclipse.mat.tests/META-INF/tests/performance.xml
@@ -29,7 +29,7 @@
<query name="Retained Size for Classloaders(precise)">
<param key="html.separate_file" value="true" />
<param key="limit" value="50000" />
- <command>retained_size_histogram_test -byClassLoader </command>
+ <command>retained_size_histogram_test -byClassLoader</command>
</query>
<query name="Immediate Dominators of java.util.HashMap$Entry">
<param key="html.separate_file" value="true" />
diff --git a/plugins/org.eclipse.mat.tests/src/org/eclipse/mat/tests/regression/Application.java b/plugins/org.eclipse.mat.tests/src/org/eclipse/mat/tests/regression/Application.java
index 25d0dd89..0649ea34 100644
--- a/plugins/org.eclipse.mat.tests/src/org/eclipse/mat/tests/regression/Application.java
+++ b/plugins/org.eclipse.mat.tests/src/org/eclipse/mat/tests/regression/Application.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2008 SAP AG.
+ * Copyright (c) 2008,2019 SAP AG and IBM Corporation.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@@ -7,6 +7,7 @@
*
* Contributors:
* SAP AG - initial API and implementation
+ * Andrew Johnson - memory usage
*******************************************************************************/
package org.eclipse.mat.tests.regression;
@@ -105,7 +106,7 @@ public class Application implements IApplication
if (report == null)
throw new SnapshotException(MessageUtil.format("Report not found: {0}", args[2]));
- new TestParseApp(snapshotFile, report).run();
+ new TestParseApp(snapshotFile, report, args[2].contains(":performance")).run();
return IApplication.EXIT_OK;
}
@@ -119,7 +120,14 @@ public class Application implements IApplication
+ " -performance <folder> <jvmargs> : run performance tests on snapshots in given folder\n" //
+ " -cleanAll <folder> : clean index files and test results\n" //
+ " -newBaseline <folder> : overwrite existing base line with the last test results\n" //
- + " -parse <snaphost> <report> : parse heap dump and print times\n");
+ + " -parse <snaphost> <report> : parse heap dump and print times\n\n"
+ + " If <jvmargs> contains two -Xmx values then a binary search is used to find the\n"
+ + " minimum value of -Xmx in the range which works.\n"
+ + " If <jvmargs> contains two -XX:activeProcessorCount=\n"
+ + " or two -Djava.util.concurrent.ForkJoinPool.common.parallelism= values then\n"
+ + " the tests are repeated with the range of values from one to the other.\n"
+ + " Use double-quotes around <jvmargs> having spaces or multiple options.\n"
+ );
}
public void stop()
diff --git a/plugins/org.eclipse.mat.tests/src/org/eclipse/mat/tests/regression/PerfData.java b/plugins/org.eclipse.mat.tests/src/org/eclipse/mat/tests/regression/PerfData.java
index f796ec2d..4658fb66 100644
--- a/plugins/org.eclipse.mat.tests/src/org/eclipse/mat/tests/regression/PerfData.java
+++ b/plugins/org.eclipse.mat.tests/src/org/eclipse/mat/tests/regression/PerfData.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2008 SAP AG.
+ * Copyright (c) 2008,2019 SAP AG and IBM Corporation.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@@ -7,6 +7,7 @@
*
* Contributors:
* SAP AG - initial API and implementation
+ * Andrew Johnson - Xmx and thread numbers
*******************************************************************************/
package org.eclipse.mat.tests.regression;
@@ -15,11 +16,19 @@ package org.eclipse.mat.tests.regression;
{
private String testName;
private String time;
+ private String usedMem;
+ private String freeMem;
+ private String totalMem;
+ private String maxMem;
- public PerfData(String testName, String time)
+ public PerfData(String testName, String time, String usedMem, String freeMem, String totalMem, String maxMem)
{
this.testName = testName;
this.time = time;
+ this.usedMem = usedMem;
+ this.freeMem = freeMem;
+ this.totalMem = totalMem;
+ this.maxMem = maxMem;
}
public String getTestName()
@@ -31,4 +40,25 @@ package org.eclipse.mat.tests.regression;
{
return time;
}
+
+ public String getUsedMem()
+ {
+ return usedMem;
+ }
+
+ public String getFreeMem()
+ {
+ return freeMem;
+ }
+
+ public String getTotalMem()
+ {
+ return totalMem;
+ }
+
+ public String getMaxMem()
+ {
+ return maxMem;
+ }
+
}
diff --git a/plugins/org.eclipse.mat.tests/src/org/eclipse/mat/tests/regression/TestApplication.java b/plugins/org.eclipse.mat.tests/src/org/eclipse/mat/tests/regression/TestApplication.java
index 34737b42..a17c4eff 100644
--- a/plugins/org.eclipse.mat.tests/src/org/eclipse/mat/tests/regression/TestApplication.java
+++ b/plugins/org.eclipse.mat.tests/src/org/eclipse/mat/tests/regression/TestApplication.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2008 SAP AG.
+ * Copyright (c) 2008,2019 SAP AG and IBM Corporation.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@@ -7,6 +7,7 @@
*
* Contributors:
* SAP AG - initial API and implementation
+ * Andrew Johnson - Xmx and thread numbers
*******************************************************************************/
package org.eclipse.mat.tests.regression;
@@ -28,6 +29,7 @@ import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
+import java.util.Locale;
import java.util.Map;
import java.util.Properties;
import java.util.regex.Matcher;
@@ -129,51 +131,139 @@ public class TestApplication
throw new IOException(MessageUtil.format("{0} contains no heap dumps", dumpDir.getAbsolutePath()));
List<TestSuiteResult> testResults = new ArrayList<TestSuiteResult>(dumpList.size());
- for (File dump : dumpList)
+ fileloop: for (File dump : dumpList)
{
- TestSuiteResult result = new TestSuiteResult(dump);
- testResults.add(result);
-
- try
- {
- // prepare test environment
- cleanIndexFiles(dump, result, true);
- }
- catch (Exception e)
- {
- // skip test suite for this heap dump
- continue;
- }
-
- try
+ // Multiple -Djava.util.concurrent.ForkJoinPool.common.parallelism= means
+ // run with every value
+ // Also allow -XX:ActiveProcessorCount=
+ String propname1 = "java.util.concurrent.ForkJoinPool.common.parallelism";
+ String prop1 = "-D" + propname1 + "=";
+ String propPattern1 = Pattern.quote(prop1);
+ String propname2 = "XX:ActiveProcessorCount";
+ String prop2 = "-" + propname2 + "=";
+ String propPattern2 = Pattern.quote(prop2);
+ String propPattern = propPattern1 + "|" + propPattern2;
+ // Two instances of property, match first and last, consume space before mid
+ Pattern threadPattern = Pattern.compile("(.*?)("+propPattern+")(\\d+) ?" +
+ "(.*)\\2(\\d+)" + "(.*)");
+ int minThreads = 1;
+ int maxThreads = 1;
+ Matcher threadMatch = threadPattern.matcher(jvmFlags);
+ if (threadMatch.matches())
{
- // parse the heap dump and execute the test suite
- parse(dump, jvmFlags, result, !compare);
+ minThreads = Integer.parseInt(threadMatch.group(3));
+ maxThreads = Integer.parseInt(threadMatch.group(5));
}
- catch (Exception e)
+ for (int th = minThreads; th <= maxThreads; ++th)
{
- System.err.println("ERROR: " + e.getMessage());
- result.addErrorMessage(e.getMessage());
- continue;
- }
-
- // process the result (compare to the baseline)
- if (compare)
- processResults(dump, result);
+ String jvmFlags1 = this.jvmFlags;
+ if (threadMatch.matches())
+ {
+ String prefix = threadMatch.group(1);
+ String propmatch = threadMatch.group(2);
+ String mid = threadMatch.group(4);
+ String suffix = threadMatch.group(6);
+ jvmFlags1 = prefix + mid + propmatch + th + suffix;
+ }
- // do the cleanup only if all the tests succeeded
- boolean succeed = true;
- for (SingleTestResult entry : result.getTestData())
- {
- if (entry.getResult().equals("Failed"))
+ // Multiple -Xmx settings means for us to find the smallest which works
+ String memArg="-Xmx";
+ String memArgPattern = Pattern.quote(memArg);
+ String unitPattern="[kKmMgG]?";
+ // Two instances of Xmx, choose first and last, consume space before mid
+ Pattern mXpattern = Pattern.compile("(.*?)(" + memArgPattern + ")(\\d+)(" + unitPattern + ") ?" +
+ "(.*)\\2(\\d+)(" + unitPattern + ")" +
+ "(.*)");
+ long min = 1;
+ long max = 1;
+ String prefix="",mxmatch="",mid="",unit="",suffix="";
+ Matcher m = mXpattern.matcher(jvmFlags1);
+ if (m.matches())
{
- succeed = false;
- break;
+ // Variable heap size e.g.
+ // -Xmx64M -Xms1024M
+ // -Xmx64m -Xmx1G
+ prefix = m.group(1);
+ mxmatch = m.group(2);
+ min = Long.parseLong(m.group(3));
+ String unitMin = m.group(4);
+ mid = m.group(5);
+ max = Long.parseLong(m.group(6));
+ String unitMax = m.group(7);
+ suffix = m.group(8);
+ // Normalize units
+ unit = unitMin;
+ if (!unitMin.equals(unitMax))
+ {
+ unit = normalizedUnit(unitMin, unitMax);
+ min = normalizeToUnit(min, unitMin, unit);
+ max = normalizeToUnit(max, unitMax, unit);
+ }
}
- }
- if (succeed && result.getErrorMessages().isEmpty())
- cleanIndexFiles(dump, result, false);
+ boolean success = false;
+ /*
+ * Binary search
+ */
+ do
+ {
+ long mx = (min + max) >>> 1;
+ String jvmFlags = m.matches() ? prefix + mid + mxmatch + mx + unit + suffix : jvmFlags1;
+
+ TestSuiteResult result = new TestSuiteResult(dump, jvmFlags);
+ testResults.add(result);
+ try
+ {
+ // prepare test environment
+ cleanIndexFiles(dump, result, true);
+ }
+ catch (Exception e)
+ {
+ // skip test suite for this heap dump
+ continue fileloop;
+ }
+ try
+ {
+ // parse the heap dump and execute the test suite
+ parse(dump, jvmFlags, result, !compare);
+ max = mx - 1;
+ success = true;
+ }
+ catch (Exception e)
+ {
+ min = mx + 1;
+ if (min > max && !success)
+ {
+ System.err.println("ERROR: " + e.getMessage());
+ result.addErrorMessage(e.getMessage());
+ }
+ else
+ {
+ // Expected failure with a too small Xmx
+ testResults.remove(result);
+ }
+ continue;
+ }
+
+ // process the result (compare to the baseline)
+ if (compare)
+ processResults(dump, result);
+
+ // do the cleanup only if all the tests succeeded
+ boolean succeed = true;
+ for (SingleTestResult entry : result.getTestData())
+ {
+ if (entry.getResult().equals("Failed"))
+ {
+ succeed = false;
+ break;
+ }
+ }
+ if (succeed && result.getErrorMessages().isEmpty())
+ cleanIndexFiles(dump, result, false);
+
+ } while (min <= max);
+ }
}
if (!testResults.isEmpty())
@@ -202,11 +292,73 @@ public class TestApplication
}
}
+ /**
+ * Convert a value to the new units.
+ * @param value
+ * @param fromUnit
+ * @param toUnit
+ * @return the new value expressed as toUnit
+ */
+ private long normalizeToUnit(long value, String fromUnit, String toUnit)
+ {
+ String u1 = (toUnit+fromUnit).toUpperCase(Locale.ENGLISH);
+ if (u1.equals("K") || u1.equals("KM") || u1.equals("MG") || u1.equals("GT"))
+ {
+ value *= 1024;
+ }
+ else if (u1.equals("M") || u1.equals("KG") || u1.equals("MT"))
+ {
+ value *= 1024 * 1024;
+ }
+ else if (u1.equals("G") || u1.equals("KT"))
+ {
+ value *= 1024 * 1024 * 1024;
+ }
+ else if (u1.equals("T"))
+ {
+ value *= 1024L * 1024 * 1024 * 1024;
+ }
+ return value;
+ }
+
+ /**
+ * Choose the smaller of the two units.
+ * @param unitMin
+ * @param unitMax
+ * @return the smaller unit
+ */
+ private String normalizedUnit(String unitMin, String unitMax)
+ {
+ String unit;
+ if (unitMin.equals(unitMax))
+ unit = unitMin;
+ else if ("tT".contains(unitMin))
+ unit = unitMax;
+ else if ("tT".contains(unitMax))
+ unit = unitMin;
+ else if ("gG".contains(unitMin))
+ unit = unitMax;
+ else if ("gG".contains(unitMax))
+ unit = unitMin;
+ else if ("mM".contains(unitMin))
+ unit = unitMax;
+ else if ("mM".contains(unitMax))
+ unit = unitMin;
+ else if ("kK".contains(unitMin))
+ unit = unitMax;
+ else if ("kK".contains(unitMax))
+ unit = unitMin;
+ else
+ unit = unitMin;
+ return unit;
+ }
+
private static final String URI = "http://www.eclipse.org/mat/regtest/";
private interface Parameter
{
String NAME = "name";
+ String JVM_FLAGS = "jvmFlags";
String TEST_SUITE = "testSuite";
String HEAP_DUMP = "heapDump";
String ERROR = "error";
@@ -245,6 +397,7 @@ public class TestApplication
{
atts.clear();
atts.addAttribute(URI, Parameter.NAME, Parameter.NAME, "CDATA", testSuiteResult.getDumpName());
+ atts.addAttribute(URI, Parameter.JVM_FLAGS, Parameter.JVM_FLAGS, "CDATA", testSuiteResult.getJVMflags());
handler.startElement(URI, Parameter.HEAP_DUMP, Parameter.HEAP_DUMP, atts);
atts.clear();
@@ -345,7 +498,13 @@ public class TestApplication
.append("Test Name").append(RegTestUtils.SEPARATOR) //
.append("Date").append(RegTestUtils.SEPARATOR) //
.append("Time").append(RegTestUtils.SEPARATOR) //
- .append("Build Version").append("\n");
+ .append("Build Version").append(RegTestUtils.SEPARATOR) //
+ .append("JVM flags").append(RegTestUtils.SEPARATOR) //
+ .append("Used memory").append(RegTestUtils.SEPARATOR) //
+ .append("Free memory").append(RegTestUtils.SEPARATOR) //
+ .append("Total memory").append(RegTestUtils.SEPARATOR) //
+ .append("Maximum memory").append(RegTestUtils.SEPARATOR) //
+ .append("\n");
Bundle bundle = Platform.getBundle("org.eclipse.mat.api");
String buildId = (bundle != null) ? bundle.getHeaders().get("Bundle-Version").toString()
@@ -363,7 +522,13 @@ public class TestApplication
.append(record.getTestName()).append(RegTestUtils.SEPARATOR) //
.append(date).append(RegTestUtils.SEPARATOR) //
.append(record.getTime()).append(RegTestUtils.SEPARATOR) //
- .append(buildId).append("\n");
+ .append(buildId).append(RegTestUtils.SEPARATOR) //
+ .append(result.getJVMflags()).append(RegTestUtils.SEPARATOR) //
+ .append(record.getUsedMem()).append(RegTestUtils.SEPARATOR) //
+ .append(record.getFreeMem()).append(RegTestUtils.SEPARATOR) //
+ .append(record.getTotalMem()).append(RegTestUtils.SEPARATOR) //
+ .append(record.getMaxMem()) //
+ .append("\n");
}
}
@@ -573,7 +738,7 @@ public class TestApplication
// get result file name
String resultsFileName = dumpFile.getAbsolutePath().substring(0, dumpFile.getAbsolutePath().lastIndexOf('.'))
+ "_Regression_Tests.zip";
- System.out.println("Unzip: unziping test result file " + resultsFileName);
+ System.out.println("Unzip: unzipping test result file " + resultsFileName);
File originFile = new File(resultsFileName);
File targetFile = new File(baselineDir, originFile.getName());
@@ -586,7 +751,7 @@ public class TestApplication
}
else
{
- String message = "ERROR: Failed coping test results file " + resultsFileName
+ String message = "ERROR: Failed copying test results file " + resultsFileName
+ " to the destination folder " + baselineDir;
result.addErrorMessage(message);
System.err.println(message);
@@ -668,12 +833,13 @@ public class TestApplication
// extract parsing time
if (extractTime)
{
- Pattern pattern = Pattern.compile("Task: (.*) ([0-9]*) ms");
+ Pattern pattern = Pattern.compile("Task: (.*) ([0-9]+) ms used ([0-9]+) free ([0-9]+) total ([0-9]+) max ([0-9]+)");
for (String line : outputGobbler.getLines())
{
Matcher matcher = pattern.matcher(line);
if (matcher.matches())
- result.addPerfData(new PerfData(matcher.group(1), matcher.group(2)));
+ result.addPerfData(new PerfData(matcher.group(1), matcher.group(2),
+ matcher.group(3), matcher.group(4), matcher.group(5), matcher.group(6)));
}
}
}
diff --git a/plugins/org.eclipse.mat.tests/src/org/eclipse/mat/tests/regression/TestParseApp.java b/plugins/org.eclipse.mat.tests/src/org/eclipse/mat/tests/regression/TestParseApp.java
index 1f5f20ba..4cd0a60a 100644
--- a/plugins/org.eclipse.mat.tests/src/org/eclipse/mat/tests/regression/TestParseApp.java
+++ b/plugins/org.eclipse.mat.tests/src/org/eclipse/mat/tests/regression/TestParseApp.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2008 SAP AG.
+ * Copyright (c) 2008,2019 SAP AG and IBM Corporation.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@@ -7,6 +7,7 @@
*
* Contributors:
* SAP AG - initial API and implementation
+ * Andrew Johnson - Xmx and thread numbers
*******************************************************************************/
package org.eclipse.mat.tests.regression;
@@ -25,16 +26,18 @@ public class TestParseApp
{
private File snapshotFile;
private Spec report;
+ private boolean showMem;
- public TestParseApp(File snapshotFile, Spec report)
+ public TestParseApp(File snapshotFile, Spec report, boolean showMem)
{
this.snapshotFile = snapshotFile;
this.report = report;
+ this.showMem = showMem;
}
public void run() throws Exception
{
- IProgressListener listener = new ClockedProgressListener(snapshotFile, System.out);
+ IProgressListener listener = new ClockedProgressListener(snapshotFile, System.out, showMem);
ISnapshot snapshot = null;
@@ -62,11 +65,12 @@ public class TestParseApp
private int count = 0;
private String absolutePath;
private String fileName;
+ private boolean showMem;
private long timestamp = 0;
private String lastMessage = null;
- /* package */ClockedProgressListener(File snapshot, PrintStream out)
+ /* package */ClockedProgressListener(File snapshot, PrintStream out, boolean showMemUsage)
{
this.out = out;
this.timestamp = System.currentTimeMillis();
@@ -77,6 +81,7 @@ public class TestParseApp
int p = this.fileName.lastIndexOf('.');
if (p >= 0)
this.fileName = this.fileName.substring(0, p);
+ this.showMem = showMemUsage;
}
public void beginTask(String name, int totalWork)
@@ -99,8 +104,20 @@ public class TestParseApp
if (p >= 0)
lastMessage = lastMessage.substring(0, p) + "DUMP" + lastMessage.substring(p + fileName.length());
- out.println(String.format("Task: [%02d] %s %s ms", ++count, lastMessage, String
- .valueOf(now - timestamp)));
+ if (showMem)
+ {
+ long freeMem = Runtime.getRuntime().freeMemory();
+ long totalMem = Runtime.getRuntime().totalMemory();
+ long maxMem = Runtime.getRuntime().maxMemory();
+ long usedMem = totalMem - freeMem;
+ out.println(String.format("Task: [%02d] %s %s ms used %d free %d total %d max %d", ++count, lastMessage, String
+ .valueOf(now - timestamp), usedMem, freeMem, totalMem, maxMem));
+ }
+ else
+ {
+ out.println(String.format("Task: [%02d] %s %s ms", ++count, lastMessage, String
+ .valueOf(now - timestamp)));
+ }
}
this.lastMessage = name;
diff --git a/plugins/org.eclipse.mat.tests/src/org/eclipse/mat/tests/regression/TestSuiteResult.java b/plugins/org.eclipse.mat.tests/src/org/eclipse/mat/tests/regression/TestSuiteResult.java
index fb04a708..c15e7f51 100644
--- a/plugins/org.eclipse.mat.tests/src/org/eclipse/mat/tests/regression/TestSuiteResult.java
+++ b/plugins/org.eclipse.mat.tests/src/org/eclipse/mat/tests/regression/TestSuiteResult.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2008 SAP AG.
+ * Copyright (c) 2008,2019 SAP AG and IBM Corporation.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@@ -7,6 +7,7 @@
*
* Contributors:
* SAP AG - initial API and implementation
+ * Andrew Johnson - Xmx and thread numbers
*******************************************************************************/
package org.eclipse.mat.tests.regression;
@@ -17,13 +18,15 @@ import java.util.List;
/*package*/class TestSuiteResult
{
private File snapshot;
+ private String jvmFlags;
private List<SingleTestResult> singleTestResult = new ArrayList<SingleTestResult>();
private List<String> errorMessages = new ArrayList<String>();
private List<PerfData> perfData = new ArrayList<PerfData>();
- public TestSuiteResult(File snapshot)
+ public TestSuiteResult(File snapshot, String jvmFlags)
{
this.snapshot = snapshot;
+ this.jvmFlags = jvmFlags;
}
public String getDumpName()
@@ -36,6 +39,11 @@ import java.util.List;
return snapshot;
}
+ public String getJVMflags()
+ {
+ return jvmFlags;
+ }
+
public List<SingleTestResult> getTestData()
{
return singleTestResult;

Back to the top