|
|
Optimize with a SATA RAID Storage Solution
Range of capacities as low as $1250 per TB. Ideal if you currently rely on servers/disks/JBODs
It's no secret that Java profiling tools have had a long way to catch up to their alternate-language counterparts. Many powerful tools now exist to help us track down the culprits behind those common problems. But how do you develop confidence in your ability to use these tools effectively? After all, you're using the tools to diagnose complex behavior you don't understand. To compound your plight, the data provided by the tools is reasonably complex and the information you are looking at or for is not always clear.
When faced with similar problems in my previous incarnation as an experimental physicist, I created control experiments with predictable results. This helped me gain confidence in the measurement system I used in experiments that generated less predictable results. Similarly, this article uses the hprof profiling tool to examine three simple control applications that exhibit the three common problem behaviors listed above. While not as user-friendly as some commercial tools on the market, hprof is included with the Java 2 JDK and, as I'll demonstrate, can effectively diagnose these behaviors.
Running your program with hprof is easy. Simply invoke the Java runtime with the following command-line option, as described in the JDK tool documentation for the Java application launcher:
java -Xrunhprof[:help][:<suboption>=<value>,...] MyMainClass
A list of suboptions is available with the [:help] option shown. I generated the examples in this article using the Blackdown port of the JDK 1.3-RC1 for Linux with the following
launch command:
java -classic -Xrunhprof:heap=sites,cpu=samples,depth=10,monitor=y,thread=y,doe=y MemoryLeak
The following list explains the function of each suboption used in the previous command:
heap=sites: Tells hprof to generate stack traces indicating where memory was allocated
cpu=samples: Tells hprof to use statistical sampling to determine where the CPU spends its time
depth=10: Tells hprof to show stack traces 10 levels deep, at most
monitor=y: Tells hprof to generate information on contention monitors used to synchronize the work of multiple threads
thread=y: Tells hprof to identify threads in stack traces
doe=y: Tells hprof to produce a dump of profiling data upon exit
If you use JDK 1.3, you need to turn off the default HotSpot compiler with the -classic option. HotSpot has its own profiler, invoked through an -Xprof option, that uses an output format different from the one I'll describe here.
Running your program with hprof will leave a file called java.hprof.txt in your working directory; this file contains the profiling information collected while your program runs. You can also generate
a dump at any time while your program is running by pressing Ctrl-\ in your Java console window on Unix or Ctrl-Break on Windows.