java - 为什么在 Citrix 上首次调用 java.io.File.createTempFile(String,String,File) 需要 5 秒?

标签 java eclipse eclipse-rcp citrix

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

此外,用户是否有权写入给定目录并不重要。如果用户无权访问,则调用将在 5 秒后失败。如果他们确实有访问权限,则调用需要 5 秒才能成功。

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

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

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

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

public static void main(final String[] args) throws IOException {
        final File directory = new File(args[0]);
        final long startTime = System.currentTimeMillis();
        File file = null;
        try {
            file = File.createTempFile("prefix", "suffix", directory);
            System.out.println(file.getAbsolutePath());
        } finally {
            System.out.println(System.currentTimeMillis() - startTime);
            if (file != null) {
                file.delete();
            }
        }
    }

该程序的示例输出如下:

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

最佳答案

这可能是安全随机数生成器的初始化导致了问题。特别是,如果无法从操作系统获得安全随机种子,则后备机制会尝试获得熵。 IIRC,它所做的事情之一就是列出临时文件,所以如果你有大量临时文件,对启动性能没有帮助。

关于java - 为什么在 Citrix 上首次调用 java.io.File.createTempFile(String,String,File) 需要 5 秒?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2608763/

相关文章:

java - Spring MVC Controller : private shared methods.按值传递和线程安全

java - Eclipse(2019-09) 在 windows docker 中运行 SWTBot 测试时崩溃

eclipse - 收集要安装的项目时发生错误(访问被拒绝)

java - Eclipse 插件如何以编程方式传递 Java VM 参数

Java:需要按 Enter 才能触发操作和操作监听器

java - 循环访问条目集合时的性能

java - 区分插入和更新

java - 是否可以使用 ant 自动创建 inno 安装包?

swt - Elapsed time 列 - 如何只刷新 StructuredViewer 的一部分

java - 在表 SWT/RCP 中移动项目