問題タブ [finalize]
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.
java - finilize メソッドがオブジェクトの参照をオブジェクト プロパティに設定するとどうなるか
クラスのインスタンスはA
ガベージコレクションされますか、それともメモリに永久に残りますか?
オブジェクトがガベージ コレクションの対象となり、そのfinalize()
メソッドが呼び出され、このメソッド内で実行のライブ スレッドによってオブジェクトにアクセスできるようになった場合、ガベージ コレクションは行われないことを私は知っています。
Can we switch off finalizers? に触発されました。
c# - Java と C# のファイナライザ
ジャワ
Java には、「 Finalizer Guardian 」と呼ばれるイディオムがあり、サブクラスがスーパークラスのファイナライザーをオーバーライドするのを防ぎますが、それを呼び出すのを忘れます。以下は、Effective Java Item7の例です。
この手法を使用すると、ファイナライザーを持つサブクラスがスーパークラスのファイナライザーを呼び出さなくても、プライベート オブジェクトはスーパークラスのファイナライズ コードを実行します。
C#
ただし、C# in a Nutshellのセクション「Calling Dispose from a Finalizer」には、次のような例があります。
また、著者は次のようにも述べています。
このフラグは 、ファイナライザーからの「最終手段モード」ではなく
disposing
、メソッドから「適切に」呼び出されていることを意味します。set toでDispose
呼び出された場合、このメソッドは通常、ファイナライザーを使用して他のオブジェクトを参照しないでください (そのようなオブジェクト自体がファイナライズされ、予測できない状態になる可能性があるため)。disposing
false
質問
しかし、Java のファイナライザー ガーディアンのイディオムを確認すると、内側のプライベート ガーディアン オブジェクトは、ファイナライザー自体を持つことができる外側のオブジェクトを実際に参照/ファイナライズします。これは、 C# の作成者が一言で言えば述べたことに違反しています。
「ファイナライザーで他のファイナライズ可能なオブジェクトを参照する」ことがJavaでは可能であるのにC#では不可能な理由に興味があります。回答ありがとうございます。
java - Object 型の finalize() メソッドが表示されませんか?
私が書いたクラスのメインメソッドで次のコードを試しました:
しかし、日食は私にそのヒントを与えてくれます
タイプ Object には保護されたファイナライズされたメソッドがあり、それ自体で表示されるはずなので、私はとても混乱していますか? とにかく私は間違っていますか?
search - Splunk - 現在のアクティビティを終了して削除する
監視ダッシュボードに Splunk community edition を使用しています。リアルタイム チャートのページを表示し、時々スクリプトを使用してブラウザを更新します。
これはすべてうまくいきますが、バックグラウンドで実行されているジョブをファイナライズして削除する方法を探しています。これは、コミュニティ エディションで表示できるライブ チャートの数に制限があり、ブラウザを更新すると実行されるように見えるためです。しばらくすると限界。
したがって、古いジョブのファイナライズと削除をどのようにスケジュールできますか? (おそらく、時々削除できるファイル)
java - オブジェクトがファイナライズされておらず、ファイナライザー スレッドが何もしていない
私たちのサーバーでは、OutOfMemoryError
. Eclipse メモリ分析を使用してヒープ ダンプを分析したところ、多くのオブジェクトがファイナライズのために保持されていることがわかりました (ヒープの約 2/3)。
finalize() メソッドのブロッキングである可能性があることがわかりました。この問題に関するいくつかのバグ レポート (ここまたはここ) を見つけましたが、常にファイナライザー スレッド スタックに現れ、どこかでブロックされていました。しかし、私たちの場合、このスレッドは待機していました:
編集:
次に、 を追加しようとしまし-XX:+UseConcMarkSweepGC
たが、成功せず、OutOfMemoryError
s の頻度のみが減少したため、最初はそれが役立つと考えました.
最後に、JVM のバグを疑い、OpenJDK 1.6.0_30 から Oracle JDK 1.7.0_51 にアップグレードしたところ、問題はなくなりました (少なくともそう思われます。過去 4 時間、使用されたヒープは増加しませんでした)。finalize メソッドの変更も、ライブラリのアップグレードも行っていません。その間、小さな開発が行われただけです。この問題は、本番サーバーが 32 ビットであるのに対し、64 ビット JVM であることを除いて同じ構成のテスト サーバーでは再現しません。
問題は、オブジェクトがファイナライズされず、Finalizer
スレッドが次のオブジェクトを待機している原因は何でしょうか? ヒープダンプを正しく分析しましたか?
すべての回答に感謝します。
java - finalize() メソッドを強制する方法はありますか
Java の finalize() メソッドと Garbage Collection について、以下の質問があります。
finalize() メソッドを強制する方法はありますか?
また、JDK から次のメソッドが非推奨になった理由は何ですか?Runtime.runFinalizersOnExit(true);
上記の質問に加えて、記事http://javarevisited.blogspot.com/2011/04/garbage-collection-in-java.htmlを読んでいました。この中で、ガベージ コレクターが呼び出される前に finalize() が呼び出されると著者が述べているポイント 5 を参照してください。それで、このことは確実に起こりますか?ガベージ コレクター メソッドの実行前に finalize() メソッドが常に呼び出されるということですか?
ヒープに大量のガベージがあるが、ガベージ コレクタが実行されていないとします。では、これは JVM の悪い動作または欠陥ではありませんか?
また、ガベージ コレクションが行われなかったためにアプリケーションのパフォーマンスがどのように低下するのでしょうか。