hprof-parser
hprof-parser copied to clipboard
Improve performance by skipping bytes instead of parsing again on a second pass (or first)
For 2GB heap dump:
$ wc large.hprof
2545071 20258239 2438383468 large.hprof
Baseline performance (ParallelGC is much better):
$ time java -Xmx5G -XX:+UseParallelGC -cp $CLASSPATH edu.tufts.eaftan.hprofparser.Parse --handler=edu.tufts.eaftan.hprofparser.handler.NullRecordHandler large.hprof
real 0m34.781s
user 0m39.424s
sys 0m1.759s
$ time java -Xmx5G -XX:+UseG1GC -cp $CLASSPATH edu.tufts.eaftan.hprofparser.Parse --handler=edu.tufts.eaftan.hprofparser.handler.NullRecordHandler large.hprof
real 0m42.754s
user 0m57.383s
sys 0m3.121s
After optimizations:
$ time java -Xmx5G -XX:+UseParallelGC -cp $CLASSPATH edu.tufts.eaftan.hprofparser.Parse --handler=edu.tufts.eaftan.hprofparser.handler.NullRecordHandler large.hprof
real 0m24.539s
user 0m25.911s
sys 0m1.373s
Other possible optimizations:
- Increase buffer size for
BufferedInputStream. Tried it, at most 200 milliseconds gain (variability is bigger). - Change
primArrayDumpinterface to use native primitive arrays instead ofValue<?>[]. It gives significant gain: 16 seconds against 24 seconds.
This is how primArrayDump optimization would look like: https://github.com/dkomanov/hprof-parser/commit/81891b2a59818663e04bc1bcc49392bf3e2322e0