【问题标题】:JXMapKit/-Viewer extremely slow as webstartable - where to start digging?JXMapKit/-Viewer 与 webstartable 一样慢 - 从哪里开始挖掘?
【发布时间】:2013-04-09 14:31:56
【问题描述】:

刚刚尝试将一些 swingx-ws 组件添加到整个 swinglabs 演示中 - 并注意到与本地加载相比,一个简单的 JXMapKit/-Viewer 在加载 webstartable 中的图块时要慢几个数量级。

我不知道应该从哪里开始寻找(UI 更新似乎在 EDT 上,但可能需要仔细查看):

  • 还有其他人遇到不同的加载时间吗?
  • 猜猜可能是什么原因?
  • 如何调试 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.checkConnect(String, int) 中的热点,正如@Howard 已经指出的那样。
  • 一个相当奇怪的 EDT 阻塞似乎只有在 mapKit 用于 SingleFrameApplication(BSAF)时才会发生

要重现阻塞,运行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 <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)

即拖动鼠标会检查剪贴板访问权限...

【问题讨论】:

  • VisualVM 向我展示了 JavaWebStartSecurity.checkConnect(String, int)getHostByAddr(byte[]) 内部的一个极端热点。你能验证这种行为吗?
  • @Howard - 会检查的,谢谢
  • @Howard 已验证 - 不知道如何绕过它..
  • 您是否尝试过更改应用程序的安全权限:docs.oracle.com/javase/tutorial/deployment/doingMoreWithRIA/…
  • @NandorKracser 不,没有:SwingX 等必须在沙箱中运行。感谢您的指点(顺便说一句,参考给出了 404,可能是某个地方的错字?)如果允许请求权限,可能会有所帮助。

标签: java swing java-web-start jxmapkit


【解决方案1】:

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

【讨论】:

  • visualVM 在挖掘泥土方面真的很有帮助,希望我对这个指针有不止一个赞成 :-)
猜你喜欢
  • 2011-11-24
  • 2011-11-16
  • 2013-04-06
  • 2016-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多