Charlie Hunt is the JVM performance lead engineer at Oracle. He is responsible for improving the performance of the HotSpot JVM and Java SE class libraries. He has also been involved in improving the performance of the Oracle GlassFish and Oracle WebLogic Server. A regular JavaOne speaker on Java performance, he also coauthored NetBeansa IDE Field Guide (Prentice Hall, 2005). Binu John is a senior performance engineer at Ning, Inc., where he focuses on improving the performance and scalability of the Ning platform to support millions of page views per month. Before that, he spent more than a decade working on Java-related performance issues at Sun Microsystems, where he served on Sun's Enterprise Java Performance team. John has contributed to developing industry standard benchmarks such as SPECjms2007 and SPECJAppServer2010; published several performance whitepapers; and contributed to java.net's XMLTest and WSTest benchmark projects.
Foreword by James Gosling xi Foreword by Steve Wilson xiii Preface xv Acknowledgments xix About the Authors xxi Chapter 1: Strategies, Approaches, and Methodologies 1 Forces at Play 2 Two Approaches, Top Down and Bottom Up 5 Choosing the Right Platform and Evaluating a System 8 Bibliography 11 Chapter 2: Operating System Performance Monitoring 13 Definitions 14 CPU Utilization 14 CPU Scheduler Run Queue 28 Memory Utilization 32 Network I/O Utilization 41 Disk I/O Utilization 46 Additional Command Line Tools 49 Monitoring CPU Utilization on SPARC T-Series Systems 50 Bibliography 53 Chapter 3: JVM Overview 55 HotSpot VM High Level Architecture 56 HotSpot VM Runtime 58 HotSpot VM Garbage Collectors 80 HotSpot VM JIT Compilers 92 HotSpot VM Adaptive Tuning 100 References 106 Chapter 4: JVM Performance Monitoring 107 Definitions 108 Garbage Collection 108 JIT Compiler 146 Class Loading 147 Java Application Monitoring 150 Bibliography 153 Chapter 5: Java Application Profiling 155 Terminology 157 Oracle Solaris Studio Performance Analyzer 159 NetBeans Profiler 189 References 209 Chapter 6: Java Application Profiling Tips and Tricks 211 Performance Opportunities 211 System or Kernel CPU Usage 212 Lock Contention 222 Volatile Usage 234 Data Structure Resizing 235 Increasing Parallelism 243 High CPU Utilization 246 Other Useful Analyzer Tips 247 Bibliography 249 Chapter 7: Tuning the JVM, Step by Step 251 Methodology 252 Application Systemic Requirements 255 Rank Systemic Requirements 257 Choose JVM Deployment Model 58 Choose JVM Runtime 259 GC Tuning Fundamentals 262 Determine Memory Footprint 268 Tune Latency/Responsiveness 278 Tune Application Throughput 307 Edge Cases 316 Additional Performance Command Line Options 316 Bibliography 321 Chapter 8: Benchmarking Java Applications 323 Challenges with Benchmarks 324 Design of Experiments 347 Use of Statistical Methods 348 Reference 355 Bibliography 355 Chapter 9: Benchmarking Multitiered Applications 357 Benchmarking Challenges 357 Enterprise Benchmark Considerations 360 Application Server Monitoring 382 Profiling Enterprise Applications 399 Bibliography 401 Chapter 10: Web Application Performance 403 Benchmarking Web Applications 404 Web Container Components 405 Web Container Monitoring and Performance Tunings 408 Best Practices 427 Bibliography 450 Chapter 11: Web Services Performance 453 XML Performance 454 Validation 460 Resolving External Entities 462 Partial Processing of XML Documents 465 Selecting the Right API 468 JAX-WS Reference Implementation Stack 471 Web Services Benchmarking 473 Factors That Affect Web Service Performance 477 Performance Best Practices 486 Bibliography 503 Chapter 12: Java Persistence and Enterprise Java Beans Performance 505 EJB Programming Model 506 The Java Persistence API and Its Reference Implementation 507 Monitoring and Tuning the EJB Container 511 Transaction Isolation Level 521 Best Practices in Enterprise Java Beans 522 Best Practices in Java Persistence 540 Bibliography 551 Appendix A: HotSpot VM Command Line Options of Interest 553 Appendix B: Profiling Tips and Tricks Example Source Code 573 Lock Contention First Implementation 573 Lock Contention Second Implementation 583 Lock Contention Third Implementation 593 Lock Contention Fourth Implementation 603 Lock Contention Fifth Implementation 613 First Resizing Variant 624 Second Resizing Variant 636 Increasing Parallelism Single-Threaded Implementation 647 Increasing Parallelism Multithreaded Implementation 657 Index 669