Я считаю, что использование профилировщика будет вашим лучшим вариантом. Вы знакомы с VisualVM? Он поставляется с JDK (ищите "jvisualvm.exe" в каталоге bin вашего JDK) и способен автоматически профилировать как локальные виртуальные машины, так и удаленные машины при правильной настройке. И он дает довольно приятный обзор того, какие потоки работают и код, на который они тратят время, поэтому я думаю, что вы можете легко сделать из этого то, что вам нужно. И, что самое приятное, это бесплатно :) 1001 *
Как я уже сказал, локальное профилирование - это бриз. Вы просто запускаете JVisualVM.exe в автономном режиме, и он автоматически находит все процессы Java, работающие на локальном компьютере (вы можете просто выбрать их из меню, которое VisualVM предлагает вам заранее). Если вы хотите выполнять профилирование удаленно, установите следующие параметры виртуальной машины для всего, что вы используете:
-Dcom.sun.management.jmxremote.port=[0-65535]
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
Затем в VisualVM используйте имя хоста машины, на которой работает удаленная JVM, и порт, который вы настроили в первом аргументе VM, указанном выше.