JXMapKit / -Viewer非常慢,因为webstartable – 从哪里开始挖掘?

只是尝试在整个swinglabs演示中添加一些swingx-ws组件 – 并注意到与本地加载相比,简单的JXMapKit / -Viewer在webstartable中加载tile的速度要慢几个数量级。

相当失去我应该开始寻找的地方(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

似乎有两个不同的问题

  • 正如@Howard已经指出的那样,在安全受限的上下文中打开连接以加载切片所需的时间稍长,这是JavaWebStartSecurity.checkConnect(String,int)中的热点。
  • 只有在SingleFrameApplication(BSAF)中使用mapKit时才会发生相当奇怪的EDT阻塞

要重现阻塞,请运行SimpleWSDemoApp ,等待地图可见(需要一些时间,这是第一个问题)然后使用鼠标快速上下移动缩放拇指:ui被完全阻止。 在普通帧(顶部的引用)上执行相同操作会有初始加载等待,但无法重现阻塞。

奇怪的东西(对我来说)是什么阻止了EDT,从VisualVM的线程转储:

 "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  (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.(Unknown Source) at java.awt.event.MouseEvent.(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) 

这是拖动鼠标踢检查剪贴板访问权限…

Web Start应用程序也是一个JVM进程,因此您可以尝试使用VisualVM对其进行概要分析(此条目描述了如何执行此操作)。 使用VisualVM分析这两个应用程序并比较堆大小,JIT编译器差异等JVM设置也是值得的。 我认为Web Start应用程序使用客户端编译器运行,通过生成的本机代码比服务器编译器慢。