Я пробовал VisualVM, но он не очень полезен для высокопроизводительных приложений, так как полностью написан на Java и не очень эффективен. (т. е. если он менее эффективен, чем приложение, его мониторинг, вы видите VisualVM как крупнейшего потребителя ЦП или памяти)
VisualVM использует подход, который вы пытаетесь. ;)
Я использую YourKit и считаю, что это полезно для обычных проблем, и этого может быть достаточно для вас. Он имеет возможность включать и выключать профилирование из кода, чтобы включать только определенные разделы кода. Это более эффективно, поскольку вся работа по профилированию выполняется в собственном агенте, поэтому он не использует собственную кучу и не сильно замедляет работу приложения.
Когда Yourkit недостаточно для программирования с малой задержкой, я пишу специальные тесты производительности и сам определяю время приложения на ключевых этапах приложения, которое я регистрирую максимально эффективно. Этот подход достаточно легкий, его можно использовать в работающей системе и позволяет увидеть, что происходит в производственной системе.