問題タブ [finalizer]
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.
c# - ファイナライザーをユニットテストするにはどうすればよいですか?
私は次のクラスを持っています。これはオブジェクトのデコレータですIDisposable
(追加するものは省略しています)。これ自体IDisposable
が共通のパターンを使用して実装します。
が呼び出さinnerDisposable
れたときに破棄されるものを簡単にテストできます。Dispose()
しかし、ファイナライザーによって破棄されないことinnerDisposable
を確認するためのテストを作成するにはどうすればよいですか?このようなものを書きたいのですが、おそらくファイナライザーがGCスレッドによって呼び出されていないために失敗します。
java - JVM でのファイナライザーのパフォーマンスへの影響
この投稿によると、.Netでは、
ファイナライザーは実際にはそれよりもさらに悪いです。それらは遅く実行されることに加えて (実際、多くの種類のリソースにとって深刻な問題です)、デストラクタで許可されている操作のサブセットしか実行できないため、それほど強力ではありません (たとえば、ファイナライザは他のオブジェクトを確実に使用できませんが、デストラクタは可能です)、そのサブセット ファイナライザを記述する場合でも、正しく記述することは非常に困難です。また、ファイナライズ可能なオブジェクトの収集にはコストがかかります。各ファイナライズ可能なオブジェクトと、そこから到達可能なオブジェクトの潜在的に巨大なグラフは、次の GC 世代に昇格されます。
これは一般的な JVM にも当てはまり、特に HotSpot にも当てはまりますか?
.net - MySQLはFinalizeでNullReferenceExceptionをスローします...これにどのように対処していますか?
64ビットWindowsで.Netコネクタを使用してMySQLを使用しています。何らかの理由で、MysqlはFinalizeでNullReferenceExceptionをスローしています。これはここでの問題であり、ここで説明されているバグが原因のようです。このバグは6.22で報告されましたが、6.23でも問題が発生しているため、修正されていないようです。
ヘルパークラスと、接続とMysqlcommandオブジェクトをインスタンス化することの両方でMySQLを使用しています。
この問題を修正するためにコードのどの部分を変更する必要があるか、誰かが知っていますか?これはMysqlのバグですが、他のプロジェクトでは問題が発生しないため、これは普遍的ではありません。MySQLのバグレポートには、それを再現する方法についての詳細もありません。
助言がありますか?
java - finalize()中に例外がスローされた場合はどうなりますか
finalize()の実行中に例外がスローされた場合はどうなりますか?スタックは通常のように巻き戻されますか?finalize()を続行し、例外を無視しますか?finalize()を停止し、オブジェクトのGCを続行しますか?または、他の何か?
finalize()の使用に関するガイドラインを探しているわけではありません。それを説明するページがたくさんあります。
java - java: wait()、notify() および同期ブロック
オブジェクトのwait()
メソッドを呼び出すと、オブジェクト モニターがあれば解放されることを学びました。
notify()
しかし、別のスレッドによるこのオブジェクトの呼び出しに関していくつか質問があります。
その間、別の(3番目の)スレッドがオブジェクトモニターを所有している場合、待機中のスレッドは(いつ)ウェイクアップしますか?
wait()
このオブジェクトで3 番目のスレッドが呼び出された場合、待機中のスレッドは起動しますか?スレッドが特定のオブジェクトへの通知を待機しているかどうかを判断することは可能ですか (Java 1.4/Java 5)
メソッド
wait()
で が呼び出されるとどうなりますか?finalize()
java - JRubyClassLoaderがリリースされない
Springベースのバックエンドを備えたTomcat6.0.28で小さなJRubyonRailsアプリを実行しています。JRubyClassLoader
Eclipseメモリ分析ツールを使用してしばらく時間を過ごしましたが、インスタンスがリークしていることは間違いありません。単一のJRubyランタイムのみを使用するようにWebアプリをセットアップしてからtouching
、戦争によってTomcatへのホットデプロイを効果的に実行しました。それを数回行った後、私はJRubyClassLoader
座っているいくつかの例を見ることができます。
クラスローダーが解放されていないため、ロードされたクラスが解放されておらず、PermGenスペースが不足しています。
Eclipse Memory Analysisを使用すると、GCルートへのパスが次のようになっていることがわかります。
そして、リストはnext java.lang.ref.Finalizer
一見永遠に続きます...実際のGCルートを見つけることができないように見えるところまで。
Leak Suspectsレポートを実行する場合、#1の容疑者は「<systemclassloader>」によってロードされた「java.lang.ref.Finalizer」です。
ファイナライザーが固執している理由はありますか?
編集
関連する可能性のある補足として、ホットデプロイを実行するたびに、次のようになりNullPointerExceptions
ます。
編集2
JRuby 1.5.1にアップグレードしましたが、同じ問題が引き続き発生します。
c# - 管理対象のものにアクセスするファイナライザー
ファイナライザーは通常、管理されていないリソースを制御するために使用されることを私はよく知っています。ファイナライザーはどのような状況で管理対象のものを処理できますか?
私の理解では、ファイナライザキューに存在すると、オブジェクトまたはそれによって強く参照されるオブジェクトが収集されなくなりますが、(もちろん)ファイナライズからそれらを保護することはできません。通常のイベントでは、オブジェクトがファイナライズされると、そのオブジェクトはキューから削除され、参照するオブジェクトは次のGCパスで収集から保護されなくなります。ファイナライザーが呼び出されるまでに、オブジェクトによって参照されるオブジェクトの任意の組み合わせに対してファイナライザーが呼び出されている可能性があります。ファイナライザーが特定の順序で呼び出されることに依存することはできませんが、保持しているオブジェクト参照は引き続き有効である必要があります。
ファイナライザーがロックを取得したり、新しいオブジェクトを作成しようとしたりしてはならないことは明らかです。ただし、いくつかのイベントをサブスクライブするオブジェクトと、実際にイベントを使用する別のオブジェクトがあるとします。後者のオブジェクトがガベージコレクションの対象になった場合は、できるだけ早く前者のオブジェクトのイベントのサブスクライブを解除してもらいたいと思います。前者のオブジェクトは、ライブオブジェクトによってサブスクリプションが保持されなくなるまで、ファイナライズの対象になることはありません。
ロックフリーのリンクリストスタックまたはサブスクライブ解除する必要のあるオブジェクトのキューを用意し、メインオブジェクトのファイナライザーにスタック/キュー上の他のオブジェクトへの参照を配置させるのは実用的でしょうか?リンクリストアイテムオブジェクトは、メインオブジェクトの作成時に割り当てる必要があり(ファイナライザー内での割り当てが禁止されるため)、キューをポーリングするためにタイマーイベントなどを使用する必要があります(イベントのサブスクリプションが解除されるため)。ファイナライザースレッドの外部で実行する必要があり、ファイナライザーキューに何かが表示されるのを待つことだけを目的としたスレッドを作成するのはおそらくばかげていますが、ファイナライザーが事前に割り当てられたリンクリストオブジェクトを安全に参照できる場合そして、そのクラスに関連付けられたメインキューオブジェクト、
それは良い考えでしょうか?(注:私は.net 2.0を使用しています。また、スタックまたはキューに追加しようとすると、Threading.Interlocked.CompareExchangeで数回スピンする可能性がありますが、非常に長くスタックすることはないと思います)。
編集
確かに、イベントをサブスクライブするコードはiDisposableを実装する必要がありますが、使い捨てのものは常に適切に廃棄されるとは限りません。もしあれば、ファイナライザーは必要ありません。
私が懸念するシナリオは次のようなものです:iEnumerator(of T)を実装するクラスは、関連するクラスのchangeNotifyイベントにフックして、基になるクラスが変更された場合に列挙を適切に処理できるようにします(はい、Microsoftはすべての列挙型を考えています単にあきらめる必要がありますが、動作を継続できる列挙型の方が便利な場合もあります)。クラスのインスタンスは、数日または数週間の間に数千回または数百万回も列挙される可能性がありますが、その間はまったく更新されません。
理想的には、列挙子は破棄せずに忘れられることはありませんが、「foreach」と「using」が適用できないコンテキストで列挙子が使用されることがあります(たとえば、一部の列挙子はネストされた列挙をサポートします)。注意深く設計されたファイナライザーは、このシナリオに対処する手段を可能にするかもしれません。
ちなみに、更新を通じて継続することになっている列挙は、汎用のIEnumerable(of T)を使用する必要があります。iDisposableを処理しない非汎用フォームは、コレクションが変更された場合に例外をスローする必要があります。
apache-flex - Adobe Flex 3 のファイナライザー
Adobe Flex 3 を使用して、ファイナライザーを指定する方法はありますか?
java - Java GCの質問:メソッドの1つがまだ実行されているときに、オブジェクトが到達不能になるにはどうすればよいですか?
私はJavaファイナライザーに関するこれらのスライドを読んでいます。CleanResource.finalize()
その中で、作成者は、別のスレッドで実行されている間にファイナライザースレッドによって実行される可能性があるシナリオ(スライド33)について説明してCleanResource.doSomething()
います。これはどのように起こりますか?
doSomething()
が非静的メソッドである場合、そのメソッドを誰かが実行するには、どこかでそれを強く参照する必要があります...そうですか?では、メソッドが戻る前に、この参照をどのようにクリアすることができますか?別のスレッドが急降下してその参照を無効にすることはできますか?それが起こった場合doSomething()
でも、元のスレッドに正常に戻りますか?
私が本当に知りたいのはそれだけですが、本当に上を超えた答えについてはdoSomething()
、スライド38がスライド29よりも優れている理由を教えてください。このメソッドdoSomething()
を呼び出すだけで十分なのはなぜですか。keepAlive()
呼び出し全体をmyImpl.doSomething()
1つのsynchronized(this){}
ブロックにまとめる必要はありませんか?
java - ファイナライズブロックの問題
私は「Joshua Bloch による効果的な Java プログラミング」を読んでいました。この本では、実行が保証されていないため、「ファイナライズ」ブロックを使用しないようにアドバイスしています。詳細に?