2

CitrixサーバーでEclipseRCPアプリの低速起動をデバッグしているときに、java.io.createTempFile(String、String、File)に5秒かかることがわかりました。これは、最初の実行時にのみ、特定のユーザーアカウントに対してのみ実行されます。具体的には、Citrixの匿名ユーザーアカウントに気づいています。他の多くの種類のアカウントを試したことはありませんが、この動作は管理者アカウントでは表示されません。

また、ユーザーが特定のディレクトリに書き込むためのアクセス権を持っているかどうかは関係ありません。ユーザーがアクセス権を持っていない場合、通話が失敗するまで5秒かかります。アクセス権がある場合、通話が成功するまでに5秒かかります。

これはWindows2003Server上にあります。Sunの1.6.0_16および1.6.0_19JREを試しましたが、同じ動作が見られます。

これが何らかの既知の問題であると少し期待してグーグルで検索しましたが、何も見つかりませんでした。他の誰かが以前にこれに遭遇しなければならなかったようです。

EclipseプラットフォームはFile.createTempFile()を使用してさまざまなディレクトリをテストし、初期化中に書き込み可能かどうかを確認します。この問題により、アプリケーションの起動時間が5秒長くなります。

私は誰かが以前にこれに遭遇したことがあり、いくつかの洞察を持っているかもしれないと想像します。これが私が実行したサンプルコードで、実際に時間を消費しているのはこの呼び出しであることを確認しています。また、createTempFileへの2回目の呼び出しで試してみたところ、後続の呼び出しがほぼ瞬時に返されることに気付きました。

public static void main(final String [] args)はIOException{をスローします
        最終ファイルディレクトリ=newFile(args [0]);
        最終的な長いstartTime=System.currentTimeMillis();
        ファイルfile=null;
        試す {
            file = File.createTempFile( "prefix"、 "suffix"、directory);
            System.out.println(file.getAbsolutePath());
        } ついに {
            System.out.println(System.currentTimeMillis()-startTime);
            if(file!= null){
                file.delete();
            }
        }
    }

このプログラムの出力例は次のとおりです。

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のシードが原因であり、ユーザーがゲストグループのメンバーである場合のみのようです。

SecureRandomシードの初期化では、Windows Crypto 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の専門家ではありませんが、次のような人物を知っています。

アカウントは、アプリケーションの読み取り/書き込みが非ローカルリソースにリダイレクトされるように設定できます。発生している遅延は、その解像度の初期化またはパフォーマンスに関連している可能性があります。

もう1つの可能性は、アプリケーションの分離が有効になっている可能性があることです。これは、仮想化されたバージョンのリソースでファイルの読み取り/書き込みが行われることを意味します。

于 2010-04-09T22:13:32.830 に答える