- 締切済み
GCのアクションイベント
メモリ不足でGCが起動したというイベントを 受け取りたいのですが そういった事は可能でしょうか 具体的にいうと プログラムが大量のキャッシュをメモリに持っていて メモリ不足になったらMEMORYOUTを起こす 前にキャッシュをクリアさせたいのです (GCのアクションを受け取ってクリアしたい) また GCにインスタンスを開放するように 直接インスタンスを渡す方法はないでしょうか 以上よろしくおねがいします
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- a-kuma
- ベストアンサー率50% (1122/2211)
> メモリ不足でGCが起動したというイベントを受け取りたい GC は、メモリ不足になったから起きるとは限りませんが、とりあえず、GC を きっかけにして何かの処理をやりたいのだったら、その処理を finalizer に 記述したクラスを new して、参照を持たないようにしておけば、捕まえられる んじゃないでしょうか? class 処理用のクラス { protected void finalize() throws Throwable { /* やりたい処理 */ new 処理用のクラス; /* 参照を持たないインスタンスを生成して次回に備える */ } } class メインのアプリケーション { public static void main(String args[]) { new 処理用のクラス; /* とりあえず、参照を持たないインスタンスを生成 */ /* 実際の処理 */ } } ってな感じで。インスタンスの開放と同時に finalizer が呼ばれる保証がない(はず) のが玉に傷ですが。 > GCにインスタンスを開放するように直接インスタンスを渡す方法はないでしょうか 参照されていないインスタンスが GC の対象になるわけですから、インスタンスを 参照している変数全てに null を代入すればいいでしょう。 即、GC を起動したいのであれば、System.gc() を使えば良いですね。 # 動作を確認したわけではないので、一応、自信無しとしておきます