복붙노트

[SPRING] Java Spring 애플리케이션 프로파일 링

SPRING

Java Spring 애플리케이션 프로파일 링

나는 약간의 병목 현상을 가지고 있다고 믿는 스프링 애플리케이션을 가지고 있는데, 그래서 어떤 함수가 얼마나 많은 시간이 걸릴지를 측정하기 위해 프로파일 러로 실행하고 싶다. 내가 어떻게해야하는지에 대한 어떤 권고?

STS를 실행 중이며 프로젝트는 maven 프로젝트이며 Spring 3.0.1을 실행 중입니다.

해결법

  1. ==============================

    1.나는 Spring AOP를 사용하여이 작업을 수행했다.

    나는 Spring AOP를 사용하여이 작업을 수행했다.

    때로는 내 프로젝트에서 몇 가지 메서드를 실행하는 데 시간이 얼마나 걸리는지에 대한 정보가 필요합니다 (예 : Controller 메서드).

    내가 쓴 서블릿 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()));
        }
    }
    

    그게 다야. 웹 앱에서 페이지를 요청할 때 메서드 실행 시간 및 JVM 메모리 사용량에 대한 정보가 내 웹 응용 프로그램 로그 파일에 인쇄됩니다.

  2. ==============================

    2.일반적인 응용 프로그램 프로파일 링을 위해 VisualVM을 권장합니다. JDK 버전 1.6_10에서 사용할 수 있으며 imho는 Eclipse TPTP보다 훨씬 빠르고 사용하기 쉽습니다.

    일반적인 응용 프로그램 프로파일 링을 위해 VisualVM을 권장합니다. JDK 버전 1.6_10에서 사용할 수 있으며 imho는 Eclipse TPTP보다 훨씬 빠르고 사용하기 쉽습니다.

    (Spring 어플리케이션이 Tomcat과 같은 어플리케이션 서버에서 작동한다면 tc Server 개발자 에디션 (STS 다운로드에서 사용 가능)에 배포 할 수 있습니다. 흥미로운 모니터링 기능이 있습니다. tc Server Developer Edition이 유지 관리되지 않는 것 같습니다 더 이상.)

    업데이트 2019.02.22 : 업데이트 된 VisualVM url (@Jeff에 대한 감사) 및 tc 서버 정보. 개인적으로 저는 현재 Glowroot를 사용하여 응용 프로그램 서버에서 실행되는 Spring 응용 프로그램을 모니터링합니다.

  3. ==============================

    3.Profiler4J와 같은 오픈 소스 자바 프로파일 러를 사용할 수 있습니다 :

    Profiler4J와 같은 오픈 소스 자바 프로파일 러를 사용할 수 있습니다 :

    http://profiler4j.sourceforge.net/

    또는 Netbeans에는 프로파일 러가 내장되어 있으며 Eclipse에도 프로파일 링 기능이 있지만 Profiler4J는 가장 시간이 많이 걸리는 방법을 보여주는 좋은 그래프가 있으므로 사용하기가 더 쉽습니다.

    이것은 STS (일식)에서 잘 작동하며 사이트의 지침을 따르십시오.

  4. ==============================

    4.우리는 프로덕션 모니터링 (활성 호출, 호출 카운트, 호출 중 소비 된 시간, 예외 카운트 등)을 수행하는 JMX 및 Spring AOP 기반 @Profiled 주석을 개발했습니다. 메트릭은 JMX를 통해 노출되며 Visual VM / JConsole 및 모니터링 시스템을 통해 수집 할 수 있습니다. 우리는 Hyperic HQ Plugin을 개발했습니다.

    우리는 프로덕션 모니터링 (활성 호출, 호출 카운트, 호출 중 소비 된 시간, 예외 카운트 등)을 수행하는 JMX 및 Spring AOP 기반 @Profiled 주석을 개발했습니다. 메트릭은 JMX를 통해 노출되며 Visual VM / JConsole 및 모니터링 시스템을 통해 수집 할 수 있습니다. 우리는 Hyperic HQ Plugin을 개발했습니다.

    이 @profiled 주석은 일반적인 구성 요소 (dbcp, util.concurrent, cxf, jms 등) 모니터링을 쉽게하기 위해 많은 다른 JMX 추가 기능과 함께 패키지로 제공되며 http://code.google.com/에서 비즈니스 친화적 인 Apache 소프트웨어 라이센스하에 제안됩니다 p / xebia-france / wiki / XebiaManagementExtras.

    희망이 도움이,

    키릴 (Xebia)

  5. ==============================

    5.profiler4j처럼 적극적으로 개발되지는 않았지만 JRat가 좋았습니다. 어쨌든 사용하기가 간단했습니다.

    profiler4j처럼 적극적으로 개발되지는 않았지만 JRat가 좋았습니다. 어쨌든 사용하기가 간단했습니다.

  6. ==============================

    6.다음은 권장 도구 및 기법에 대한 일반적인 설명입니다.

    다음은 권장 도구 및 기법에 대한 일반적인 설명입니다.

    기본적으로, 앱을 더 빨리 만드는 방법을 찾고 싶다면 기능을 얼마나 오래 사용 할지를 측정해야합니다. 이는 하향식 접근 방식입니다.

    당신이 생각할 때 그것이 자연 스럽다는 상향식 접근 방식이 있습니다. 그것은 시간에 대해 묻는 것이 아니라, 무엇을하고 있는지, 주로, 왜 그것을하고 있는지 묻는 것입니다.

  7. ==============================

    7.자동으로 기간의 총계를 계산하고 desc를 배열하는 상단 (선택한 응답)에 유리의 대답의 조금 수정 한 버전. 합계는 마지막에만 인쇄됩니다. 10 분을 절약 할 수 있습니다.

    자동으로 기간의 총계를 계산하고 desc를 배열하는 상단 (선택한 응답)에 유리의 대답의 조금 수정 한 버전. 합계는 마지막에만 인쇄됩니다. 10 분을 절약 할 수 있습니다.

        @Component
        @Aspect
        public class SystemArchitecture
        {
    
             @Pointcut("execution(* erp..*.*(..))")
             public void businessController()
             {
             }
    
             @Pointcut("execution(* TestMain..*.*(..))")
             public void theEnd()
             {
             }
        }
    
    
    
        @Component
        @Aspect
        public class TimeExecutionProfiler
        {
    
            static Hashtable<String, Long>  ht  = new Hashtable<String, Long>();
    
            @Around("profiler.SystemArchitecture.businessController()")
            public Object profile(ProceedingJoinPoint pjp) throws Throwable
            {
                long start = System.nanoTime();
                Object output = pjp.proceed();
                long elapsedTime = System.nanoTime() - start;
                String methodName = pjp.getSignature().toString();
                if (ht.get(methodName) == null)
                {
                    ht.put(methodName, elapsedTime);
                }
                else
                {
                    ht.put(methodName, ht.get(methodName) + elapsedTime);
                }
                // System.out.println(methodName + " : " + elapsedTime + " milliseconds.");
    
                return output;
            }
    
            @After("profiler.SystemArchitecture.theEnd()")
            public void profileMemory()
            {
                List<Object> keys = Arrays.asList(ht.keySet().toArray());
                java.util.Collections.sort(keys, new Comparator<Object>()
                {
    
                    @Override
                    public int compare(Object arg0, Object arg1)
                    {
                        return ht.get(arg1).compareTo(ht.get(arg0));
                    }
                });
    
                System.out.println("totals Used:");
                for (Object name : keys)
                {
                    System.out.println("--" + name + " : " + (ht.get(name) / 1000000));
                }
                System.out.println("JVM memory in use = " + (Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()));
            }
        }
    
  8. from https://stackoverflow.com/questions/2475682/profiling-a-java-spring-application by cc-by-sa and MIT license