2009-03-19 1 views
3

웹 응용 프로그램에서 일부 페이지의 첫 번째로드는 클래스 로딩으로 인해 시간이 많이 소요되지만 눈에 띄지는 않습니다. 누구든지 시작시 JVM에서 웹 응용 프로그램 클래스를 미리로드하는 영리한 방법이 있습니까?시작시 JVM에서 웹 응용 프로그램 클래스를 어떻게 미리로드 할 수 있습니까?


업데이트 : 우리가 지금 할 것은 DB 테이블에 전체 클래스 이름의 무리 (700)를 저장한다. 시작시 테이블을 읽고 Class.forName()을 수행합니다. 그것은 잘 작동하지만 더 영리한 접근법이있을 거라 생각 했어. 프로파일 러를 사용하여 시작시 참조 된 700 개의 클래스를 결정했습니다.

답변

1

Class.forName()은 내가 생각할 수있는 유일한 것입니다. 분명 더 영리한 대안을 듣는 데 관심이있을 것입니다.

또 다른 옵션은 URL의 집합을 선택하고 해당 URL을 칠 시작시 스크립트를 실행하는 것입니다. 당신이 그들을 배포하기 전에

+0

업데이트에서 언급했듯이 이것은 정확히 우리가하는 일입니다. 잘 작동합니다. 방금 구현 한 방법보다 더 나은 접근 방법이있을 것이라고 생각했습니다. –

0

당신은 항상 당신의 JSP 페이지를 미리 컴파일 등 재스퍼와 같은 타사 JSP 컴파일러를 사용할 수 있습니다.

+0

실제 JSP 컴파일은 문제가되지 않습니다. 컴파일 된 다양한 Java 라이브러리와 컴파일 된 JSP 파일을로드합니다. –

+0

죄송합니다. 네가 묻고있는 것을 오해했다. 나는 당신이 당신의 문제에 대한 해결책을 찾았기를 바랍니다. –

2

글쎄, 그것은 사양의 일부로서 매우 영리 아니지만, 당신은 당신의 서블릿을 시작할 수있을 때 앱이 web.xml에 서블릿 정의에 load-on-startup 요소를 추가하여 시작되는 웹 :

<servlet> 
    <description>....</description> 
    <display-name>....</display-name> 
    <servlet-name>....</servlet-name> 
    <servlet-class>....t</servlet-class> 
    <load-on-startup>1</load-on-startup> 
</servlet> 

대표적인 서비스 세트 (또는 모든 것을 미리로드 할 수있는 서블릿 하나)에 대해이 작업을 수행하면 목표를 달성 할 수 있습니다.

예를 들어 실제로 의미있는 방법으로 초기화하지 않고 JAR 파일에서 클래스를로드하려는 경우 및 JAR 파일의 위치를 ​​알고 있거나 JAR 파일의 위치를 ​​파악할 수있는 경우 그렇다면 this JCP forum post "List classes in package"의 코드 또는 그 스레드의 이후 게시물 중 일부를 사용할 수 있습니다. 클래스 목록에서 실제로 인스턴스를 인스턴스화 할 필요없이 클래스를로드하는 데 도움이되는 Class 객체를 가져올 수 있습니다.

+0

우리가 해. 이것은 물론 서블릿만을 다루고 관련 라이브러리는 다루지 않습니다. –

+0

서블릿은 초기화시 관련 라이브러리를 참조 할 수 없습니까? – Eddie

+0

수 있습니다. 물론로드 될 모든 클래스를 결정한 다음 서블릿에서 모두 참조해야합니다. 우리는 좀 더 깨끗한 접근법을 찾고있었습니다. –

1

스레드 내부의 Class.forName은 잠재적으로 작업 속도를 향상시킵니다. 첫번째 페이지에있는 것들로 시작하십시오.

이 시작 빨리 (그 이전에 돌아갑니다)하고 먼저 그들이 희망 페이지를 당한다 시간에 의해로드 될 가능성이 클래스를로드 시작부터해야 스레딩. 페이지가 나오기 전에 잘 읽은 다른 거래에 대해서는.

또한 더 걸릴 및 클래스의 각 그룹 (그룹이 될 것입니다 해당 페이지에서 필요로하는 클래스) 스레드를 시작할 수 있습니다. 디스크에서 읽기를 병렬 처리 할 수 ​​있기 때문에 속도가 빨라질 수 있습니다 (속도가 느려질 수도 있습니다).

이 상황이 페이지의 첫 번째로드에 진정되지 것을 피부되지 않지만, 조사 가치가있다.

0

700 클래스를 jar 파일로 변환하고 사전로드를위한 몇 가지 방법을 적용 할 수 있습니다. 아마도 부트 클래스 경로에 jar 파일을 넣을 수 있습니다. (다만 힌트를 주면 확실하지 않습니다.).

2

단일 더미 클래스의 정적 초기화 코드를 작성하려고하고 시작할 때 해당 클래스를로드 할 수 있습니다. 정적 이니셜 라이저는 다른 클래스가로드되도록하는 몇 가지 핵심 오브젝트를 작성합니다 (코드 모듈성을 향상시키기 위해이 작업을 반복적으로 수행 할 수 있습니다). 나는 이것이 훨씬 더 짧고 간단하다는 것을 확신 할 것이다. (그리고 걱정할 DB 문제는 없다.)

더 나은 방법은 시작시 느리게로드되는 페이지 중 일부를 실행하고 결과를 버리는 서블릿을 작성하는 것입니다. 이렇게하면 클래스가 강제로로드됩니다. 이 페이지를로드 많은 각각 시간은 Just-In-Time 컴파일이 완료되는 양을 늘릴 것입니다 (코드 속도를 높이고 JIT 컴파일 비용을 줄입니다). 여기에는 또 다른 장점이 있습니다. 이것은 "전원 켜기 자체 테스트"로, 일회성 시작 작업이 수행되고 여러 가지 주목할만한 수준으로 다양한 캐시를 준비 할 수도 있습니다.

관련 문제