2015-01-09 3 views
0

리치 클라이언트 애플리케이션을 개발 중입니다. 이제는 NetBeans RCP에서 실행되도록 마이그레이션했습니다. 지금까지 모든 것이 원활하게 작동합니다.Netbeans 서명 된 jar로 인한 리소스 로딩 속도가 느림

최근에 첫 번째 릴리스를 빌드하고 시작하여 10 분이 아닌 1 분이 걸렸습니다. IDE에서 시작하면 모든 것이 이전만큼 빠릅니다.

내가 본 모든 것을 프로파일 링 한 후에 JPA에 대한 수천 개의 XML 파일로드가 이전보다 10-20 배 더 걸립니다. 나는 printlns을 추가했고, 파일 당 1 초 전에 < 대신에 약 50ms가 걸렸습니다. 문제는 서명 된 jar 파일에서만 발생한다는 것을 알았습니다. 서명되지 않은 jar로 정확히 동일한 응용 프로그램을 시작하면 10 초가됩니다. NetBeans 부호가있는 항아리와 통합하지 않고 응용 프로그램을 시작하면 10 초 밖에 걸리지 않습니다.

코드 포인트에서 해당 자원의로드가 전혀 변경되지 않았습니다. 런타임시 차이는 클래스 로딩에서 가장 높습니다. NetBeans는 class loader hierachy을 제공합니다. 컨텍스트 클래스 로더로 설정하려고 시도했지만 성능에는 차이가 없습니다. 또한 메모리 프로파일 러를 확인한 결과 class of classloader은 NetBeans 통합의 유무와 동일하거나 동일하지 않습니다.

프로파일 링을 시도했지만 엉망입니다. 프로파일 러 (JProfiler)에는 리소스가로드 된 클래스로드 스택 만 표시됩니다. Java의 "-verbose 옵션"조차도 리소스가로드되었음을 보여줍니다.

정확한 클래스 로딩 알고리즘을 모르는 상태에서 다음 부분으로 구성되어 있다고 가정합니다. NetBeans 통합의 유무에 상관없이 서명 한 응용 프로그램의 해당 부분은 동일해야합니다. CA와

  • 시험 검사
  • 검증 인증서를 verifiing 자원
  • 로드 클래스 패스
  • 에서 자원을 찾는

    • (아마도 HTTP 요청을하지만, 한 번만 (희망))

그 이유는 무엇인지 생각해보십시오.

통합 정보 :

는 이전 응용 프로그램은 여러 개의 창을 처리 한 JFrame 여러 JInternalFrames을 사용했다. NetBeans로 시작하면 이전 JFrame을 사용하고 콘텐츠를 JInternalFrame으로 표시하는 대신 동적으로 생성 된 상위 구성 요소에 표시합니다. 통합의 주된 이유는 NetBeans (Docking, Floating ...)에서 관리하는 창이었습니다.

답변

1

직접 발견했습니다. 만약 누군가 다른 사람이 그것에 관심이 있다면 대답은 여기에 있습니다.

시작시 NetBeans은 모든 캐싱을 비활성화하기 위해 다음 방법을 호출합니다. 이로 인해 각 리소스로드시 jar 파일이 다시로드됩니다. 서명 된 jar의 경우 이것은 jar의 완전한 검증을 포함합니다.

java.net.URLConnection.setDefaultUseCaches(boolean) 

구성이 JPA 구성으로 다시 활성화되어 정상적으로 작동합니다. 나는 정확히 모르겠다. 왜 NetBeans을 쓰는지는 모르겠지만 모듈의 온라인 업데이트에 관한 것 같다.