클래스 로더 문제점 해결

클래스 로더는 클래스 파일을 찾아서 로드합니다. 배치된 애플리케이션이 적절하게 실행되도록 하려면, 애플리케이션 및 해당 모듈에 영향을 주는 클래스 로더를 구성하여 애플리케이션이 필요로 하는 파일 및 자원을 찾을 수 있도록 해야 합니다. 클래스 로더에 대한 문제점 진단은 복잡하며 상당한 시간이 소요됩니다. 문제점을 더 신속하게 진단하고 수정하려면 관리 콘솔 클래스 로더 뷰어를 사용하여 클래스 로더와 각 클래스 로더에 의해 로드된 클래스를 조사하십시오.

시작하기 전에

이 주제에서는 제품에서 지원하는 서버에 애플리케이션을 설치했으며 애플리케이션 또는 해당 모듈에 사용되는 클래스 로더를 조사하려 한다고 가정합니다. 모듈은 웹 모듈(.war 파일)이거나 엔터프라이즈 Bean(EJB) 모듈(.jar 파일)일 수 있습니다. 클래스 로더 뷰어를 사용하면 런타임 환경에서 클래스 로더를 조사할 수 있습니다.

이 주제에서는 또한 클래스 로더 뷰어 서비스를 사용 가능하게 했다고 가정합니다. 서버 > 서버 유형 > WebSphere Application Server > server_name > 클래스 로더 표시기 서비스를 클릭하여 서비스를 사용 가능하게 하고 서버를 다시 시작하십시오.

이 태스크 정보

WebSphere® Application Server 의 런타임 환경은 다음 클래스 로더를 사용하여 다음 순서로 응용프로그램의 새 클래스를 찾아 로드합니다.

  1. 부트스트랩, 확장자, 및 CLASSPATH 클래스 로더는 Java 가상 시스템으로 작성됩니다.
  2. WebSphere 확장자 클래스 로더
  3. 서버에서 실행 중인 엔터프라이즈 애플리케이션 요소를 로드하는 하나 이상의 애플리케이션 모듈 클래스 로더.
  4. 0 이상의 웹 모듈 클래스 로더
클래스 로더 계층 구조

이전 클래스 로더는 그 위에 있는 클래스 로더의 하위입니다. 즉, 애플리케이션 모듈 클래스 로더는 CLASSPATH Java 클래스 로더의 하위 요소인 WebSphere 확장자 클래스 로더의 하위 요소입니다. 클래스를 로드해야 할 때마다 클래스 로더는 대개 요청을 상위 클래스 로더에 위임합니다. 어떤 상위 클래스 로더도 클래스를 찾을 수 없는 경우, 원래 클래스 로더가 클래스를 로드하려 시도합니다. 요청은 상위 클래스 로더로만 이동하며 하위 클래스 로더로 이동할 수 없습니다. 클래스 로더에서 클래스가 로드된 후, 로드하려 시도하는 새 클래스는 동일한 클래스 로더를 다시 사용하거나 해당 클래스를 찾을 때까지 이전 목록을 거슬러 올라갑니다.

애플리케이션의 아티팩트를 로드하는 클래스 로더가 제대로 구성되어 있지 않은 경우 해당 애플리케이션 시작 또는 실행 시 JVM(Java Virtual Machine)이 클래스 로딩 예외를 발행할 수 있습니다. 클래스 로딩 예외 는 부적절하게 구성된 클래스 로더로 인한 예외 유형을 설명하고 클래스 로더의 구성을 정정하기 위해 클래스 로더 뷰어를 사용하는 방법을 제안합니다. 예외 유형은 다음과 같습니다.

클래스 로더 뷰어를 사용하여 클래스 로더를 조사하고 애플리케이션이나 클래스 로더 구성 문제점을 정정합니다.

프로시저

  • 설치된 모든 애플리케이션과 해당 모듈을 나열하는 트리 보기를 조사하십시오. 모듈은 웹 모듈 (.war 파일) 또는 EJB 모듈 (.jar 파일) 일 수 있습니다.

    문제점 해결 > 클래스 로더 뷰어 를 클릭하여 엔터프라이즈 애플리케이션 토폴로지 페이지에 액세스하십시오.

  • 클래스 로더 위임 계층 구조를 조사하십시오.

    엔터프라이즈 애플리케이션 토폴로지 페이지에서 클래스 로더 뷰어 페이지에 액세스할 모듈을 선택하십시오. 페이지에는 설치된 엔터프라이즈 애플리케이션의 웹 및 EJB 모듈에 대해 표시 가능한 클래스 로더가 나열됩니다. 이 페이지는 어떤 클래스 로더가 모듈의 파일을 로드하는지 판별하고 클래스 로더의 문제점을 진단하는 데 도움이 됩니다.

    위임 계층 구조는 애플리케이션이나 웹 모듈에 대해 지정된 클래스 로더 위임 모드 또는 클래스 로더 순서에 의해 판별됩니다. 값은 Classes loaded with parent class loader first 또는 Classes loaded with local class loader first (parent last)일 수 있습니다. 자세한 정보는 클래스 로더 구성 단계를 참조하십시오.

  • 클래스 로더에 대한 정보를 내보내십시오.
    1. 클래스 로더 표시기 페이지에서 내보내기를 클릭하십시오.
    2. 클래스 로더 정보에 대해 브라우저 또는 편집기를 열거나 디스크에 XML 형식으로 정보를 저장할 것을 선택하십시오.
    3. 확인을 클릭하고 시스템에서 요청한 추가 정보를 지정하십시오.
  • 모듈에 대해 표시 가능한 클래스 로더에 대한 정보를 HTML 테이블 형식으로 표시하십시오.

    클래스 로더 표시기 페이지에서 테이블 보기를 클릭하십시오. 테이블 보기 페이지는 다음 정보를 표시합니다.

    표 1. 테이블 보기 페이지 . 클래스 로더 속성에 대한 정보가 제공되어 있습니다.
    클래스 로더 속성 설명
    위임 클래스 로더가 모듈의 로딩을 상위 클래스 로더에 위임하는지 여부를 표시합니다. true 값은 상위 애플리케이션의 클래스 로더가 사용 중임을 의미합니다 (Classes loaded with parent class loader first). false 값은 모듈 클래스 로더가 사용 중임을 의미합니다 (Classes loaded with local class loader first (parent last)). 자세한 정보는 클래스 로더 구성 단계를 참조하십시오.
    클래스 경로 클래스 로더가 클래스 및 자원을 검색하는 경로를 나열합니다.
    클래스 이 클래스 로더가 JVM에서 로드한 클래스의 이름을 나열합니다.

    테이블 보기 옵션은 메모리 부족 오류가 생성될 때 값을 리턴하지 않습니다. 메모리 부족 오류는 메모리 누수와 관련되어 있을 수 있습니다. 테이블에서 클래스 로더에 대한 정보를 검토하려면 메모리 부족 문제를 해결한 다음 테이블 보기를 다시 클릭하십시오.

  • 클래스 로더를 검색하십시오.
    클래스 로더 표시기 페이지에서 검색 을 클릭하여 다음에 대한 클래스 로더를 검색할 수 있는 검색 페이지에 액세스하십시오.
    • 특정 문자열
    • 특정 .jar 파일
    • 특정 디렉토리에 있는 파일의 이름
    • 특정 클래스 로더에서 로드한 파일의 이름
    검색은 대소문자를 구분합니다. 클래스 로딩 예외 에서는 검색 페이지의 여러 사용에 대해 설명합니다.
  • 클래스 로더를 구성하십시오.
    다음에 대해 클래스 로더를 구성할 수 있습니다.

    클래스 로더 구성에 따라 애플리케이션이나 웹 모듈의 클래스와 자원 파일을 로드하는 클래스 로더가 결정됩니다. 애플리케이션 및 WAR 모듈 클래스 로더 구성 설정값에는 클래스 로더 순서WAR 클래스 로더 정책이 포함됩니다.

    클래스 로더 순서 값은 Classes loaded with parent class loader first 또는 Classes loaded with local class loader first (parent last)일 수 있습니다. 기본값은 Classes loaded with parent class loader first입니다. Classes loaded with parent class loader first 모드의 클래스 로더는 클래스 경로를 검색하기 전에 클래스 또는 자원 로드를 바로 위의 상위 클래스 로더에 위임합니다.

    클래스 로딩 문제 해결 시 상위 클래스 로더에 가시적인 클래스를 대체해야할 수 있습니다. 이러한 클래스를 애플리케이션에 특정한 클래스로 대체하려면 클래스 경로에 애플리케이션 클래스를 포함하는 클래스 로더에서 클래스 로더 순서Classes loaded with local class loader first (parent last) 로 설정하십시오. 애플리케이션은 상위 클래스 로더에 표시된 클래스를 대체할 수 있지만, 대체된 클래스와 대체되지 않은 클래스를 혼합하여 사용할 경우 ClassCastException 또는 UnsatisfiedLinkError가 발생할 수 있습니다.

    예를 들어, 기본 클래스 로더 정책에서 웹 모듈에는 일반적으로 다음 위치에 있는 아티팩트를 로드하기 위한 자체 웹 모듈 (WAR) 클래스 로더가 있습니다.WEB-INF/classesWEB-INF/lib없습니다. 애플리케이션 모듈 클래스 로더는 이 WAR 클래스 로더의 바로 상위입니다. 로드 조작을 애플리케이션 모듈 클래스 로더에 위임하기 전에 웹 모듈 클래스 로더가 특정 클래스 또는 자원에 대해 먼저 이러한 경로를 검색하도록 하려면 웹 모듈의 클래스 로더 순서Classes loaded with local class loader first (parent last)로 설정하십시오.

    클래스 로더 정책은 애플리케이션 및 WAR 모듈 클래스 로더의 구조를 판별합니다. 기본 정책 아래에서, 실행 중인 모든 애플리케이션 EAR은 자체 애플리케이션 모듈 클래스 로더를 가지며 모든 웹 모듈은 자체 WAR 모듈 클래스 로더를 가집니다. 기본 정책은 애플리케이션 아티팩트 간 격리 및 가시성에 관한 Java EE 준수를 보장합니다. 클래스 로딩 문제 해결 시 기본 정책은 변경하지 않는 것이 좋습니다.

다음에 수행할 내용

클래스 로더 문제점이 계속되면 클래스 로딩 예외클래스 로딩을 참조하십시오.