Performance

Contents
  • Profiling
  • Remote resources
  • Profiling

    In JDK1.3, try

    java -Xrunhprof:help
    

    Simple timing

    One simple way to time a run is to modify the run() method in ptolemy.actor.Manager so that System.out.println(new Date()).getTime()) is called at the start and the end of the run() method.

    You may also need to include the following at the top with the other import statements.

    import java.util.Date;
    

    Performance

    Measuring the performance of an Applet inside a browser is tricky.

    http://help.netscape.com/kb/consumer/19970907-1.html says

    To troubleshoot your Java applets in UNIX environment, you can start Communicator with the "-java" switch.
    
    
     #netscape -java
     Usage: -java [-options] class
    
     where options include:
         -help             print out this message
         -version          print out the build version
         -v -verbose       turn on verbose mode
         -debug            enable remote JAVA debugging
         -noasyncgc        don't allow asynchronous garbage collection
         -verbosegc        print a message when garbage collection occurs
         -noclassgc        disable class garbage collection
         -cs -checksource  check if source is newer when loading classes
         -ss<number>       set the maximum native stack size for any thread
         -oss<number>      set the maximum Java stack size for any thread
         -ms<number>       set the initial Java heap size
         -mx<number>       set the maximum Java heap size
         -D<name>=<value>  set a system property
         -classpath <directories separated by ':'>
                           list directories in which to look for classes
         -prof[:<file>]    output profiling data to ./java.prof or ./<file>
         -verify           verify all classes when read in
         -verifyremote     verify classes read in over the network [default]
         -noverify         do not verify any class
    

    And http://help.netscape.com/kb/consumer/19970907-2.html

    You can automatically startup the Java Virtual Machine as you launch
     Communicator. This will prevent Communicator from restarting the
     Java Virtual Machine each time you browse pages that have Java applets
     or audio files played by the liveaudio plugin.
    
     The command to use is :
     "C:\Program Files\Netscape\Communicator\Program\netscape.exe" -start_java
    
     You can edit the properties of your start icon of the Communicator
     to add the option. You can also start the messenger (or other
     component) the same way by :
     "C:\Program Files\Netscape\Communicator\Program\netscape.exe" -start_java -mail
    
     Note: This doesn't seem to work on NT3.51
    

    Memory Leaks

    Under C and C++, one must manage memory by hand.

    Java has a garbage collector, which helps, but memory leaks are still possible. Usually, an object is marked as being eligible for GC when it goes out of scope. Or, if the value of the object is null, then it may be GC'd. However, an object will not be garbage collected if the object has references to it. This is how we get memory leaks.

    We can ask that the garbage collector be run with

    System.gc();
    
    For example, we do this in the code generator after building the large AST that represents the java.lang and ptolemy.kernel classes.

    Finalization is what happens before an object is GC'd. We can force the system to run the finalize method on all objects that are waiting to be finalized with:

    System.runFinalization();
    
    For further information, see Java Tutorial Page about Garbage Collection and IBM page about memory leaks

    Increasing the size of the Heap

    Sometimes, as a workaround, all that is necessary is to increase the size of the Java heap. The java command takes non-standard commands like -Xmxsize to set the maximum stack size. For example, under Cygwin, to run with a 256 megabyte heap size:
    export JAVAFLAGS=-Xmx256m
    $PTII/bin/vergil
    
    To see what other -X commands are available, run
    java -X
    

    HP's JMeter

    HP's JMeter is a tool available as a free download after a quick registration from http://www.hp.com/products1/unix/java/hpjmeter/. HP's JMeter works with Java 1.2 through 1.5.

    To generate the profile, do c:/Program\ Files/java/jdk1.5.0_05/bin/java -Xmx256M "-Dptolemy.ptII.dir=c:/cxh/ptII" -Xrunhprof:heap=all,depth=30 -classpath "c:\cxh\ptII;c:\cxh\ptII\lib\diva.jar" ptolemy.vergil.VergilApplication To run the HP JMeter tool:

    java -Xmx256m -jar $PTII/vendors/hpjmeter/HPjmeter.jar
    
    Then open up the java.prof.txt

    JMeter reported a syntax error, I then had to edit v.hprof.txt and move two bogus lines:

    ROOT 50000105 (kind=, id=200000, trace=300000)
    ROOT 50000187 (kind=, id=200003, trace=300000)
    HEAP DUMP BEGIN (4250 objects, 298272 bytes) Tue Jun 08 11:23:54 2004
    
    became
    HEAP DUMP BEGIN (4250 objects, 298272 bytes) Tue Jun 08 11:23:54 2004
    ROOT 50000105 (kind=, id=200000, trace=300000)
    ROOT 50000187 (kind=, id=200003, trace=300000)
    

    Heap Analysis Tool

    Heap Analysis Tool (HAT) is a freely available tool from https://hat.dev.java.net/ that can process -Xrunhprof data. HAT works best with Java 1.2, it did not work for me with Java 1.4.2:
    java.io.IOException: Stack trace not found for serial # 0
    	at hat.parser.HprofReader.getStackTraceFromSerial(HprofReader.java:611)
    	at hat.parser.HprofReader.readArray(HprofReader.java:777)
    

    See the JDC Book that discusses Heap Analysis Tool for downloads and further information.

    Generate a hprof file:

     java -Xrunhprof:file=vergil.hprof,format=b -classpath $PTII/lib/diva.jar\;$PTII/ptolemy/vergil/vergil.jar\;$PTII/ptolemy/ptolemy.jar\;$PTII ptolemy.vergil.VergilApplication
    
    Run HAT:
    java -classpath hat.zip\;$PTII/lib/diva.jar\;$PTII/ptolemy/vergil/vergil.jar\;$PTII/ptolemy/ptolemy.jar\;$PTII -mx100m hat.Main vergil.hprof
    

    Remote resources

    Commercial Profilers

  • IBM's HeapRoots (Free download after registration?)
  • JMP GPL'd, written in C, uses GTK
  • HP's JMeter (Free download after registration)
  • JProbe (Commercial tool)
  • JProfile
  • Purify - Case Study
  • Optimizeit Suite
  • Metrowerks
  • Sun's Forte For Java
  • Quantify
  • Java and Optimization

  • Java HotSpot FAQ
  • PerfAnal: A Performance Analysis Tool (March 2000 Java Developer Connection Article - The JDC requires registration, but is free to join)
  • JDC Book that discusses Heap Analysis Tool
  • Java.sun.com article - TechUsing Hprof to Tune performance
  • September 1998 Javaworld article - includes a benchmark applet
  • March 1997 Javaworld article - includes a benchmark applet
  • JavaSoft Tutorial garbage collection information
  • CMU Java optimization page
  • developer JDBC Book
  • "Some tips on Java Performance"
  • Benchmarks

  • Yahoo Java Benchmarks
  • Java Performance Report (1997)
  • Scripting and Java

  • Kernighan Scripting Benchmark paper
  • Ptolemy Group Scripting Benchmark paper
  • Last Updated: $Date: 2006/01/18 23:01:25 $