Профилирование приложения Spring Java

У меня есть приложение Spring, которому я верю, имеет некоторые узкие места, таким образом, я хотел бы выполнить его с профилировщиком для измерения то, что функции берут сколько времени. Какие-либо рекомендации тому, как я должен сделать это?

Я выполняю STS, проект является проектом знатока, и я выполняю Spring 3.0.1

15
задан Utku 27 November 2017 в 19:34
поделиться

5 ответов

Я сделал это, используя 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.

17
ответ дан 1 December 2019 в 02:46
поделиться

Я рекомендую VisualVM для общего профилирования приложений. Он доступен в JDK с версии 1.6_10, и, по-моему, он намного быстрее и удобнее, чем Eclipse TPTP.

( Если ваше приложение Spring работает на сервере приложений (например, Tomcat), вы можете попытаться развернуть его в версии для разработчиков tc Server (доступна в загрузках STS ). Она имеет интересный мониторинг Похоже, что версия для разработчиков tc Server больше не поддерживается.)

ОБНОВЛЕНИЕ 2019.02.22. : обновлен URL-адрес VisualVM (спасибо за @Jeff) и информация о сервере TC. Лично я в настоящее время использую Glowroot для мониторинга приложений Spring, работающих на сервере приложений.

4
ответ дан 1 December 2019 в 02:46
поделиться

Мне понравился JRat , хотя, как и profiler4j, он не развивается активно. В любом случае пользоваться им было просто.

1
ответ дан 1 December 2019 в 02:46
поделиться

Вот общее обсуждение с рекомендованными инструментами и методами.

В принципе, вполне естественно предположить, что если вы хотите узнать, как сделать приложение быстрее, вам следует начать с измерения времени выполнения функций. Это нисходящий подход.

Существует подход снизу вверх, который, если подумать, столь же естественен. Это не для того, чтобы спрашивать о времени, а для того, чтобы спросить, что оно в основном делает и почему.

0
ответ дан 1 December 2019 в 02:46
поделиться

Вы можете использовать java-профилировщик с открытым исходным кодом, например Profiler4J:

http://profiler4j.sourceforge.net/

или Netbeans поставляется со встроенным профилировщиком, а Eclipse также имеет возможности профилирования, однако я нашел Profiler4J более удобным в использовании, поскольку он имеет красивый график, показывающий наиболее трудоемкие методы.

Это хорошо работает в STS (eclipse), просто следуйте инструкциям на сайте.

2
ответ дан 1 December 2019 в 02:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: