0
import org.joda.time.LocalDate;

public class Test {
    public static void main(String[] args) {
        long time=System.currentTimeMillis();
        new LocalDate(2000,1, 1);
        System.out.println(System.currentTimeMillis()-time);
        time=System.currentTimeMillis();
        new LocalDate(2000,1, 1);
        System.out.println(System.currentTimeMillis()-time);
    }
}

新しい LocalDate の最初の呼び出しには 110 ミリ秒かかります。2 番目の呼び出しには 0 ミリ秒かかります。

まず、特定のクラスのすべての静的初期化子を実行するにはどうすればよいですか? 次に、アプリケーションが事前に参照するすべてのクラスに対してこれを行う方法はありますか?

私のアプリケーションはレイテンシーに非常に敏感です。

4

3 に答える 3

2

これが Java と JVM の仕組みです。最適に実行するには、常にウォームアップが必要です。できればデータを破壊しない方法で、アプリケーションのすべての部分を実行するいくつかの統合テストを作成する必要があります。次に、アプリケーションをデプロイするたびに、それらをアプリケーションに対して実行します。これにより、アプリケーションが機能していることを安心させるというボーナスが得られます.

于 2012-07-03T08:46:45.893 に答える
2

ロードされたクラスのリストを取得して、-XX:+TraceClassLoadingこれをファイルに保存できます。次に Class.forName() を使用して、これらすべてのクラスがロードされたことを確認できます。

これにより、すべてのクラスがロードされ、それらの静的ブロックが確実にロードされます。

ただし、レイテンシーに敏感なコードの場合は、ウォームアップしてコンパイルされていることを確認する必要があります (つまり、コンパイルをトリガーするのに十分な回数呼び出します)。これにより、レイテンシーをさらに 10 分の 1 またはそれ以上減らすことができます。


あなたが実行する場合

public class CallStatic {
    public static void main(String... args) throws ClassNotFoundException {
        Class.forName("Static");
    }
}

class Static {
    static {
        System.out.println("static block run");
    }
}

版画

static block run

インスタンスを作成しようとしても、クラスはそれ以上ロードされません。デフォルトのコンストラクターがある場合はそれをロードする場合がありますが、それが必要な場合にのみ役立ちます。

于 2012-07-03T09:15:44.500 に答える
0

静的初期化の問題のようです。やってみる

Class.forName("org.joda.time.LocalDate");

あなたの電話の前に。これにより、タイミングが減少します。おそらく、関連する他のクラスを強制的にロードする必要があります。問題が動的初期化である場合、これは役に立ちません。

于 2012-07-03T08:41:26.837 に答える