2011-01-19 2 views
3

내 J2EE 응용 프로그램의 속도가 느립니다. 우리는 그 상황에서 Thead 덤프를 가져 와서 다음 스레드가 다중 덤프에서 Runnable이고 다른 스레드가 (직접 또는 간접적으로) 잠금을 기다리는 일부 모니터를 잠갔습니다.중단 된 스레드 java.lang.ClassLoader.findBootstrapClass

at java.lang.ClassLoader.findBootstrapClass(Native Method) 
at java.lang.ClassLoader.findBootstrapClass0(ClassLoader.java:891) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:301) 
    - locked [0x9747c360] (a sun.misc.Launcher$ExtClassLoader) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:299) 
    - locked [0x9747c318] (a sun.misc.Launcher$AppClassLoader) 
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:268) 
    - locked [0x9747c318] (a sun.misc.Launcher$AppClassLoader) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:251) 
..... 

이 스레드가 움직이지 않고 다른 스레드가 작동하도록 하시겠습니까?

+1

Java 및 응용 프로그램 서버 버전을 사용하면 도움이됩니다. 다른 스레드는 정상적인 클래스 로더 잠금을 기다리고 있지만, 네이티브 메소드에서 특정 스레드가 블록되면 하드웨어/디스크 문제가 있거나 손상된 jar 파일이 있다고 생각하게됩니다. 디버그에서 응용 프로그램 서버를 시작하고 프로세스를 일시 중지하여 어떤 클래스가 범인인지 확인할 수 있습니다. – bestsss

+0

@bestsss 자바 : 1.5. AppServer : WAS 7.0 –

+0

속도 저하는 언제 발생합니까? 시동 직후 또는 시스템이 잠시 또는 무작위로 실행 된 후? WAS 자신과는 친밀하지 않지만 모든 디버그 관련 매개 변수가 해제되어 있는지 확인하고 배치 된 후에는 아무것도 수정하지 않는지 확인합니다. websphere가 애플리케이션을 여러 번 다시로드 할 수있는 것처럼 보입니다. – CurtainDog

답변

1

앱에로드하는 클래스가 너무 많습니다 (잠금이 loadClass에있는 이유는 무엇입니까?). 앱이 초기화 및 예열 중에 만 언로드 된 클래스를로드 할 것으로 예상됩니다.

  • 당신은 대신 재사용하기 위해 노력하는 다른 동적 프록시 클래스를 많이 만들 :

    그래서, 다음 중 하나가 일어나고 있다고 생각한다.

  • 불필요하게 많은 ClassLoader를 만들거나 적어도이를 잘못 사용하고 있습니다.
  • 여러 개의 병렬 JVM을 시작하고 종료합니다.

물론 이러한 것들은 매우 비싸므로 가능한 한 최대로 피해야합니다.

+0

정보 주셔서 감사. 그러나 우리는 위에서 언급 한 3 가지 중 하나를 사용하지 않습니다.우리의 응용 프로그램은 사용자 정의 클래스 로더를 사용하지 않고 기본 클래스 로딩 메커니즘을 활용하는 직접적인 J2EE 응용 프로그램입니다. 또한 초기화 중에 응용 프로그램이 많은 클래스를로드하지만 실제 프로덕션 환경에서 시작한 후에는 문제가 너무 길다는 것에 동의하십시오. 우리는 Perm-Gen 문제의 메모리 공간으로 인해 이것이 문제가 될 수 있다고 생각하지만 perm-gen 공간을 늘린 후이를 모니터링하면 배제됩니다. –

+0

Java VM은 클래스를 처음 사용할 때 클래스를 동적으로로드합니다. 워밍업 중에 대부분의 클래스가로드 될 수 있지만 앱이 이전에 해제되지 않은 경로를 사용하게하는 요청으로 인해 추가 클래스가로드 될 수 있습니다. 전체 스레드 덤프는 클래스로드를 트리거 한 원인을 지적합니다. – Cagatay

0

이 스레드가 일시 중지 된 경우 무기한으로 원형 참조 (symlinks? other?)를 추측 할 수 있습니다.

로드 된 클래스에 대한 로깅을 사용하도록 설정하면 더 많은 정보를 찾을 수 있습니다.

java -verbose:class your.Class 

이것은 많은 것을 보여줍니다. 나는 그것이 system.out에 쓸 것이라고 믿는다. 그래서 당신은 적절한 로그를 체크해야 할 것이다.

1

이런 종류의 일은 OSGI에서 발생합니다. OSGI에서는 클래스 로더 구조가 일반적인 J2EE처럼 트리가 아닌 그래프입니다. 클래스 로더는 클래스를로드 할 때 스스로 잠그므로 클래스 로더의 클래스를 두 개의 스레드 (a, b)가 각각 (x, y)와 (y, x)의 순서로로드하면 교착 상태가 될 수 있습니다. 이것은 정적 이니셜 라이저가 다른 클래스 로더에서 더 많은 클래스 로딩을 유발할 때 발생할 수 있습니다. 부트 스트랩 클래스가 app 클래스 로더의 클래스 로딩을 자주하는 것은 아니지만 스레드 컨텍스트 로더를 사용하는 표준 라이브러리의 모든 팩토리 클래스가이 계산서에 적합합니다. 일반적인 해결책은 아마도 앱 시작 중에 클래스를로드하여 이전 시점에로드하는 것이므로주기를 깨뜨리는 것입니다.