Interesante artículo recopilatorio sobre como averiguar lo que está pasando en una aplicación Java.
Repaso breve desde la depuración clásica con breakpoints o incluso System.out.println() hasta utilizar proxies dinámicos o programación orientada a aspectos.