--- old/src/jdk.jcmd/share/classes/sun/tools/jmap/JMap.java 2020-03-16 16:47:41.102992994 +0800 +++ new/src/jdk.jcmd/share/classes/sun/tools/jmap/JMap.java 2020-03-16 16:47:40.922993812 +0800 @@ -164,33 +164,57 @@ return null; } + private static String add_option(String cmd, String opt) { + if (cmd.isEmpty()) { + return opt; + } + return cmd + "," + opt; + } + private static void histo(String pid, String options) throws AttachNotSupportedException, IOException, UnsupportedEncodingException { String liveopt = "-all"; String filename = null; + String parallelthreadnum = null; String subopts[] = options.split(","); + boolean set_all = false; + boolean set_live = false; + String cmdline = ""; for (int i = 0; i < subopts.length; i++) { String subopt = subopts[i]; if (subopt.equals("") || subopt.equals("all")) { - // pass + cmdline = add_option(cmdline, "-all"); + set_all = true; } else if (subopt.equals("live")) { - liveopt = "-live"; + // Add '-' for compatibility. + cmdline = add_option(cmdline, "-live"); + set_live = true; } else if (subopt.startsWith("file=")) { filename = parseFileName(subopt); if (filename == null) { usage(1); // invalid options or no filename } + cmdline = add_option(cmdline, filename); + } else if (subopt.startsWith("parallelThreadNum=")) { + parallelthreadnum = subopt.substring(19); + if (parallelthreadnum == null) { + usage(1); + } + // Add "parallelThreadsNum=<>" for later check + cmdline = add_option(cmdline, subopt); } else { usage(1); } } + if (set_live && set_all) { + usage(1); + } System.out.flush(); - // inspectHeap is not the same as jcmd GC.class_histogram - executeCommandForPid(pid, "inspectheap", liveopt, filename); + executeCommandForPid(pid, "inspectheap", cmdline); } private static void dump(String pid, String options) @@ -287,6 +311,10 @@ System.err.println(" live count only live objects"); System.err.println(" all count all objects in the heap (default if one of \"live\" or \"all\" is not specified)"); System.err.println(" file= dump data to "); + System.err.println(" parallelThreadNum= parallel threads number for heap iteration:"); + System.err.println(" parallelThreadNum=0 default behavior, use predefined number of threads"); + System.err.println(" parallelThreadNum=1 disable parallel heap iteration"); + System.err.println(" parallelThreadNum= use N threads for parallel heap iteration"); System.err.println(""); System.err.println(" Example: jmap -histo:live,file=/tmp/histo.data "); System.exit(exit);