PerfSpy is an open source tool (https://code.google.com/p/perfspy/). It enables runtime logging and runtime performance monitoring for Java applications using AspectJ: it has an abstract Aspect, with which you can specify an “entry” method, and it will capture all method invocations within that “entry” method. It uses NetBeans OutlineView tree control to show the method invocations and offers convenient ways to navigate through the method invocation tree.
In this tutorial, I used two Demo applications: PerfSpyDemo and PerfSpyAspectDemo, you can pick them up from https://code.google.com/p/perfspy/.
You probably think your system is something like this:
In this beautiful diagram, every block does one thing terrifically well, and blocks are put together and communicate with each other through well-defined communication channels. The whole structure is robust, flexible (you can move blocks here and there), and extensible (you can put add more blocks) etc.
But in reality, your system might look like this:
And you feel like that hapless little mice: every time you turn, there are more unexpected nooks and corners, and even death traps. At times like this, you wish there is a thread that can guide you through the maze and remember all the twists that you’ve passed through.
PerfSpy is to give you such a string to expose the maze-like structure of your system to you.
Let me tell you a little bit of my system, so you will understand why I started out to write this tool. The system I was charged in maintaining was written more than 15 years ago. It is a “J2EE” application deployed onto JBoss 4.0. It has two parts: web part (runs on Tomcat 5.5) and Swing part (can be run as Applet). Over the years, technology involved. And Spring, Hibernate, Ajax etc were added into the system, yet old infrastructure stayed in place, and new technologies were simply layered upon the old one. So now, the system has 3 connection pools (all connecting to a single DB), 3 kinds of transaction mechanism, 2 types of cluster communication channels, etc. This is a big picture of the structure of the system:
The big house is JBoss 4.0. For some reason, JBoss 4.0 was tweaked in some mysterious ways, which makes it hard to upgrade to JBoss. So already, the house was not built very strongly (hence it is raining). The two small houses are two web applications deployed onto JBoss – the system is one single web application, and yet there are two WARs. One house is much smaller, and serves a small purpose. Every single page has to be served by two houses. Among other things, this adds complexity to “Jar hell”: some jars have to be placed in A.war, some in B.war, some have to be placed onto the top of the Jboss roof. Not to mention the complex interactions between A.war and B.war.
Thanks to PerfSpy, I was able to understand all the tweaks involved in making A.war and B.war talk to each other in a short period of time.
Understanding the system is a daunting task enough, let along refactor it. And yet, short of discarding the system altogether, refactoring it is the only way to avoid it being sunset. First step of refactoring is to understand the system – PerfSpy was born out of this necessity.
You can also use PerfSpy to understand your system’s performance bottleneck. By default, it logs the execution time of every method and how many times of a method is repeatedly invoked. This information will give you a clue as to the performance bottleneck.