RAD: Profiling a portlet
Recently I needed to profile a portlet to find its time performance bottlenecks. Since I developed it in RAD using its WebSphere 5.1 Test Environment, I thought I'd run the server in the Profiling mode and would get the results. The profiler worked very hard, but at the end no results were displayed. I tried to profile a simple (non server) Java app. - again it seemed to do something but no results vere displayed. But finally I've found how to get the data using hprof:
- Create a normal Java app. that will call the portlet's code or a JUnit (or e.g. MockObjectTestCase, if you need JNDI and the like set up) test
- Write a main method of the app. and call there the portlet code. If it's a test case, don't forget to call setUp before and tearDown after that.
- At the end of main call System.exit(0) - otherwise it may happen that the thread will not actually finish and thus the output won't be completely generated (usually there will only be a header and names of threads that have started). Killing it via the red square button stops the threads but doesn't generate the output.
- Run the app./test case as a "Java Application" using a Sun JRE 1.4 (IBM JRE would fail) and passing the VM the option "-Xrunhprof:cpu=samples,thread=y,file=cpu_profiling.hprof,depth=32"