자바 성능 분석과 최적화 솔루션
Profiler, Memory Debugger, Code Coverage 등 3가지 모듈로 구성

기업용 애플리케이션 성능관리 전문업체인 한국 퀘스트소프트웨어는 최근 J2EE 성능관리솔루션을 시장에 선보였다. 이 제품들은 J2EE 분야를 더욱 강화한 전문 모니터링 솔루션인 Foglight for J2EE, Multi-Tier J2EE 성능진단 솔루션인 PerformaSure, J2EE/J2SE 자바의 성능 최적화를 담당하는 JProbe로 구성되어 있다. 이 가운데 자바 프로파일링, 메모리 디버깅, 코드 커버리지 분야에서 두각을 나타내고 있는 JProbe에 대해 소개한다. <편집자>

국내자바가 세상에 등장한지 10년이 지났다. 자바 애플리케이션의 영역은 점점 넓어지고 있고 그만큼 IT분야에서 자바가 차지하는 비중은 높아지고 있다. 하지만 J2EE/J2SE 애플리케이션이 거대해지고 복잡해지면서 애플리케이션 성능문제가 더욱 큰 이슈가 되고 있다. 자바의 성능을 분석하고 최적화하는 일이 아주 복잡하고 어려운 일로 자리잡고 있는 것이다.
‘Quest JProbe Suite’는 자바 애플리케이션의 성능 이슈, 메모리 문제의 주요 원인을 찾아내 최적화할 수 있도록 해주는 전문 프로파일링 솔루션으로 자바 개발팀, 성능관리팀, 애플리케이션 운영관리팀 등에 적합하다.
JProbe를 이용해 과도하게 호출되는 메서드나 오래 수행되는 메서드, 메모리 Leak의 원인, 인스턴스 현황, Deadlock 등을 감지하고 주요 원인을 제거함으로써 애플리케이션의 성능을 최상으로 이끌어낼 수 있다. JProbe는 크게 Profiler, Memory Debugger, Code Coverage의 3가지 모듈로 구성되어 있으며 주요 특징은 다음과 같다.
▲ 자바 애플리케이션의 성능 측정 및 진단
▲ 자바 Heap에 대한 분석 및 메모리 문제 진단
▲ 소스코드라인 수준의 성능 병목현상 진단
▲ 전체 애플리케이션 코드의 성능 테스트 수행
▲ Ant와의 연계를 통한 테스트 자동화

Quest JProbe Suite의 주요기능
·Call Graph / Method List
Call Graph는 자바 메서드의 호출관계를 그래프로 보여주고 호출횟수/메서드 수행시간/ 누적 수행시간/ 생성된 오브젝트 수 등에 따라 Top N의 메서드를 컬러로 표시하여 어느 메서드가 성능상 문제가 되고 있는지 한 눈에 파악할 수 있게 해준다.
메서드의 수행시간은 짧으나 호출횟수가 많다면 Parent 메서드에서 해당 메서드를 과도하게 호출한 경우이므로 Parent 메서드를 튜닝해야 하고, 반대로 호출빈도는 적으나 자체 수행시간이 길다면 해당 메서드 자체를 튜닝하는 것이 좋다.

·Deadlock 진단
자바의 멀티스레드 지원은 애플리케이션의 성능개선에 지대한 역할을 하고 있다. 하지만 신중하게 프로그램하지 않으면 스레드 Deadlock이 발생하게 되고 성능이 점점 느려져 결국 애플리케이션이 불능상태에 빠지게 된다. JProbe는 각 단위 테스트에서 스레드 Deadlock의 발생 여부를 진단하고 어느 메서드에서 Deadlock이 걸리는지를 알 수 있게 해준다.
·Instance View
Instance View는 테스트기간 동안 생성된 자바 인스턴스들의 패키지명/클래스명/생성된 인스턴스수/메모리 크기를 나타내어 과도하게 생성된 객체가 무엇인지, 메모리 사용량은 얼마나 되는지 등를 진단한다. 테스트를 진행하면서 임의의 GC(Garbage Collection)을 발생시켜 GC후 남아있는 인스턴스를 조사, Memory Leak 발생여부를 진단하고 문제 인스턴스를 찾는다. 또한 Instance Detail View를 통해 Root-Set으로부터 해당 인스턴스까지의 Reference Tree를 확인하여 어느 Parent 인스턴스로 부터 문제가 발생하는지를 조사한 후 바로 자바 소스코드와 연계하여 문제의 원인이 되는 코드라인을 잡아낼 수도 있다. 여기에다 해당 인스턴스의 Children 인스턴스를 조사하고 메모리 크기를 자동 계산하여 Memory Leak 발생시 Leak되는 메모리 크기를 가늠할 수도 있다.

·Runtime Heap / GC Monitor
JProbe 메모리 디버거에 있는 이 기능은 테스트 동안 자바 Heap 메모리의 사용 현황을 실시간 그래프로 보여두고 GC 발생상태를 나타내 준다. GC모니터에서는 GC의 발생 빈도뿐만 아니라 각 클래스별 GC된 인스턴스수, 릴리즈된 메모리 크기, GC후 남아있는 인스턴스 수을 나타내고 인스턴스를 발생시킨 자바 메서드도 보여준다. 짧은 기간 동안 자주 GC의 대상이 되고 있다면 자바 소스코드에서의 튜닝을 고려해 볼 수 있다.

·스냅샷 비교
스냅샷은 테스트 기간 동안의 자바 메모리 정보, 메서드 사용현황 정보 등을 담고 있는 일종의 리파지토리이다. 2개의 스냅샷을 비교하여 자바 알고리즘이나 JVM Config 수정, 대체 클래스의 적용에 따른 성능개선 효과를 바로 알 수 있도록 해주는 유용한 기능이다.
JProbe Profiler에서는 메서드 호출횟수/수행시간/생성 오브젝트 수의 감소 또는 증가를 비교해 볼 수 있고 JProbe Memory Debugger에서는 클래스 인스턴스 수/메모리 크기의 감소 또는 증가를 확인할 수가 있다. 따라서 어느 알고리즘이 해당 애플리케이션에 최선인지, JVM Config는 어떻게 바꾸는 것이 좋은지, 대체 클래스의 적용효과는 어떠한지를 판가름할 수가 있다.

·Code Line View
Profiler에서의 Call Graph/Method List 기능을 통해 과도한 메서드 호출이나 오래 수행되는 메서드를 확인했다면 그 메서드가 어느 소스코드 라인에서 호출되는지를 아는 것이 중요하다. JProbe는 Call Graph/Method List에서 오른쪽 마우스버튼을 통해 바로 해당 메서드를 호출한 자바 코드라인을 확인할 수 있다.
Code Line View에서는 각 코드라인별로 호출횟수/수행시간/생성 오브젝트 수를 보여주어 과도한 오브젝트를 생성하는 코드라인을 찾아내거나 불필요하게 자주 호출되는 메서드가 어느 코드라인 때문인지를 확인하여 자바 소스코드의 최적화를 이룰 수 있도록 도와 준다.

·Code Coverage
코드 커버리지는 각 단위 테스트를 수행해 각 패키지/메서드/코드라인 별로 테스트 여부를 확인하는 기능이다. 이 기능은 특히 QA(Quality Assurance)팀에게 유용한데 테스트 진척여부를 한 눈에 확인할 수 있기 때문이다. 소스코드별로 어느 라인이 테스트되고 어느 라인이 누락되었는지를 확인할 수 있으며 Merge 기능으로 각 모듈의 테스트 결과를 통합하여 관리할 수 있다.

·IBM Heap Dump
JProbe는 IBM JVM에서 생성된 Heap Dump 파일을 Load하여 분석하는 기능을 제공한다. 대부분의 자바 프로파일링 솔루션은 자세한 데이터 수집에 의해 발생하는 부하 때문에 운영환경에 적용하는 것을 피하고 있다. JProbe는 그에 대한 대안으로 운영환경에서 메모리 문제에 의해 발생하는 Heap Dump 파일을 Load하여 분석하고 스냅샷을 생성, 메모리 문제발생시의 인스턴스 정보를 확인하여 문제원인을 찾도록 도와준다.

·Automation
‘Test Early and Often’라는 말이 있다. 이는 테스트는 개발초기부터 자주하는 것이 전체 프로젝트의 안정성과 비용측면에서 효율적임을 강조하는 말이다. JProbe는 Trigger 기능을 도입하여 애플리케이션이 실행될 때 Test Case의 시작과 종료를 자동으로 컨트롤할 수 있다. 또한 Ant, JUnit등과 연계해 성능테스트를 자동으로 수행하고 테스트 스냅샷과 결과 레포트를 생성한다. 이제 자바 개발자는 주간에 코드를 수정하고 저녁에 성능테스트를 수행하도록 자동화한 다음 바로 그 결과를 확인하면 되는 것이다. JProbe의 주요모듈(Profiler, Memory Debugger, Code Coverage)은 모두 Ant와 연계하여 자동화되며 그 결과를 HTML/ Text/ XML 파일 형태로 보고할 수 있다. JProbe Automation기능을 이용해 더욱 신속하고 정확하며 체계화된 성능테스트를 수행할 수 있는 것이다.
저작권자 © 아이티데일리 무단전재 및 재배포 금지