Display human readable progress instead of many dots in jhat. Looks like the attachment is removed as it's thought to be suspicious. I'm attaching it again as a plain text file again. Sorry for the duplicated emails.
Xiaoguang
# HG changeset patch # User Xiaoguang Sun <[email protected]> # Date 1386420176 -28800 # Sat Dec 07 20:42:56 2013 +0800 # Node ID 1e178a667881f4be98f86eff7c6688c00782be23 # Parent 861e489158effbf6a841119206eea2689fcb2a83 Display human readable progress instead of many dots in jhat diff -r 861e489158ef -r 1e178a667881 src/share/classes/com/sun/tools/hat/internal/model/Snapshot.java --- a/src/share/classes/com/sun/tools/hat/internal/model/Snapshot.java Thu Sep 12 17:17:40 2013 -0700 +++ b/src/share/classes/com/sun/tools/hat/internal/model/Snapshot.java Sat Dec 07 20:42:56 2013 +0800 @@ -49,6 +49,45 @@ */ public class Snapshot { + private static class ProgressPrinter { + private StringBuilder progress = new StringBuilder(); + private int finished; + private int total; + private int unit; + public ProgressPrinter(int total) { + this.total = total; + unit = total / 100; + } + + private void printProgress() + { + for (int counter = 0, max = progress.length(); + counter < max; ++counter) { + System.out.print('\b'); + } + progress.setLength(0); + progress.append("("); + progress.append(finished); + progress.append("/"); + progress.append(total); + progress.append(") "); + progress.append(100 * finished / total); + progress.append(" %"); + System.out.print(progress); + System.out.flush(); + } + + public void step() { + if ((++finished % unit) == 0) { + printProgress(); + } + } + + public void finish() { + printProgress(); + System.out.println(); + } + } public static long SMALL_ID_MASK = 0x0FFFFFFFFL; public static final byte[] EMPTY_BYTE_ARRAY = new byte[0]; @@ -224,9 +263,6 @@ } } - // To show heap parsing progress, we print a '.' after this limit - private static final int DOT_LIMIT = 5000; - /** * Called after reading complete, to initialize the structure */ @@ -290,21 +326,19 @@ if (calculateRefs) { calculateReferencesToObjects(); - System.out.print("Eliminating duplicate references"); + System.out.print("Eliminating duplicate references "); System.out.flush(); // This println refers to the *next* step } - int count = 0; + ProgressPrinter progress = calculateRefs ? new ProgressPrinter(heapObjects.size()) : null; for (JavaHeapObject t : heapObjects.values()) { t.setupReferers(); - ++count; - if (calculateRefs && count % DOT_LIMIT == 0) { - System.out.print("."); - System.out.flush(); + if (calculateRefs) { + progress.step(); } } if (calculateRefs) { - System.out.println(""); + progress.finish(); } // to ensure that Iterator.remove() on getClasses() @@ -313,22 +347,17 @@ } private void calculateReferencesToObjects() { - System.out.print("Chasing references, expect " - + (heapObjects.size() / DOT_LIMIT) + " dots"); + System.out.print("Chasing references "); System.out.flush(); - int count = 0; + ProgressPrinter progress = new ProgressPrinter(heapObjects.size()); MyVisitor visitor = new MyVisitor(); for (JavaHeapObject t : heapObjects.values()) { visitor.t = t; // call addReferenceFrom(t) on all objects t references: t.visitReferencedObjects(visitor); - ++count; - if (count % DOT_LIMIT == 0) { - System.out.print("."); - System.out.flush(); - } + progress.step(); } - System.out.println(); + progress.finish(); for (Root r : roots) { r.resolve(this); JavaHeapObject t = findThing(r.getId());
