Jan 25, 2013

Profiling Grails Applications With VisualVM

Lately, I have been finding the need to get into the bowels of Grails in order to increase the performance of large batch type features of any application. Most of the time the issue appears to be with the Hibernate session becoming over-saturated with references. Performance degrades significantly even when limiting the batch size to ~100 records. Luckily, Oracle ships a pretty decent profiler with Java, VisualVM. The trick is getting it to work correctly with a Grails application.

Here are the tricks, I’ve found

  1. Add the command ‘-Xverify:none’ to your GRAILS_OPTS environment variable before launching your application. VisualVM relies on class replacement to instrument your code for profiling, and this switch allows that to work correctly.
  2. Disable the auto reloading agent in Grails by passing -Dauto.recompile.disable=true on the command line when you start your Grails application. This mostly a safety measure. Since VisualVM is replacing classes, you don’t want Grails replacing over the top of them. Also, there is a significant performance hit when using the Reloading Agent once it recompiles any class since it it basically proxying every class reference.
  3. Launch VisualVM with a bunch of memory. Since Grails needs a good chunk of memory, the profiler is going to need a lot. You can increase memory to VisualVM by passing the commands -J-Xms<memory size> and -J-Xmx<memory size> on the command line when launching VisualVM (i.e. jvisualvm -J-Xms1G -J-Xmx1G).
  4. While your there, you should add your Grails application classes to VisualVM’s classpath so you can make better sense of the profiling results. You can prepend/append classes to VisualVM’s classpath by using the –cp:p and –cp:a arguments, respectively (i.e. jvisualvm -J-Xms1G -J-Xmx1G –cp:a <path to grails app>/target/classes

About the Author

Object Partners profile.

One thought on “Profiling Grails Applications With VisualVM

  1. The correct is: -Ddisable.auto.recompile=true

  2. Robert says:

    Would be great if you provide a best practice pattern for “Do not profile class” settings in the Profiler, as it takes ages with the default settings to instrument all classes before you can start testing. E.g. org.springsource.loaded.* is one candidate to narrow the scope. Thanks.

Leave a Reply

Your email address will not be published. Required fields are marked *

Related Blog Posts
Google Professional Machine Learning Engineer Exam 2021
Exam Description A Professional Machine Learning Engineer designs, builds, and productionizes ML models to solve business challenges using Google Cloud technologies and knowledge of proven ML models and techniques. The ML Engineer is proficient in all aspects […]
Designing Kubernetes Controllers
There has been some excellent online discussion lately around Kubernetes controllers, highlighted by an excellent Speakerdeck presentation assembled by Tim Hockin. What I’d like to do in this post is explore some of the implications […]
React Server Components
The React Team recently announced new work they are doing on React Server Components, a new way of rendering React components. The goal is to create smaller bundle sizes, speed up render time, and prevent […]
Jolt custom java transform
Jolt is a JSON to JSON transformation library where the transform is defined in JSON. It’s really good at reorganizing the json data and massaging it into the output JSON you need. Sometimes, you just […]