2

在 Citrix 服务器上调试 Eclipse RCP 应用程序的缓慢启动时,我发现 java.io.createTempFile(String,String,File) 需要 5 秒。它仅在第一次执行时执行此操作,并且仅针对某些用户帐户。具体来说,我注意到它是 Citrix 匿名用户帐户。我没有尝试过很多其他类型的帐户,但是管理员帐户不会出现这种行为。

此外,用户是否有权写入给定目录也没有关系。如果用户没有访问权限,调用将需要 5 秒才能失败。如果他们确实有权访问,则调用需要 5 秒才能成功。

这是在 Windows 2003 服务器上。我尝试过 Sun 的 1.6.0_16 和 1.6.0_19 JRE 并看到相同的行为。

我用谷歌搜索了一下,以为这是某种已知问题,但没有找到任何东西。似乎其他人以前必须遇到过这种情况。

Eclipse 平台使用 File.createTempFile() 来测试各种目录以查看它们在初始化期间是否可写,这个问题使我们的应用程序的启动时间增加了 5 秒。

我想有人以前遇到过这种情况并且可能有一些见识。这是我执行的示例代码,以查看确实是这个调用在消耗时间。我还尝试了第二次调用 createTempFile 并注意到后续调用几乎立即返回。

public static void main(final String[] args) 抛出 IOException {
        最终文件目录 = new File(args[0]);
        最终长 startTime = System.currentTimeMillis();
        文件文件=空;
        尝试 {
            file = File.createTempFile("前缀", "后缀", 目录);
            System.out.println(file.getAbsolutePath());
        } 最后 {
            System.out.println(System.currentTimeMillis() - startTime);
            如果(文件!= null){
                文件.删除();
            }
        }
    }

该程序的示例输出如下:

C:\>java.exe -jar filetest.jar C:/Temp
C:\Temp\prefix8098550723198856667suffix
5093
4

3 回答 3

3

可能是导致问题的安全随机数生成器的初始化。特别是如果无法从操作系统获得安全随机种子,则回退机制会尝试获取熵。IIRC,它做的一件事是列出临时文件,所以如果你有大量的那些将无助于启动性能。

于 2010-04-09T15:49:14.447 回答
1

看起来缓慢是由于 SecureRandom 的播种,并且仅当用户是 Guest 组的成员时。

SecureRandom 种子初始化使用 Windows Crypto API,当用户是访客时,该 API 会失败,如此处所述 [1]。通过将系统属性“java.security.debug”设置为“all”,当程序作为来宾运行时,我可以看到以下内容:

ProviderConfig:加载的提供者 SUN 版本 1.6
提供者:无法使用操作系统种子生成器:java.io.IOException:所需的本机 CryptoAPI 功能在此机器上不可用
提供者:使用默认的线程种子生成器

以非访客用户身份运行时,输出如下:

ProviderConfig:加载的提供者 SUN 版本 1.6
提供者:使用操作系统种子生成器

看来默认的线程种子生成器很慢。这里 [2] 是向 Sun 记录的关于此问题的一个非常古老的错误。

[1] http://www.derkeiler.com/Newsgroups/microsoft.public.platformsdk.security/2003-12/0349.html

[2] http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4210047

于 2010-04-21T18:09:47.487 回答
0

我不是 Citrix 专家,但我认识一个专家,他猜想:

可以设置帐户,以便将应用程序读取/写入重定向到非本地资源。您遇到的延迟可能与该分辨率的初始化或性能有关。

另一种可能性是应用程序隔离可能生效,这意味着文件读/写发生在资源的虚拟化版本上。

于 2010-04-09T22:13:32.830 回答