--- old/test/gc/metaspace/ClassMetaspaceSizeInJmapHeap.java 2013-03-13 22:44:14.607571762 +0100 +++ new/test/gc/metaspace/ClassMetaspaceSizeInJmapHeap.java 2013-03-13 22:44:14.543571763 +0100 @@ -30,6 +30,7 @@ */ import com.oracle.java.testlibrary.*; +import com.oracle.java.testlibrary.gc.*; import java.nio.file.*; import java.io.File; import java.nio.charset.Charset; @@ -39,8 +40,10 @@ public static void main(String[] args) throws Exception { String pid = Integer.toString(ProcessTools.getProcessId()); - ProcessBuilder pb = new ProcessBuilder(); - pb.command(JDKToolFinder.getJDKTool("jmap"), "-heap", pid); + JmapLauncher jmap = new JmapLauncher(); + jmap.setJmapArguments("-heap", pid); + + ProcessBuilder pb = new ProcessBuilder(jmap.getCommand()); File out = new File("ClassMetaspaceSizeInJmapHeap.stdout.txt"); pb.redirectOutput(out); --- /dev/null 2013-03-13 20:37:46.581069912 +0100 +++ new/test/testlibrary/com/oracle/java/testlibrary/gc/JmapLauncher.java 2013-03-13 22:44:14.911571759 +0100 @@ -0,0 +1,102 @@ +/* + * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package com.oracle.java.testlibrary.gc; + +import java.util.List; +import java.util.ArrayList; +import com.oracle.java.testlibrary.*; + +/** + * A helper class for creating a command that starts a {@code jmap} process. + * + * The JmapLauncher can in particular be combined with a + * java.lang.ProcessBuilder to easily start a jmap process. For example, the + * following code run {@code jmap -heap} against a process with GC logging + * turned on for the {@code jmap} process: + * + *
+ * {@code
+ * JmapLauncher jmap = new JmapLauncher("-XX:+PrintGC");
+ * jmap.setJmapArguments("-heap", pid);
+ * ProcessBuilder pb = new ProcessBuilder(jmap.getCommand());
+ * Process p = pb.start();
+ * }
+ * 
+ */ +public class JmapLauncher { + private final String executable; + private final List vmArgs = new ArrayList(); + private final List jmapArgs = new ArrayList(); + + /** + * Creates a new {@code jmap} launcher and also sets the Java virtual + * machine (JVM) arguments of the command. + * + * The JVM arguments are the arguments that are prefixed {@code -J} and + * are passed to the underlying JVM that runs the {@code jmap} program. + * + * Any platform specific arguments that are needed to run the {@code jmap} + * command will automatically be added. + * + * @param args The arguments to the JVM. Will be automatically prefix with + * {@code J}. + */ + public JmapLauncher(String ... args) { + executable = JDKToolFinder.getJDKTool("jmap"); + setVMArgs(ProcessTools.getPlatformSpecificVMArgs()); + setVMArgs(args); + } + + /** + * Sets the arguments for {@code jmap}. Note that any JVM specific + * arguments must be passed via the constructor. + * + * @param args The arguments to {@code jmap}. + */ + public void setJmapArguments(String ... args) { + for (String arg : args) { + jmapArgs.add(arg); + } + } + + /** + * Returns the command that can be used for starting the {@code jmap} + * process. + * + * @return An array whose elements are the arguments of the command. + */ + public String[] getCommand() { + List command = new ArrayList(); + command.add(executable); + command.addAll(vmArgs); + command.addAll(jmapArgs); + return command.toArray(new String[command.size()]); + } + + private void setVMArgs(String[] args) { + for (String arg : args) { + vmArgs.add("-J" + arg); + } + } +}