2012-09-13 3 views
2

성능 향상을 위해 응용 프로그램을 프로파일 링하는 데 약간 익숙합니다. Your Profiler로 YourKit을 선택했습니다. YourKit이 매우 흥미로운 통계를 제공한다는 것은 의심의 여지가 없습니다. 내가 붙어있는 곳은이 통계와 관련이있다.Java EE 애플리케이션 프로파일 링 - 찾아야 할 사항과 변경해야 할 사항은 무엇입니까?

예를 들어, JAXB POJO에서 작동하는 방법을 고려해보십시오. 이 메소드는 POJO를 반복하여 XML 내부에 깊이 중첩 된 태그/요소에 액세스합니다.

List<Bundle> bundles = null; 
    List<Item> items = null; 
    for(Info info : data) { 
     bundles = info.getBundles(); 
     for(Bundle bundle : bundles) { 
     items = bundle.getItems(); 
     //.. more loops like this till we get to the required element 
     }   
    } 

YourKit 위의 코드는 쓰레기에 대한 각 호출에 대해 수집지고는 '핫 스팟'80 개체임을 알려줍니다 : 아래 그림과 같이이 루프 요소/태그에 도착하기 4 층을 필요로 이 코드를 포함한 메소드 위의 코드는 단지 예일 뿐이며 내가 갇혀있는 부분이 아닙니다. 대부분의 경우 프로파일 러에서 제공 한 정보를 어떻게 처리해야하는지에 대한 단서가 없습니다. 위의 코드에서 임시 객체의 수를 줄이려면 어떻게해야합니까? 응용 프로그램의 성능을 손상시키기 위해 잘 정의 된 원칙이 있습니까? 응용 프로그램을 프로파일 링 할 때 어떤 통계를 찾고 각 종류의 통계에는 어떤 영향이 있습니까?

편집 : 응용 프로그램을 프로파일 링하는 주된 목적은 처리량과 응답 시간을 늘리는 것입니다. 현재 처리량은 필요한 처리량의 10 %에 불과합니다!

+0

성능 목표 (응답 시간, 처리량, CPU 사용 및 메모리 사용)에 따라 달라집니다. – meriton

+0

주로 처리량 및 응답 시간에 관심이 있습니다. 우리는 충분한 메모리와 매우 강력한 프로세서를 가지고 있습니다! – CKing

답변

1

실적 목표와 관련된 통계에 중점을 둡니다. 최소한의 응답 시간에 관심이 있으니 각 메소드가 응답 시간에 얼마나 기여하는지 살펴보고 많은 기여를하는 사람들에게 초점을 맞 춥니 다 (단일 스레드 처리의 경우, 메소드 호출 중 경과 된 시간, 해당 메소드의 모든 호출에 대해 합계). YourKit이 핫 스폿 (문서 확인)으로 정의하는 내용을 잘 모르겠지만, 아마도 커뮤 테이션 경과 시간이 가장 긴 방법이므로 핫 스폿을 살펴 보는 것이 좋습니다. 대조적으로, 객체 할당은 응답 시간에 직접적인 영향을 미치지 않으며, 가비지 컬렉터가 CPU 시간의 상당 부분을 차지한다는 것을 확인하지 않는 한, 당신의 경우에 비할 바가 없습니다. 보통 그렇지 않습니다.

0

루프를 개선하는 방법은 스키마를 변경하고 본질적으로 모델을 병합하는 것입니다. 물론 스키마를 변경할 수 있는지 여부에 따라 달라집니다. 이 방법으로 생성 된 Java는 4 단계의 루핑을 필요로하지 않습니다. 물론 하루가 끝날 때 코드 자체가 실제로 문제가되는지 물어볼 필요가 있습니다. 응용 프로그램이 느리게 실행됩니까? 메모리 문제가 있습니까? 조숙 한 최적화가 모든 악의 뿌리임을 기억하십시오!

프로파일 링과 최적화는 복잡한 짐승이며, 상황에 따라 다릅니다 (Java 버전, 32 비트 64 비트 등). 또한 최적화 작업에는 코드 변경이 필요하지 않을 수도 있습니다. 예를 들어 JVM에서 GC 정책을 변경하여 문제를 해결할 수 있습니다. 예를 들어 코드에서 GCed 할 필요가있는 많은 작은 객체를 만드는 상황에서보다 효과적 인 GC 정책이 있습니다. 자주. 구체적인 내용이 있다면 아마도 당신을 도울 수 있지만 질문이 너무 광범위하게 보인다. 실제로 읽을 가치가있는 주제로 쓰여진 많은 책들이 있습니다.

1

나는 주어진 답변에 절대적으로 동의합니다.

구체적인 예를 고려해 보면 실제로 xpath api을 사용하여 XML의 특정 위치에 액세스하여 향상시킬 수 있습니다.

전체 DOM을 실제로 반복 할 필요가없는 상황에서는 선언적이어서 표현이 쉽고 오류가 발생하기 쉽기 때문에 첫 번째로 선택해야합니다.

매우 복잡한 쿼리의 경우에는 그렇지 않을 수도 있지만 간단한 시나리오가있는 것 같습니다.

+0

우리는 XML에 직접 액세스하지 않습니다. JAXB는 Apache CXF 웹 서비스가 수신 한 XML을 POJO로 비표 화합니다. POJO는 웹 서비스 끝점의 매개 변수로 수신됩니다. 즉, 생성 된 POJO에 XPATH를 사용하는 메소드가 포함되도록 JAXB에 xpath를 연결할 수 있습니까? – CKing

+0

리프 태그에서 정보를 수집하기 전에 응용 프로그램에서 통과하는 각 태그의 속성이 필요한 많은 경우에 전체 DOM을 통과해야합니다. – CKing

+0

xPath를 연결할 수있는 기술을 모르겠습니다. JAXB에 사실 그것은 기술의 목적과 모순이 될 수 있습니다. 죄송합니다.하지만 JAXB pojo를 다루고 있으며 XML에 직접 액세스 할 수 없다는 사실을 간과했습니다. 그러나 다른 사람들이 말한 것처럼 80 개의 객체를 생성하고 수집하는 것은 JVM에 아무런 영향을 미치지 않습니다. 일반적인 질문에 대해서는 잘못된 장소를보고있는 것일 수 있습니다. 어떻게이 특정 코드가 가장 많은 시간을 차지하는 코드라고 결론을 냈습니까? – Vitaliy