メモリ不足でGCが起動したというイベントを
受け取りたいのですが
そういった事は可能でしょうか

具体的にいうと
プログラムが大量のキャッシュをメモリに持っていて
メモリ不足になったらMEMORYOUTを起こす
前にキャッシュをクリアさせたいのです
(GCのアクションを受け取ってクリアしたい)

また
GCにインスタンスを開放するように
直接インスタンスを渡す方法はないでしょうか

以上よろしくおねがいします

このQ&Aに関連する最新のQ&A

A 回答 (1件)

> メモリ不足で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() を使えば良いですね。

# 動作を確認したわけではないので、一応、自信無しとしておきます
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aと関連する良く見られている質問

Qメモリの確保とgcについて?

gcのタイミングとか、その判断基準の話になるのかもしれません。下記の2つのクラスの実行結果の違いがなぜおきるのかわかりません。
理解できる方、解説お願いします。

WindowsXPでエクリプス上で実行しています。実行時のメモリはデフォルトの64MBのままです。
コンパイラ実行環境は1.4系です。

●テスト・クラス変数1、結果
◆VM 確保Total:17MB
◆VM 確保Total:44MB
◆VM 確保Total:46MB
◆VM 確保Total:46MB
◆VM 確保Total:46MB
◆VM 確保Total:46MB

●テスト・クラス変数2、結果
◆VM 確保Total:33MB
java.lang.OutOfMemoryError
Exception in thread "main"


全部張ると800文字を超えてしまうのでソースの一部のみを記述します。

// クラス変数として宣言、両クラスで共通
private static HashMap map;

// テスト・クラス変数1
// mainメソッド中でこの記述が6回記述
map = new HashMap(4000000);
map.put("1", "いちご");
System.out.println("◆VM 確保Total:" + Runtime.getRuntime().totalMemory() / 1024 / 1024 + "MB");

// テスト・クラス変数2
// mainメソッド中でこの記述が4回記述
map = new HashMap(5000000);
map.put("1", "いちご");
System.out.println("◆VM 確保Total:" + Runtime.getRuntime().totalMemory() / 1024 / 1024 + "MB");

gcのタイミングとか、その判断基準の話になるのかもしれません。下記の2つのクラスの実行結果の違いがなぜおきるのかわかりません。
理解できる方、解説お願いします。

WindowsXPでエクリプス上で実行しています。実行時のメモリはデフォルトの64MBのままです。
コンパイラ実行環境は1.4系です。

●テスト・クラス変数1、結果
◆VM 確保Total:17MB
◆VM 確保Total:44MB
◆VM 確保Total:46MB
◆VM 確保Total:46MB
◆VM 確保Total:46MB
◆VM 確保Total:46MB

●テスト・クラス変数2、結果
◆VM 確保Total:33...続きを読む

Aベストアンサー

> map = new HashMap(5000000);

このコードの動作を見てみましょう。
まず5000000エントリのHashMapが作られ、それからmapに代入されます。mapに以前あったオブジェクトは代入の際にゴミになり、GC対象となります。
要するに少なくとも2つのHashMap(5000000)が存在できるだけのメモリが必要です。

次に
> ●テスト・クラス変数1、結果
> ◆VM 確保Total:17MB

> ●テスト・クラス変数2、結果
> ◆VM 確保Total:33MB
に注目します。
HashMapのマップサイズは指定したエントリ数そのままではなく倍に増えています。2冪に切り上げしているのかもしれません。

これらから、後半のテストで2回目のHashMap作成には少なくとも66MB以上のメモリを必要とするだろうことが分かります。
メモリは64MBしかありませんからOutOfMemoryErrorになります。

QJSP内で、アクションによってセッションをクリアする方法

はじめまして。

Java(struts)とJavaScriptを使用し、プログラムを作成しています。
サーバー側の処理で、セッション領域に必要な情報をセットし、その情報を画面表示の際に使用しています。

ひとつの画面から、複数のアクションを飛ばす画面で
それぞれは、JavaScriptによって分岐しアクションを選択する形になっています。
表示された画面から、指定したアクション以外のアクションで、別の画面に遷移しようとした際に、
セッション領域をクリアする処理が必要なため、色々と探しているんですが、なかなか思うように情報が集まりません。

JavaScriptでセッションを操作する。
又は、指定された画面以外に遷移する場合に、
セッション内容をクリアする方法、どうかご教授お願いいたします。

環境:
Java1.4.2_09
struts 1.2.7
tomcat 4.1.33

Aベストアンサー

なんとなく状況が分かりました。
たぶん・・・
-------------------------
画面aにActionA、B、Cがあり、AやBはforwardが画面aでCが画面bにforwardする。
Cを実行するときはセッションの内容をクリアしたいけど、Cを作るのは他社なので、手を出すことができない。
-------------------------
って感じでしょうか。

だとすれば、
1.新しいAction、PreCを作ります。
2.PreCではセッションをクリアします。
3.画面aでCを読んでいたところをPreCを呼ぶようにします。
4.struts-configのPreCの設定のforwardをCにします。

とりあえずこれでCは全く影響せずにあなたのやりたいことが出来ます。
struts-configに触れないとか新しいアクションを作ることが許されないなどの場合は無理ですが・・・。

QJavaScriptでキャッシュクリアする方法はありますか?

現在、入力された条件によりデータを抽出するプログラムを作っています。が、IEで実行すると前回入力した条件のまま、データが抽出されてしまいます。
NNでは正常に表示されるため、キャッシュのせいかと思っているのですが、
JavaScriptでブラウザのキャッシュをクリアする方法はありませんか?

ブラウザ>ツール>インターネットオプション>一時ファイル削除
しか手がないのでしょうか?

大変困っているので回答をよろしくお願いします。

Aベストアンサー

こんばんわぁ、Blackwinglsです。

本当にキャッシュのせいか甚だ自信無しなのですが、JavaScriptを使わなくても、以下URLの方法でキャッシュからの読込みを制御できるのではないかと思います。

http://www.okweb.ne.jp/kotaeru.php3?q=8889

一度試してみては如何でしょうか・・・

ではでは(^_^)/~

参考URL:http://www.okweb.ne.jp/kotaeru.php3?q=8889

Q使用メモリの開放

アプレットにて動作するシステムを作成しているのですが、
システムを終了しても、IEを終了するまで使用メモリが開放されず
数回システムを起動すると「OutOfMemory」でフリーズしてしまいます。
システム終了時に「System.gc()」の命令は入れているのですが。
IEを終了せずにメモリを開放したいのですが、
何か良い方法はありませんか?

Aベストアンサー

これって、タスクマネージャで見たときに「java.exe」でメモリを使っているのではなくて、iexplore.exeでメモリが消費されているって話ですよね?
これは、IE側でのメモリ消費なので、javaからはどうしようもありません。
IE側の問題なので、IE自身を終了する以外に手はありません。
もしくは、システム終了でアプレットが終了せず、そのまま再ログインして、再起動しなくてもシステム再開できるようにするか です。

QJavaでメモリ不足を引き起こす方法

Javaを使って、システムのメモリ不足を引き起こす方法を考えています。
(動作検証のためで、悪いことを考えているわけではありません^^;)

下記のプログラムでメモリを大量に消費するかなと思ったのですが、
Linux上のvmstatやtopなどで確認してもそれほど変化がありません。

while (true) {
Integer[] ii = new Integer[100];
for (int i = 0; i < 100; i++) {
ii[i] = new Integer(i);
}
}

Javaの1プロセスが使えるメモリの上限があるので、メモリを食いつぶすプロセスを
大量に実行すれば良いと考えているのですが、メモリを食いつぶす方法が分かりません。

よろしくお願いいたします。

Aベストアンサー

このプログラムだと、whileで繰り返してInteger[] ii = new Integer[100];すると、その前の繰り返しでiiに設定されていた配列は、どこからも参照されなくなるため、ガベージコレクションの対象となる。このため、常に、現在使っているiiに設定されているInteger配列以外は、必要に応じてガベージコレクションで消去されるため、永遠にメモリ不足にはならない。

メモリ不足を起こすには、生成されたオブジェクトがすべて参照された状態である必要がある。試してないが、例えば、ArrayListなどに次々とaddしていくのを繰り返したりすれば、メモリが消費される一方になるんじゃないだろうか。


人気Q&Aランキング

おすすめ情報