2013-04-09 4 views
7

스윙 챕터 전체의 데모에 swingx-ws 구성 요소를 추가하려고 시도했습니다. 간단한 JXMapKit/-Viewer가 로컬 로딩과 비교하여 webstartable의 타일로드 속도가 느리다는 것을 알았습니다.JXMapKit/-viewer가 webstartable로 매우 느리게 - 파기 시작 위치?

오히려 손실에 나는 (UI 업데이트는하지만 면밀한 관찰을해야 할 수도 있습니다, 동부 서머 타임에있을 것 같다)을 찾기 시작해야하는 위치 : 다른

  • 사람이 다른 로딩 시간을 경험?
  • 이유가 무엇인지 추측 할 수 있습니까?
  • webstartable을 디버깅하는 방법은 무엇입니까?

코드는 오히려 간단하다 (로컬로 실행하려면 swingx and swingx-ws해야합니다 :

public class WSDemo { 

    private JComponent createContent() { 
     JComponent content = new JPanel(); 
     content.setLayout(new BorderLayout()); 

     content.add(createMapKit()); 
     return content; 
    } 

    protected JComponent createMapKit() { 
     final int max = 17; 
     TileFactoryInfo info = new TileFactoryInfo(1, max - 2, max, 256, true, 
       true, // tile size is 256 and x/y orientation is normal 
       "http://tile.openstreetmap.org",// 5/15/10.png", 
       "x", "y", "z") { 
      public String getTileUrl(int x, int y, int zoom) { 
       zoom = max - zoom; 
       String url = this.baseURL + "/" + zoom + "/" + x + "/" + y 
         + ".png"; 
       return url; 
      } 

     }; 
     DefaultTileFactory tf = new DefaultTileFactory(info); 
     tf.setThreadPoolSize(1); 
     final JXMapKit kit = new JXMapKit(); 
     kit.setTileFactory(tf); 
     kit.setZoom(10); 
     kit.setAddressLocation(new GeoPosition(51.5, 0)); 
     kit.getMainMap().setDrawTileBorders(true); 
     return kit; 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       JFrame frame = new JFrame(""); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(new WSDemo().createContent()); 
       frame.setLocationByPlatform(true); 
       frame.setSize(400, 400); 
       frame.setVisible(true); 
      } 
     }); 
    } 

} 

편집 : 그것은 어떻게 든 웹 컨텍스트에서 권한 점검에 관련된 것처럼

같다 : 프로파일 링은 전체 연결 호출 스택이 (지나치게 놀라운 것은 아니지만) 다르고 오래 걸리는 것을 보여줍니다. 지금 포기하기 ...

편집 2가 :

2 별도의 문제

  • 는 보안 제한 맥락에서 타일을로드하기 위해 연결을 여는 데 걸리는 다소 긴 시간이 될 것 같다, 그 JavaWebStartSecurity의 핫스팟이다. @Howard가 이미 지적한대로 checkConnect (String, int). 지도가 보일 때까지
  • mapKit가 차단을 재현 SimpleWSDemoApp를 실행하려면

(BSAF의)는 SingleFrameApplication에 사용되는 경우에만 일어날 것 같다 EDT의 다소 이상한 차단, 소요 (대기 언젠가 그게 첫 번째 문제입니다.) 그런 다음 마우스를 사용하여 줌 썸을 빠르게 위아래로 이동하십시오 .Ui가 완전히 차단되었습니다. 일반 프레임 (위의 참조)에서 동일한 작업을 수행하면 초기로드 대기 시간이 있지만 블로킹을 재현 할 수는 없습니다.

(나에게) 이상한 꼬추는 VisualVM과의 스레드 덤프에서 무엇을 차단 EDT입니다 :

클립 보드 액세스 권한을 확인에서 마우스 차기를 끌고있다
"AWT-EventQueue-0" prio=6 tid=0x063d3000 nid=0x1468 waiting for monitor entry [0x05efe000] 
    java.lang.Thread.State: BLOCKED (on object monitor) 
    at java.security.Permissions.implies(Unknown Source) 
    - waiting to lock <0x29f7b118> (a java.security.Permissions) 
    at sun.security.provider.PolicyFile.implies(Unknown Source) 
    at java.security.ProtectionDomain.implies(Unknown Source) 
    at java.security.AccessControlContext.checkPermission(Unknown Source) 
    at java.security.AccessController.checkPermission(Unknown Source) 
    at java.lang.SecurityManager.checkPermission(Unknown Source) 
    at java.lang.SecurityManager.checkSystemClipboardAccess(Unknown Source) 
    at java.awt.event.InputEvent.canAccessSystemClipboard(Unknown Source) 
    at java.awt.event.InputEvent.<init>(Unknown Source) 
    at java.awt.event.MouseEvent.<init>(Unknown Source) 
    at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source) 
    at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source) 
    at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source) 
    at java.awt.Container.dispatchEventImpl(Unknown Source) 
    at java.awt.Window.dispatchEventImpl(Unknown Source) 
    at java.awt.Component.dispatchEvent(Unknown Source) 
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source) 
    at java.awt.EventQueue.access$200(Unknown Source) 
    at java.awt.EventQueue$3.run(Unknown Source) 
    at java.awt.EventQueue$3.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) 
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) 
    at java.awt.EventQueue$4.run(Unknown Source) 
    at java.awt.EventQueue$4.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) 

...

+2

VisualVM은'JavaWebStartSecurity.checkConnect (String, int)'와'getHostByAddr (byte [])'안에 극단적 인 핫스팟을 보여주었습니다. 이 문제를 확인할 수 있습니까? – Howard

+0

@Howard - 감사합니다. – kleopatra

+0

@Howard가 확인되었습니다. - 주위를 둘러 볼 방법이 없습니다. – kleopatra

답변

3

Web Start 앱은 JVM 프로세스이므로 VisualVM (이 항목은이를 수행하는 방법을 설명 함)으로 프로필을 작성할 수 있습니다. 또한 VisualVM을 사용하여 두 응용 프로그램을 프로파일하고 힙 크기, JIT 컴파일러 차이점과 같은 JVM 설정을 비교하는 것도 가치가 있습니다. 나는 Web Start 애플리케이션이 클라이언트 컴파일러로 실행된다고 생각한다. 이것은 서버 컴파일러보다 생성 된 네이티브 코드에 의해 느리다.

+0

visualVM 정말 먼지에 파고에 도움이,이 포인터에 대한 하나 이상의 upvote가 있었으면 좋겠다 :-) – kleopatra