私は "CLR via C#"を読んでいましたが、この例では、最初に 'obj'に割り当てられたオブジェクトは、行1が実行された後ではなく、Javaのオブジェクト寿命
ローカル変数の有効期間は定義されているスコープではなく、前回の読み込み時に定義されているからです。
私の質問は、Javaはどうですか?私はそのような動作をチェックするためにこのプログラムを書いており、オブジェクトが生きているように見えます。私は、JVMがバイトコードを解釈している間に変数の生存期間を制限することはできないと考えているので、メソッドコンパイルを強制するために 'java -Xcomp'でプログラムを実行しようとしましたが、 'finalize'は呼び出されません。 Javaの場合はそうではないようですが、ここでより正確な答えを得ることができれば幸いです。また、AndroidのDalvik VMはどうですか?プロジェクトの目標は、 'リリース' である場合(タイマーをMSの.Netに一度だけ呼ばれる
public static void Main (string[] args)
{
var timer = new Timer(TimerCallback, null, 0, 1000); // call every second
Console.ReadLine();
}
public static void TimerCallback(Object o)
{
Console.WriteLine("Callback!");
GC.Collect();
}
TimerCallback:
class TestProgram {
public static void main(String[] args) {
TestProgram ref = new TestProgram();
System.gc();
}
@Override
protected void finalize() {
System.out.println("finalized");
}
}
追加されました: ジェフリー・リヒターは、 "C#を経由でCLR" にこのような何かをするコード例を示しますGC.Collect()呼び出し後に破棄され、ターゲットが 'デバッグ'の場合は1秒ごとに呼び出されます(プログラマーはデバッガでオブジェクトにアクセスできます)。しかし、あなたがそれをどのようにコンパイルしても、毎秒呼び出されるMonoコールバックで。 MonoのTimer実装は、スレッドプールのどこかのインスタンスへの参照を格納するように見えます。 MSの実装はこれをしません。
これは以前のJava仕様では見つかりませんでした。 .NETはあなたが予想していたよりもさらに狂っている可能性があることに注意してください。*インスタンスのメソッドが実行されている間*インスタンスが収集される可能性があります。 –