On Fri, 5 Feb 2021 10:03:09 GMT, Serguei Spitsyn <sspit...@openjdk.org> wrote:

>> One implementation is in the JVM itself, to be used when the JVM is still 
>> running well, and not just from command line tools. Heap dumping can also be 
>> triggered by the JVM itslef by setting flags like -XX:+HeapDumpBeforeFullGC. 
>> The other implementation is in SA, to be used on a core file or a hung JVM 
>> process, although it can also be used on a JVM that is still running well. 
>> BTW, there used to be a 3rd implementation. The old hprof profiler (a JVMTI 
>> agent) also was used to generate hprof files.
>
> Hi Lin,
> 
> A week ago you replied that you are accepting the following suggested 
> refactoring:
> 
>                    /*
>                     * Possible commands:
>                     *     dumpheap gz=1 file
>                     *     dumpheap gz=1
>                     *     dumpheap file
>                     *     dumpheap
>                     *
>                     * Use default filename if cntTokens == 0.
>                     * Handle cases with cntTokens == 1 or 2.
>                     */
> 
>                     if (cntTokens > 2) {
>                         err.println("Too big number of options: " + 
> cntTokens);
>                         usage();
>                         return;
>                     }
>                     if (cntTokens >= 1) { // parse first argument which is 
> "gz=" option
>                         String option  = t.nextToken();
>                         gzlevel = parseHeapDumpCompressionLevel(option);
>                         if (gzlevel == 0) {
>                             usage();
>                             return;
>                         }
>                         filename = "heap.bin.gz";
>                     }
>                     if (cntTokens == 2) { // parse second argument which is 
> filename
>                         filename = t.nextToken();
>                         if (filename.startsWith("gz=")) {
>                             err.println("Filename should not start with 
> "gz=": " + filename);
>                             usage();
>                             return;
>                         }
>                     }
> 
> But I still do not see it in the latest updates from you. It feels like there 
> is some misunderstanding and confusion.
> Could you, please, clear this up?
> 
> Thanks,
> Serguei

Also, this method can be refactored to something like this (the check for 
exactly one option argument is needed):
   private int parseHeapDumpCompressionLevel(String option) {
       int gzl = 0;
       String[] keyValue = option.split("=");
       assert keyValue[0].equals("gz") : "expected option to start from gz=";
       if (keyValue.length != 2) {
           err.println("Exactly one argument is expected for option "gz"");
           return 0;
       }
       String level = keyValue[1];
       try {
           gzl = Integer.parseInt(level);
       } catch (NumberFormatException e) {
           err.println("gz option value not an integer ("+level+")");
           return 0;
       }
       if (gzl < 1 || gzl > 9) {
           err.println("Compression level out of range (1-9): " + level);
           return 0;
       }
       return gzl;
   }

-------------

PR: https://git.openjdk.java.net/jdk/pull/1712

Reply via email to