問題タブ [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.
java - Java: 参照オブジェクトの API ドキュメントに必要な説明
Java の参照オブジェクトの要点と、ソフト参照オブジェクト、ウィーク参照オブジェクト、およびファントム参照オブジェクトの基本的な違いを理解しました。
ただし、APIドキュメントから次の点を完全には理解していません
WeakReference<T>の API ドキュメントから:
「参照先がfinalizable、finalized、およびreclaimedになることを妨げない弱い参照オブジェクト。」
現在、太字の用語は API ドキュメントのどこにも説明されていないため、特に多かれ少なかれ廃止された
Object.finalize()
メソッドのファイナライズの概念に関連して、それらが正確に何を意味するのか疑問に思います。Reference<T>の API ドキュメントから:
public void clear()
: "このメソッドはJava コードによってのみ呼び出されます。ガベージ コレクターが参照をクリアするときは、このメソッドを呼び出さずに直接実行します。"public boolean enqueue()
: "このメソッドはJava コードによってのみ呼び出されます。ガベージ コレクターが参照をエンキューするときは、このメソッドを呼び出さずに直接実行します。"繰り返しますが、上記の 2 つの引用符の「Java コード」が何を意味するのかわかりません: The JVM internal code which I have no access? または、読み取り専用/閲覧アクセス権を持つ JDK コードですか? それとも、エンドユーザー自身の Java コードですか?
「このメソッドを呼び出さずに直接」の部分は、JVM がこれらのメソッドを呼び出す必要がないことを示しています。一方、「Java コードのみ」の部分は、それがエンド ユーザーの Java コードではなく、JVM のものであることを示しています (エンド ユーザー コードを意味する場合、このフレーズは、すべての Java クラスのほぼすべてのメソッドの API ドキュメント!)。では、どの解釈が正しく、誰がこの関数を呼び出すことができるのでしょうか?
java - Java ファイナライズ キューとメモリ リーク
ファイナライズを待っているすべてのオブジェクトのリストを取得するにはどうすればよいですか?、手動でファイナライズできるようにします。
現在、ファイナライズを待っているすべてのオブジェクトを取得するための直接的な方法を取得できませんでした。
java - PhantomReferences を使用したファイナライズ中にリフレクションを使用しないようにしますか?
Closable を実装するクラス MyClass を作成したとしましょう。したがって、close() メソッドでは、いくつかの非常に重要なリソースを解放します。非常に重要なリソースであるため、ある種の安全ネットワークを作成しました (Effective Java で推奨されているように)。ここにあります:
最初はとても嬉しかったのですが、後でファイナライザーはそれほどクールではなく、PhantomReference のようなクールなツールがあることを知りました。そこで、finalize() メソッドの代わりに PhantomReference を使用するようにコードを変更することにしました。PhantomRefernce を拡張した CustomPantom を作成しました。ここにあります:
したがって、オブジェクトへの参照を取得できる唯一の方法は、リフレクションを使用して、Reference クラスにある参照対象フィールドから if を取得することです。これは、クリーンアップ メソッドから MyClass.close() を呼び出す唯一の方法ですか?
PSここにすべてのコードを投稿したわけではありませんが、テストしたところすべて正常に動作します。ReferenceQueue は PhantomReferences で満たされているので、それらを 1 つずつ取得してクリーンアップ メソッドを呼び出すことができます。しかし、リフレクションを使用せずに上記の問題を解決する方法がわかりません。
c++ - C++ : 派生クラス オブジェクトのファイナライズの順序
クラスオブジェクトのファイナライズの順序は次のとおりです。
- デストラクタの実行本体
- オブジェクトを破棄します (つまり、データ メンバーに使用されるメモリの割り当てを解除します)。
ここで、派生クラス オブジェクトのファイナライズの順序について尋ねられました。まったく同じだと思いますが、上記の手順を実行した後に、基底クラスのオブジェクトのデストラクタも呼び出されますか?
そうは思いませんが、試験に確実に合格したかったのです。
ご協力いただきありがとうございます :)
java - ファイナライズ可能なオブジェクトの初期費用はいくらですか?
Java でのファイナライズ可能なオブジェクトに関する議論では、通常、ファイナライズ可能なオブジェクト (およびそれらに関連するリソース) を迅速にガベージ コレクションできない場合に発生する一般的な間接コストについて説明します。
現時点では、ファイナライズ可能であることの実際の直接コストが、メモリとオブジェクトの割り当て時間の両方でどのくらいかということにもっと興味があります。このようなコストの存在について、さまざまな場所で斜めに言及しているのを見てきました。たとえば、ファイナライズ メモリ保持の問題に関する Oracle の記事では、
が
obj
割り当てられると、JVMobj
はファイナライズ可能であることを内部的に記録します。これにより、通常、最新の JVM が持つ高速な割り当てパスが遅くなります。
JVM は、オブジェクト インスタンスがファイナライズ可能であることをどのように記録しますか? また、そのためにメモリとパフォーマンスのコストはどのくらいかかりますか?
私の特定のアプリケーションに興味がある人のために:
私たちは何百万もの信じられないほど軽量なオブジェクトを生成して保持しています。これらのオブジェクトに単一のポインターを追加するのは非常にコストがかかるため、フィールドのビットのサブセットにパックされた小さな数値 ID を使用する代わりに、オブジェクトからポインターを削除するためにかなりの作業を行いました。数値をアンパックすると、その ID を持つ共有の不変プロパティを、Map を使用してそれらを格納する Pool から取得できます。
残りの問題は、使用されなくなったプロパティ値のガベージ コレクションをどのように処理するかです。
検討されている戦略の 1 つは、参照カウントを使用することです。オブジェクトが作成され、プールされた値の ID を取得すると、その値の参照カウントがインクリメントされます。使用されなくなったら、デクリメントする必要があります。
このデクリメントを確実に行うためのオプションの 1 つは、次の finalize メソッドを追加することです。
ただし、ファイナライズ可能であるという行為そのものが、オブジェクトへの追加のポインターを保持する必要があることを意味する場合、このアプリケーションでは、ファイナライズ可能であるための初期コストが高くなると見なされます。追加のオブジェクトを割り当てる必要があることを意味する場合、ほぼ確実に高すぎます...したがって、私の質問:ファイナライズ可能にするための直接の先行コストはいくらですか?
python - PyQt5 と Python インタープリターの初期化/ファイナライズ
Python マクロを使用して拡張できるアプリケーションがあります。Python はあまり使用されないため、すべてのマクロについて、Python インタープリターを初期化し、マクロを実行し、インタープリターをファイナライズします。
PyQt5 を除いて、すべて正常に動作します。最初のマクロが終了すると、すべてのクラスが PyQt5 モジュールから消えます。これは、ファイナライズ時に静的変数と PyObject が破棄されるという問題だと思います。しかし、Python インタープリターを決して強制終了しない以外に何かすることはありますか?
これが私のマクロのコードです:
最初の実行ではダイアログ ボックスが表示されますが、他の実行では次のエラーが表示されます。
編集:おそらくこれを確認する別の方法は、ライブラリimport_array
を初期化するために呼び出す必要があるのと同じ方法で、PyQt5 のすべてのクラスを明示的にインスタンス化する方法はありますか?numpy
c# - GCファイナライズリストにすべてのオブジェクトをリストする方法は?
プログラムでクラッシュが発生しました。これは VS のビジュアライザーであるため、デバッグが非常に困難です。ダンプを作成し、WinDbg を使用して調査しようとしましたが、失敗しました。
そのため、プログラムでそのリストに手を入れようとしていますが、方法がわかりません。ありがとう。