Java JXMapKit/-Viewer与webstartable一样非常慢-从哪里开始挖掘?

Java JXMapKit/-Viewer与webstartable一样非常慢-从哪里开始挖掘?,java,swing,java-web-start,jxmapkit,Java,Swing,Java Web Start,Jxmapkit,只是尝试将一些swingx ws组件添加到整个swinglabs演示中,并注意到一个简单的JXMapKit/-Viewer在中加载互动程序比在本地加载要慢几个数量级 我不知道应该从哪里开始查找(ui更新似乎在EDT上,但可能需要仔细查看): 还有谁经历过不同的加载时间吗 猜猜原因是什么 如何调试webstartable 代码相当简单(要在本地运行,您需要: 编辑: 似乎它在某种程度上与web上下文中的权限检查有关:分析表明整个连接调用堆栈是不同的(不太令人惊讶),而且需要很长时间。现在放弃

只是尝试将一些swingx ws组件添加到整个swinglabs演示中,并注意到一个简单的JXMapKit/-Viewer在中加载互动程序比在本地加载要慢几个数量级

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

  • 还有谁经历过不同的加载时间吗
  • 猜猜原因是什么
  • 如何调试webstartable
代码相当简单(要在本地运行,您需要:

编辑

似乎它在某种程度上与web上下文中的权限检查有关:分析表明整个连接调用堆栈是不同的(不太令人惊讶),而且需要很长时间。现在放弃

编辑2

似乎有两个不同的问题

  • 打开连接以加载安全受限上下文中的tile所需的时间稍长,这是JavaWebStartSecurity.checkConnect(String,int)中的热点,正如@Howard已经指出的那样
  • 一个相当奇怪的EDT阻塞,似乎只有在(BSAF的)单帧应用程序中使用mapKit时才会发生
要复制阻塞,请运行,等待贴图可见(这是第一个问题,需要一些时间),然后使用鼠标快速上下移动缩放拇指: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)
“AWT-EventQueue-0”优先级=6 tid=0x063d3000 nid=0x1468等待监视器条目[0x05efe000]
java.lang.Thread.State:阻塞(在对象监视器上)
位于java.security.Permissions.implies(未知源)
-等待锁定(java.security.Permissions)
位于sun.security.provider.PolicyFile.implies(未知源)
位于java.security.ProtectionDomain.implies(未知源)
位于java.security.AccessControlContext.checkPermission(未知源)
位于java.security.AccessController.checkPermission(未知源)
位于java.lang.SecurityManager.checkPermission(未知源)
位于java.lang.SecurityManager.checkSystemClipboardAccess(未知源)
位于java.awt.event.InputEvent.canAccessSystemClipboard(未知源)
位于java.awt.event.InputEvent。(未知源)
位于java.awt.event.MouseEvent。(未知源)
位于java.awt.LightweightDispatcher.RetargetMouseeEvent(未知源)
位于java.awt.LightweightDispatcher.ProcessMouseeEvent(未知源)
位于java.awt.LightweightDispatcher.dispatchEvent(未知源)
位于java.awt.Container.dispatchEventImpl(未知源)
位于java.awt.Window.dispatchEventImpl(未知源)
位于java.awt.Component.dispatchEvent(未知源)
位于java.awt.EventQueue.dispatchEventImpl(未知源)
位于java.awt.EventQueue.access$200(未知源)
在java.awt.EventQueue$3.run处(未知源)
在java.awt.EventQueue$3.run处(未知源)
位于java.security.AccessController.doPrivileged(本机方法)
位于java.security.ProtectionDomain$1.doIntersectionPrivilege(未知源)
位于java.security.ProtectionDomain$1.doIntersectionPrivilege(未知源)
在java.awt.EventQueue$4.run处(未知源)
在java.awt.EventQueue$4.run处(未知源)
位于java.security.AccessController.doPrivileged(本机方法)
位于java.security.ProtectionDomain$1.doIntersectionPrivilege(未知源)

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

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

VisualVM向我展示了
JavaWebStartSecurity.checkConn中的一个极端热点ect(String,int)
和那里的
getHostByAddr(byte[])
。你能验证这个行为吗?@Howard-会检查,thanks@Howard已验证-不知道如何绕过它..您是否尝试更改应用程序的安全权限:?@Nandorkraser否,没有:SwingX等必须在沙箱中运行。感谢您的指示(顺便说一句,参考给出了一个404,可能是某个地方的输入错误?)如果允许请求权限,可能会有所帮助。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)