2012-01-27 6 views
0

ログレベルはINFOに設定されていますが、実行時に条件が満たされることはありませんが、 "Hi"が初期化されない場合、プログラムでどのように証明できますか?私が何を意味するか文字列が初期化された場合、どのようにプログラムで証明できますか?

if(log.isDebug()){ 
    log.debug("Hi"); 
} 

は私の懸念は、JREまたはJDKが/するかどうか、私は見つけることができるか、である、ログレベルがINFOであることから、ロガーが「こんにちは」のメッセージを印刷する機会を持っていないだろう、です条件を満たしていなくても「こんにちは」を準備するための一歩を踏み出すことはありません。

+0

文字列リテラル "Hi" –

+0

's == null'を意味しますか? –

+0

明確ではありません、 –

答えて

4

バイトコードをダンプします。文字列定数の "ldc"オペコードがあります。オペコードが最初に実行されるのは、実際のStringが作成されるときです。その後、文字列は定数プールにキャッシュされ、後続の呼び出し/反復で再利用されます。 "ldc"が実行されない場合、文字列は作成されません。

+0

こんにちはホットリックス、私はあなたの他のコメントを読んで、あなたが言及した部分を拡張してください "実際には、文字列の値は一般的に参照されていない限り作成されません。バイトコードには「ロード定数」オペコードがあり、定数を実行する最初の時間は定数プールとStringオブジェクトから抽出されます。 " –

+0

各クラスには定数プールがあります。プールの一部は.classファイルから取られた不変構造ですが、一部は動的に更新可能なテーブルです。ポインタのヌル?)を使用して定数がまだ作成されているかどうかを調べ、不変の構造体のUTF8値をUTF16に展開し、Stringを作成(およびインターン)するために使用します。 (少なくとも、これはクラスの特別な扱いがない場合、正規のJVMで動作する方法です。) –

0

このコードでは「初期化」する必要はありません。文字列リテラル "Hi"はコンパイラによって.classファイルに格納されるため、実際に使用されているかどうかに関係なく、実行時に使用できます。

+1

実際には、参照されない限り、String値は通常作成されません。バイトコードには「ロード定数」オペコードがあり、定数を実行する最初の時間は定数プールとStringオブジェクトから抽出されます。 –

+0

文字列はバイトコードに存在しますが、その値が実行時に使用されない場合はメモリにロードされません。私はあなたが "初期化されていない"と呼ぶことができると思います。 – Wyzard

3

リテラル文字列 "Hi"は、クラス定義の一部です。 コンパイラifの本体がデッドコードであり、リテラルが必要でないと判断できない場合、クラスローダがクラスをロードするときにリテラル値をロードします。コンパイル時定数であるため、自動的にインターンされます。

未知の実行環境にクラスがロードされたときに、コンパイラはlog.isDebug()の動作を知ることができません。ログレベルの設定値にかかわらず、isDebug()trueを返すように、ロガークラス定義が変更されることがあります。私は文字列リテラルを考える

0

「こんにちは」がヒープメモリに初期化される読み取り専用

あなたは、このような方法を行うと、メモリデルタを計算することができます。

if(log.isDebug()){ 
    log.debug("literal"); 

    log.debug(memoryUsed()); 
     log.debug("Hi"); 
    log.debug(memoryUsed()); 

    log.debug("initialising"); 

    log.debug(memoryUsed()); 
    string x = "Hi" 
    log.debug(x); 
    log.debug(memoryUsed()); 
    } 


    static long memoryUsed() 
     { 
     return runtime.totalMemory() - runtime.freeMemory(); 
     } 
+0

すべての文字列は "読み取り専用"で、不変です。 "Hi"については何も特別なものはありません。一度作成すると、定数プールの文字列以外のものは常にインターナショナルですが、インターンはユーザ作成の文字列のユーザアクションが必要です。 –

関連する問題