いくつかの swingx-ws コンポーネントを swinglabs デモ全体に追加しようとしたところ、単純な JXMapKit/-Viewer では、ローカルでロードする場合と比較して、 webstartableでタイルをロードするのが桁違いに遅いことに気付きました。
どこから調べ始めればよいか迷ってしまいます (UI の更新は EDT にあるようですが、詳しく調べる必要があるかもしれません)。
- ロード時間の違いを経験している人はいますか?
- 何が原因でしょうか?
- Webstartable をデバッグするには?
コードはかなり単純です (ローカルで実行するには、swingx と 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);
}
});
}
}
編集:
Web コンテキストでのアクセス許可チェックに何らかの形で関連しているようです。プロファイリングは、接続コール スタック全体が異なり (それほど驚くべきことではありません)、時間がかかることを示しています。とりあえず諦め..
編集2:
2つの別々の問題があるようです
- @Howard が既に述べたように、JavaWebStartSecurity.checkConnect(String, int) のホットスポットである、セキュリティ制限されたコンテキストでタイルをロードするための接続を開くのにかかる時間がやや長くなります。
- mapKit が (BSAF の) SingleFrameApplication で使用されている場合にのみ発生するように見える EDT のかなり奇妙なブロック
ブロックを再現するには、SimpleWSDemoAppを実行し、マップが表示されるまで待ちます (時間がかかります。これが最初の問題です)。次に、マウスを使用してズーム サムをすばやく上下に動かします。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)
マウスをドラッグすると、クリップボードへのアクセス許可のチェックが開始されます...