問題タブ [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 - SoftReference指示対象を適切に完成させる
検索ハンドルオブジェクトを開いたままにしておくと、クエリキャッシュに役立つ検索ライブラリを使用しています。時間の経過とともに、キャッシュが肥大化する傾向があり(数百メガバイトで成長し続ける)、OOMが起動し始めました。このキャッシュの制限を強制したり、使用できるメモリの量を計画したりする方法はありません。そのため、 Xmxの制限を増やしましたが、これは問題の一時的な解決策にすぎません。
最終的に、私はこのオブジェクトをの指示対象にすることを考えていますjava.lang.ref.SoftReference
。したがって、システムの空きメモリが不足すると、オブジェクトが解放され、オンデマンドで新しいオブジェクトが作成されます。これにより、新たに開始した後の速度がいくらか低下しますが、これはOOMを押すよりもはるかに優れた代替手段です。
SoftReferencesについて私が目にする唯一の問題は、指示対象を確定するためのクリーンな方法がないことです。私の場合、検索ハンドルを破棄する前に閉じる必要があります。そうしないと、システムでファイル記述子が不足する可能性があります。明らかに、このハンドルを別のオブジェクトにラップし、ファイナライザーを記述して(または、ReferenceQueue / PhantomReferenceにフックして)、手放すことができます。しかし、ねえ、この惑星のすべての記事は、ファイナライザーの使用、特にファイルハンドルを解放するためのファイナライザーの使用を推奨していません(たとえば、 Effective Java ed。II、27ページ)。
だから私は少し戸惑っています。これらのアドバイスをすべて慎重に無視して続行する必要があります。そうでなければ、他の実行可能な選択肢はありますか?前もって感謝します。
編集#1:トムホーティンによって提案されたようにいくつかのコードをテストした後、以下のテキストが追加されました。私には、提案が機能していないか、何かが足りないように見えます。コードは次のとおりです。
上記のスニペットを-Xmx10m
(上記のコードのように)SoftReferencesを使用して実行すると、大量のis null :(
印刷が行われます。しかし、コードをMyReference
(MyReferenceで2行のコメントを解除し、SoftReferenceでコメントアウトする)に置き換えると、常にOOMになります。
アドバイスから理解したように、内部にハードリファレンスがあるからといって、MyReference
オブジェクトが当たるのを防ぐことはできませんReferenceQueue
よね?
c# - C#AutoSaveクリーンアップ; ベストプラクティス?
ドキュメントを表すクラス(GH_Document)があります。GH_Documentには、潜在的に危険なすべての操作の前に呼び出されるAutoSaveメソッドがあります。このメソッドは、元のファイルの横にAutoSaveファイルを作成(または上書き)します。
GH_Documentには、AutoSave関数によって作成されたすべてのファイルをディスクから削除するDestroyAutoSaveFiles()というメソッドも含まれています。このメソッドは、アプリが終了したとき、およびドキュメントがアンロードされたときにドキュメントに対して呼び出します。ただし、シャットダウンが成功した後もAutoSaveファイルがまだ存在しているため、いくつかのケースを見逃したようです。
だから、これは私に考えさせました。このような状況を処理するための最良の方法は何ですか?ドキュメントが消える可能性のあるすべての方法を追跡し、自動保存クリーンアップロジックをどこにでも追加する必要がありますか?または、IDisposableを実装し、GH_Document.Dispose()でクリーンアップを実行する必要がありますか?または、GH_Document.Finalize()でこれを行う必要がありますか?
自動保存ファイルをディスクに残したいのは、アプリケーションがクラッシュした場合だけです。クラッシュが発生した場合にDisposeとFinalizeが呼び出されないことが保証されていますか?
xcode - 完成したアプリケーションをXcodeからどのようにエクスポートしますか?
私はこれを聞かなければならないのはばかげています。誰かにベータ版を送信してそのマシンでテストしたいところまでアプリケーションがありますが、Xcodeに.app
送信するファイルを作成させる方法がわかりません。ヘルプ?
c# - System.Object クラスの Finalize メソッド
好奇心から、mscorlib.dll を逆アセンブルして、System.Object クラスの実装を確認しました。
その中で奇妙なものを見つけました。
基本クラスにオーバーライドされたメソッドがあるのはなぜですか?
Object クラスでの「保護された Finalize」メソッドの使用と、コンパイラによる特別な処理が必要な理由を知りたいのですが。
c# - 差分b/wデストラクタとファイナライズメソッド
これらの関数がどのように呼び出されるかを知りたいです。ヒープがいっぱいの場合と同様に、GCが呼び出されます。オブジェクトにマークを付け、そのファイナライズ操作を呼び出します。これで、スイープステージが作成されました。このステージでは、そのオブジェクトへの参照が削除され、オブジェクトにアクセスできなくなります。 。その時何をしているのか...
java - java.lang.Objectのfinalize()メソッドが「保護」されているのはなぜですか?
好奇心から、
finalize()
メソッドのアクセス修飾子がとして作成されるのはなぜですかprotected
。なぜできないのpublic
ですか?誰かが私にこれの背後にある特定の理由を説明できますか?
finalize()
また、メソッドが一度だけ呼び出されることを知りました。プログラム内で2回呼び出すと、どうなりますか?ガベージコレクターはこれを再度呼び出しますか?
java - Javaでのファイナライズの目的は何ですか?
ファイナライズについての私の理解はこれです:
オブジェクトが占有するメモリをクリーンアップまたは再利用するために、ガベージコレクタが機能します。(自動的に呼び出されますか?)
次に、ガベージコレクターはオブジェクトを逆参照します。ガベージコレクタがオブジェクトにアクセスする方法がない場合があります。次に、finalizeが呼び出されて最終クリーンアップ処理が実行され、その後ガベージコレクターが呼び出されます。
これはファイナライズの正確な説明ですか?
java - javaでfinalize()メソッドが呼び出されるのはいつですか。
finalize()
メソッドがで呼び出されるタイミングを知る必要がありJVM
ます。メソッドが呼び出されたときにファイルfinalize()
をオーバーライドして書き込むテストクラスを作成しました。実行されません。実行されない理由を教えてもらえますか?
java - java:すべてのスレッドが終了した後に接続を閉じます
以下は私のクラスコードです
これは、getDatabase()メソッドを介してのみデータベースオブジェクトを初期化できます。以下は、4つのスレッドに単一のデータベース接続を使用するプログラムです。
すべてのスレッドが実行された後、接続を閉じる必要があります。そうするための良いアイデアはありますか?この仕事を手伝ってください。
java - Java: file write on finalize method
In my understanding a singleton object will destroy only when the application is about to terminate. So in C++ I write a Singleton class to log my application and in that Singleton logger's destructor I log the time when my application was terminated. Things worked perfectly in C++.
Now I want to have that same logger in Java, as in java there is no destructor so I implemented the finalize method for that singleton logger. But it seem that finalize method actually never get called.
So, I add that System.runFinalizersOnExit(true);
line, somewhere in my code (though I know it is deprecated) and that finalize method get called every time before termination of the app. But still there is a problem! If I try to write anything on file in that finalize method, It does not work, though System.out work without any problem! :(
Can you guys help me on this problem? Here is a sample code of what I am try to do:
Singleton Logger Class:
Main: