У меня есть приложение Spring, которому я верю, имеет некоторые узкие места, таким образом, я хотел бы выполнить его с профилировщиком для измерения то, что функции берут сколько времени. Какие-либо рекомендации тому, как я должен сделать это?
Я выполняю STS, проект является проектом знатока, и я выполняю Spring 3.0.1
Я сделал это, используя Spring AOP.
Иногда мне нужна информация о том, сколько времени требуется для выполнения некоторых методов в моем проекте (метод контроллера в примере).
В сервлет xml я поместил
<aop:aspectj-autoproxy/>
Также мне нужно создать класс для аспектов:
@Component
@Aspect
public class SystemArchitecture {
@Pointcut("execution(* org.mywebapp.controller..*.*(..))")
public void businessController() {
}
}
И аспект профайлера:
@Component
@Aspect
public class TimeExecutionProfiler {
private static final Logger logger = LoggerFactory.getLogger(TimeExecutionProfiler.class);
@Around("org.mywebapp.util.aspects.SystemArchitecture.businessController()")
public Object profile(ProceedingJoinPoint pjp) throws Throwable {
long start = System.currentTimeMillis();
logger.info("ServicesProfiler.profile(): Going to call the method: {}", pjp.getSignature().getName());
Object output = pjp.proceed();
logger.info("ServicesProfiler.profile(): Method execution completed.");
long elapsedTime = System.currentTimeMillis() - start;
logger.info("ServicesProfiler.profile(): Method execution time: " + elapsedTime + " milliseconds.");
return output;
}
@After("org.mywebapp.util.aspects.SystemArchitecture.businessController()")
public void profileMemory() {
logger.info("JVM memory in use = {}", (Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()));
}
}
Вот и все. Когда я запрашиваю страницу из моего webapp, информация о времени выполнения метода и использовании памяти JVM выводится в лог-файл моего webapp.
Я рекомендую VisualVM для общего профилирования приложений. Он доступен в JDK с версии 1.6_10, и, по-моему, он намного быстрее и удобнее, чем Eclipse TPTP.
( Если ваше приложение Spring работает на сервере приложений (например, Tomcat), вы можете попытаться развернуть его в версии для разработчиков tc Server (доступна в загрузках STS ). Она имеет интересный мониторинг Похоже, что версия для разработчиков tc Server больше не поддерживается.)
ОБНОВЛЕНИЕ 2019.02.22. : обновлен URL-адрес VisualVM (спасибо за @Jeff) и информация о сервере TC. Лично я в настоящее время использую Glowroot для мониторинга приложений Spring, работающих на сервере приложений.
Мне понравился JRat , хотя, как и profiler4j, он не развивается активно. В любом случае пользоваться им было просто.
Вот общее обсуждение с рекомендованными инструментами и методами.
В принципе, вполне естественно предположить, что если вы хотите узнать, как сделать приложение быстрее, вам следует начать с измерения времени выполнения функций. Это нисходящий подход.
Существует подход снизу вверх, который, если подумать, столь же естественен. Это не для того, чтобы спрашивать о времени, а для того, чтобы спросить, что оно в основном делает и почему.
Вы можете использовать java-профилировщик с открытым исходным кодом, например Profiler4J:
http://profiler4j.sourceforge.net/
или Netbeans поставляется со встроенным профилировщиком, а Eclipse также имеет возможности профилирования, однако я нашел Profiler4J более удобным в использовании, поскольку он имеет красивый график, показывающий наиболее трудоемкие методы.
Это хорошо работает в STS (eclipse), просто следуйте инструкциям на сайте.