Tomcat 6은 Webapps 전반에 걸쳐 캐시합니까?

Tomcat 6은 Webapps 전반에 걸쳐 캐시합니까?

4GB와 다음 JAVA_OPTS를 갖춘 Ubuntu 12.04 서버에 Tomcat 6 서버가 있습니다.

JAVA_OPTS="-Djava.awt.headless=true -Xms512M -Xmx512M -XX:PermSize=1024M -XX:MaxPermSize=1024M -XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled"

멍청한 질문: 동일한 webapp(동일한 war 파일)을 여러 번 배포하는 경우(각각 다른 Postgres 데이터베이스 참조) - server.com:8080/webapp1 server.com:8080/webapp2 등...

Tomcat이 여러 웹앱에 걸쳐 클래스 파일을 한 번 캐싱한다고 가정해도 될까요? 아니면 Tomcat이 Webapp별로 클래스를 캐시합니까?

미리 감사드립니다 대니

답변1

대답은 웹앱에서 사용되는 클래스 파일의 위치에 따라 다릅니다.

$CATALINA_HOME/lib의 Tomcat 공통 클래스 로더 경로에 특정 클래스를 넣으면 모든 웹앱에서 사용할 수 있습니다. 캐시된 형식도 마찬가지입니다.

webapps/의 Tomcat 웹 애플리케이션 클래스 로더 경로를 사용하는 경우웹앱/WEB-INF/클래스 및 웹앱/웹앱/WEB-INF/lib 클래스와 해당 클래스 캐시는 애플리케이션 간에 격리됩니다.

기술적 배경

Tomcat은 Java가 기본적으로 클래스를 처리하는 방식을 따르지 않지만 사용자 정의 Java 클래스 로더를 사용합니다. 이는 다음과 관련된 여러 기능을 적용하기 위한 것입니다.

  • 웹앱 내 클래스 처리
  • 웹앱별 클래스 캐싱
  • 웹 애플리케이션 시작/런타임 시 클래스 사전 로드 및 다시 로드
  • 클래스 로딩/참조 보안

Tomcat 사용자 정의 클래스 로더는 Java 기본 부트스트랩, 확장 및 시스템 클래스 로더를 사용하지만 자체 클래스 경로를 시스템 클래스 로더에서 사용하는 클래스 경로 변수로 대체합니다. 이는 다음과 같은 효과를 갖습니다.

  • Java와 함께 제공되는 승인 표준 재정의 메커니즘을 Tomcats 자체 메커니즘으로 대체합니다.
  • Java 클래스 로딩 계층 구조 끝에 두 개의 추가 클래스 로더를 추가합니다.

    • Tomcat 공통 클래스 로더
    • 웹앱당 별도의 클래스 로더

원래 클래스 경로는 Tomcat에서 무시됩니다.

중요한 세부 사항은 웹앱 클래스 로더가 클래스 로딩을 상위 클래스에 먼저 위임하지 않고 요청될 때 각 클래스를 로드하려고 시도한다는 것입니다. 로드된 각 클래스는 이후에 문제의 웹앱 클래스 로더에 의해 캐시됩니다. 이 클래스로더/캐시 수준은 웹앱 간에 공유될 수 없습니다.

Common 클래스 로더에 의해 로드된 모든 클래스는 캐시를 포함하여 모든 웹앱에서 공개적으로 사용할 수 있습니다. 공통 클래스 로더 경로에 클래스를 광범위하게 배치하는 것은 다음과 같은 이유로 권장되지 않습니다.

  • 이식성을 깨뜨린다
  • 클래스 버전 요구 사항은 Tomcat과 다른 웹앱 간에 다를 수 있습니다.
  • 유지관리가 문제가 되었는데, 어느 클래스에 속합니까?

클래스 로딩/캐싱/재로딩 프로세스에는 꽤 작은 글씨가 첨부되어 있습니다. 그것이 중요하다면 내 제안은 클래스 로딩에 관한 뛰어난 장을 읽어 보는 것입니다.전문 아파치 톰캣 6.

누군가가 압축한 버전을 작성했습니다.이것페이지.

관련 정보