問題タブ [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.

0 投票する
4 に答える
741 参照

java - Java ファイナライザー ガーディアンが機能していないように見えますか?

finalize() メソッドを持つテレスコープ コンストラクターを持つスーパー クラスがあります。サブクラスが super.finalize の呼び出しを忘れるのを防ぐために、ファイナライザー ガーディアン (EJ Item 7 ) をそのように記述しました。

これがサンプルのサブクラスです --

s1 オブジェクトがスコープ外になると、ファイナライザー ガーディアンの finalize() が呼び出され、サブクラスの finalize メソッドから SYSO を取得しますが、スーパーの finalize から SYSO を取得することはありません。

よくわかりません。私は何か根本的に誤解していますか?

免責事項:ファイナライザーは危険であり、お勧めできないことなどを認識しています。ここで問題を理解しようとしています。

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

java - Java のファイナライズ キュー

クラスにfinalize()メソッドがある場合にのみ、そのオブジェクトに到達できない場合にのみ、ファイナライズ キューに追加されるということですか? 理由は、私がこのリンクを通過していて、サブクラス化時にメモリ保持の問題を回避 するカテゴリで、呼び出されるまでガベージ コレクションに大きな配列を使用できないと言っているからfinalize()です。しかし、私のポイントは、finalize()メソッドを記述しなくても、ファイナライズ キューでオブジェクトがデキューされるのを待たなければならないということです。

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

android - Android MediaScanner finalize()

Gingerbread 2.3.4では、SDカードのアンマウントに失敗することがあります。ログを確認したところ、メディアサーバーはまだsdcard内のいくつかのファイルにアクセスしており、voldがメディアサーバーでSIGKILLをスローした場合でも、メディアサーバーはゾンビプロセスに変わり、アンマウント操作は失敗します。

失敗の原因は、MediaScannerがSDカード内のファイルへの参照を保持しているオブジェクトへの参照をまだ保持していることだと思います。MediaScannerは、メディアファイルからアルバムアートを抽出するためにMediaProviderで使用されます。ただし、アルバムアートの抽出操作がすでに終了している場合でも、MediaScannerはガベージコレクタによってリリースされません。そして、この状態でアンマウント操作を行うと、必ずアンマウント操作が失敗します。SDカードをアンマウントする前にMediaScannerがリリースされても失敗しません。

私が行ったことは、 MediaScannerクラスにrelease()関数を追加したことです。この関数は、アルバムアートの抽出が完了すると、 MediaProviderによって呼び出されます。release()関数内で、native_finalize()を呼び出します。変更後、SDカードを正常にアンマウントできます。

MediaScannerの元のソースコードでは、MediaScannerによって参照されるオブジェクトはfinalize()関数内で解放されます。

あなたの誰かが私の同じ問題を経験しましたか?私が上で述べたこと以外に他の回避策はありますか?

フィードバックをいただければ幸いです。

よろしく、
artsylar

0 投票する
3 に答える
178 参照

java - オブジェクトの保証されたファイナライズ動作を実装する方法

Java言語で保証されたfinalize()に似た動作をオブジェクトに実装したいと思います。ガベージコレクションが発生する直前にいくつかのステートメントを実行したい。ここではfinallyブロックは役に立たないことに注意してください。finallyはtryブロックの直後に実行されるため、これは私の要件ではありません。基本的に、JVMのヒープからアンロードされる直前にオブジェクトをシリアル化したいです。お知らせ下さい。

0 投票する
2 に答える
664 参照

python - IronPython - sys.exit() での適切なリソースの解放

sys.exit() が呼び出されたときに Python スクリプトを適切にファイナライズする最良の方法は何ですか?

たとえば、私は次のようなアプリを持っています: - ログファイルを開いた - USB ガジェットを開いた - アプリを閉じる時が来たと判断した - sys.exit(-1) を呼び出す - (または、厳しい例外をスローする - しかし、私は最初の方法を好む少し豚だったし、コードの一部の部分は実際にすべての例外をキャッチし、終了例外を停止します...)

次に、インタープリターを終了する前に確実に呼び出される finalize() 関数が必要になります。Finalize() は、まさにこの順序で USB ガジェットを解放し、ログ ファイルを閉じます。

def delを試しましたが、sys.exit で呼び出されず、さらに _ del _s が呼び出される順序を決定できません。

私に何か救いはありますか?または、私がしなければならないことはありますか?

0 投票する
2 に答える
2070 参照

java - クラスローダーがリリースされたときにシングルトンでファイナライズが呼び出されるのはいつですか?

「リリースされた」とは、クラスローダーへの参照が残っていないことを意味します。

頻繁に再デプロイされる Java EE アプリケーションが permgen スペースを消費するという問題が発生しています。分析の結果、Java EE アプリのシングルトンがアプリケーションの外部のアプリケーション クラスローダー オブジェクトへの参照を渡し (Java EE 規則に違反して)、アプリのアンデプロイ時にそれらをクリアしていないことがわかりました。

シングルトンまたはクラス オブジェクトへの参照が他に残っていないと仮定すると、そのクラスのクラスローダーが解放されたときにシングルトンの finalize() が呼び出されますか? そこの不正なインバウンド参照をクリアしたいと思います。または、クラスローダー自体がガベージコレクションされるまでファイナライズが呼び出されないcatch-22にいますか?したがって、不正な外部参照のために呼び出されることはありませんか?

ここでの主な質問はおそらく次のとおりです。

この場合、クラスローダーがまだガベージコレクションできない場合、クラスオブジェクトはガベージコレクションされますか? これは、クラスローダの動作の仕様に依存するか、実装に依存する可能性があります。

参照 (別の種類! ;-)) は歓迎されますが、必須ではありません。

0 投票する
3 に答える
1735 参照

java - この単体テストでfinalize関数が呼び出されないのはなぜですか?

オブジェクトに対するファイナライザーの呼び出しの影響をテストするJava単体テストを作成しようとしています。

ファイナライザーが確実に呼び出されるようにするために、stackoverflowの他の場所で見たWeakReferenceメソッドを使用しています。

私の問題は、このテストでは、WeakReferenceが1回の反復でヌルになったとしても、TestFinalizerのfinalizeメソッドが呼び出されないことです。

0 投票する
3 に答える
2483 参照

java - Javaでfinalize()はどのように機能しますか?

それで、私は最近 Java で finalize メソッドを発見しました (以前に見逃した理由はわかりませんが、あります)。これは、私が取り組んでいる多くの問題に対する答えのように思えますが、最初にもう少し情報を得たいと思っていました.

オンラインで、ガベージ コレクションとファイナライズのプロセスを示す次の図を見つけました。

これは、ファイナライズと JGC を含む操作の順序を示しています。

いくつかの質問:

  1. これは別のスレッドで行われますよね?
  2. ファイナライズ中に新しいオブジェクトをインスタンス化するとどうなりますか? それは許されますか?
  3. finalize から静的メソッドを呼び出すとどうなりますか?
  4. finalize 内からオブジェクトへの新しい参照を確立するとどうなりますか?

興味を持った理由を説明する必要があると思います。私は LWJGL を頻繁に使用していますが、ファイナライズを使用して Java オブジェクトに OpenGL リソースを自動的にクリーンアップさせることができれば、API に関して非常に優れたことができるように思えます。

0 投票する
8 に答える
24366 参照

java - javaのSystem.gc()メソッドとfinalize()メソッドの違いは何ですか?

java の system.gc() メソッドと finalize() メソッドの間で混乱しています。ガベージ オブジェクトを強制的に JVM に収集することはできません。Java コードに両方のメソッドを記述することが許可されている場合、両方がガベージ コレクションに使用される場合、Java によるガベージ コレクションに 2 つのメソッドを提供する意味は何ですか?

両方のメソッドの正確な動作と、内部でどのように動作するか教えてください。