問題タブ [finalization]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
0 に答える
130 参照

java - finalize() メソッドが実行中に中断しますか?

質問

私はURLClassLoader匿名のクラスを持っています。その中で、メソッドをオーバーライドして、finalize()ガベージ コレクション時にオブジェクトが自動的に閉じられるようにしました。

メソッドをオーバーライドして、close()いくつかの情報を出力しました。

このオブジェクトを作成した直後に、System.gc()それを破棄するために呼び出します。予想どおり、finalize()メソッドが呼び出され、次にメソッドが呼び出されますが、コンソールに出力されるclose()だけです。Closing...

実行が 2 番目の print ステートメントに到達しないのはなぜですか?


ノート

私が最初に疑ったのは、それsuper.close()が例外をスローしていたことであり、ガベージ コレクション用にオブジェクトを準備するものは何でも例外を飲み込んでいたので、いずれかをキャッチして出力しようThrowableとしました。

しかし、以前とまったく同じ出力が得られました: Closing.... 次に、クラス ローダーを手動で閉じた場合にどうなるかをテストしたので.close()、System.gc(); を実行する代わりに、作成直後にクラス ローダーを呼び出しました。この場合、両方の印刷ステートメントが実行されました。

0 投票する
1 に答える
58 参照

c# - ファイナライズ キューが多くのメモリを使用しているときに GC が実行されないのはなぜですか?

私は GC とファイナライズについて学習し始めています。アプリケーションの動作が私にとってまったく予想外である、非常に単純な例に出くわしました。

(注: ファイナライザーは管理されていないリソースでのみ使用し、使い捨てパターンを使用する必要があることを認識しています。ここで何が起こっているのかを理解したいだけです。)

これは、「ノコギリ」パターンのメモリを生成するシンプルなコンソール アプリです。メモリは約 90MB まで上昇してから GC を実行し、低下してから再び上昇し始め、90MB を超えることはありません。

ファイナライザーでコメントを削除すると、動作が大きく異なります。アプリケーションは開始時に 1 つまたは 2 つの GC を実行しますが、メモリは 1 GB を超えるメモリを使用するまで直線的に増加します (その時点でアプリケーションを終了します)。 )

私が読んだことから、これはアイテムを解放する代わりに、GC がオブジェクトをファイナライズ キューに移動するためです。GC はスレッドを開始してファイナライザー メソッドを実行し、別の GC がファイナライズされたオブジェクトを削除するのを待ちます。これは、ファイナライザー メソッドの実行時間が非常に長い場合に問題になる可能性がありますが、ここではそうではありません。

数回の反復ごとに GC.Collect() の実行を手動でトリガーすると、アプリは期待どおりに動作し、メモリの鋸歯状のパターンが解放されます。

私の質問は、アプリケーションによって使用されている大量のメモリが GC を自動的にトリガーしないのはなぜですか? ファイナライザーが含まれている例では、GC が最初に実行された後に再度実行されることはありますか?

0 投票する
1 に答える
53 参照

oop - デストラクタの定義を強制する方法

Fortran >= 2008 で継承クラスに強制的にデストラクタを定義させたいと考えています。

これまでのところ、次のいくつかのバリエーションを試しました。

コンパイルさえしません。どうすればその目標を達成できますか?