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
Why we started using JSON Schema in our internal Helm charts
Helm 3 supports validating the provided chart values against a JSON Schema. While it may be quicker to get started in your chart development without a schema, we found it valuable for a number of […]
Rewriting files in Google Cloud Storage
Rewriting Files in GCP Note: even though this code is in Python, this should be the same idea in JavaScript, Go, etc. I wrote the following to copy a file from one Google Cloud Storage […]
Interpreting Spatial Data in the Age of COVID-19
As 2020 has come to an end, many are eager to leave the mess of COVID-19 behind with the new year and gain a fresh start. Unfortunately, new cases are still soaring across the United […]
Building a Better Mousetrap
Recently, my daughter (age 6) was into building “mousetraps” out of shoe boxes. These were more or less comfortable cardboard mouse houses complete with beds, rooms, everything a mouse could want or need and not […]