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
Feature Flags in Terraform
Feature flagging any code can be useful to developers but many don’t know how to or even that you can do it in Terraform. Some benefits of Feature Flagging your code You can enable different […]
Infrastructure as Code – The Wrong Way
You are probably familiar with the term “infrastructure as code”. It’s a great concept, and it’s gaining steam in the industry. Unfortunately, just as we had a lot to learn about how to write clean […]
Snowflake CI/CD using Jenkins and Schemachange
CI/CD and Management of Data Warehouses can be a serious challenge. In this blog you will learn how to setup CI/CD for Snowflake using Schemachange, Github, and Jenkins. For access to the code check out […]
How to get your pull requests approved more quickly
TL;DR The fewer reviews necessary, the quicker your PR gets approved. Code reviews serve an essential function on any software codebase. Done right, they help ensure correctness, reliability, and maintainability of code. On many teams, […]