views:

731

answers:

8

I have a very large Java app. It runs on Tomcat and is your typical Spring/Hibernate webapp. It is also an extremely large Java program. It's easy for me to test the performance of database queries, since I can run those separately, but I have no idea to look for Java bottlenecks on a stack like this. I tried Eclipse's TPTP profiler, but it really didn't seem to like my program, and I suspect that it is because my program is too large. Does anyone have any advice on profiling a large webapp?

+1  A: 

Try jProfiler. It's easy to integrate with Tomcat

aledbf
+1  A: 

If you can get Tomcat and your application running in Netbeans.

Then you can use the Netbeans built-in profiler to test performance, memory usage, etc ...

Wikipage on tomcat in Netbeans.

Mark Robinson
A: 

I've never found an easy way to do this because there's typically so much going on that it's hard to get a clear overall picture. With things like Hibernate even more so because the correct behavior may be to grab a big chunk of memory for cached data, even though your app's not really "doing anything", so another memory inefficient process that you run may get swamped in profiling.

Are you profiling for memory, speed, or just in general looking for poor performance? Try to test processes that you suspect are bad in isolation, it's certainly much easier.

JProbe, JProfiler, both good, free demos are available. Testing inside an IDE complicates the memory issues, I've found it easier not to bother.

Steve B.
Well, our application is working within acceptable performance parameters, but I wanted to take a look "under the hood" to see if there are any obvious bottlenecks I could target. I hear that it's never where you expect it to be.
CaptainAwesomePants
+3  A: 

The Visual VM profiler that now comes with the JDK can be attached to running processes and may at least give an initial overview of the performance. It is based on the Netbeans profiler.

Mark
Note that Visual VM works the best with the Sun JVM. If the original asker uses another JVM magic is most likely needed to allow Visual VM to see and connect to the running process.
Thorbjørn Ravn Andersen
A: 

Try this. It's maybe simpler than you expect, but it works.

Mike Dunlavey
A: 

Try JProfiler. It has a trial license and it is very full featured. To use it, you'll have to:

  • Add the JProfiler agent as an argument to your java command
  • Start the program on the server
  • Start JProfiler and choose the "Connect to an application running remotely"
  • Give it the port number and whatever host it's running on

All these are in the instructions that come with JProfiler, but the important part is that you'll connect through a host and port to your running app.

As for what to profile, I'm sure you have an idea of things that could be memory/CPU intensive - loading large data sets, sorting, even simple network I/O if it's done incorrectly. Do these things (it's great if you can automate load testing using some scripts that bang on your server) and collect a snapshot with JProfiler.

Then view the graphs at your leisure. Turn on CPU monitoring and watch where the CPU cycles are being spent. You'll be able to narrow down by percentage in each method call, so if you're using more than 1 or 2% of CPU in methods that you have source for, go investigate and see if you can make them less CPU intensive.

Same goes for memory. Disable all the CPU profiling, enable all the memory profiling, run the tests again and get your snapshot.

Rinse, repeat.

You might also take this time to read up on memory management and garbage collection. There's no better time to tune your garbage collection than when you're already profiling: http://java.sun.com/docs/hotspot/gc5.0/gc_tuning_5.html

Pay special attention to the part on the eden/survivor object promotion. In web apps you get a lot of short-lived objects, so it often makes sense to increase the young generations at the expense of the tenured generations.

Kai
+1  A: 

I have used YourKit to profile applications with an 8 GB heap and it worked quite well.

Peter Lawrey
A: 

Check JAMon. It's not a profiler, but it's the best tool for profiling that I can recommend. It's very easy to integrate with spring. We use it in test and live environment.

bwalliser