This is an outstanding book and one of the few that, even after working through, I'll be keeping within reach at my desk. After almost a decade working on the JVM, I've only recently begun work on some software that really strains our systems, processing a million and some records a day with several instances each on multiple threads, and so until recently, performance has always been a secondary concern. While the app's code is certainly not perfect, I started wondering whether any of the mysterious extended options available to the JVM might take some of the weight off the system without having to wait until the next formal development/release cycle. This is what prompted me to look at this book, but as I'll describe, I found much more.
I was very impressed with the amount of information provided: unlike most computer-related books, this is dense with text, rather than long code samples, screenshots and diagrams. Why is this a good thing? This is not just a book on how to use the JVM and its related performance tools, but also a book on the JVM's internal architecture (including its memory model and garbage collectors) and on the art of benchmarking and performance testing. Though the prose can be dry, the authors are very patient about describing these topics to readers in a clear way, and sometimes with great detail. OTOH, as this is written with experienced developers in mind, beware that it can at times be challenging (even for someone who's done their fair share of coding!).
There are a few major areas covered:
1) Tuning the JVM. This usually involves applying command-line options to the JVM executable (I can almost guarantee you'll discover you have more control over the JVM than you thought you did!) The authors cover the JVM internal architecture, garbage collection and memory model to provide context on what these options actually do, as well as extensive descriptions of how and when to use the options.
2) Performance monitoring tools, profiling, heap-dump analysis. Much of the book is devoted to describing not only the tools available in the JDK, but those provided by popular OSes and 3rd parties.
3) Writing benchmarks. There is more an art to this than you might expect, especially when writing benchmarks for the JVM. Tips on benchmarking different types of applications (i.e. webapps, web services) are separated into different chapters.
The biggest downside, as another reviewer pointed out, is it's 'oracle-centricity'. For example, you'll find much said on Netbeans and Glassfish, while Eclipse and Tomcat don't get a single mention. These are tools that we all know about, but what great, more obscure, tools am I missing out on due to this obvious bias? This seriously damages the credibility of the authors as far as tool-selection is concerned, but in the end, it's the JVM and the performance testing concepts that are most important. Once I learn the vocabulary, I'll be able to figure out through Google which tools are best.