Webアプリケーションで、非常に付加がかかり、メモリが

無くなった場合の挙動についての質問です。(JavaのStrutsで構築)

非常に大きなサイズのCSVファイルを読み込み、DBへの挿入、検証など、約2時間ぐらい
(比例計算により算出された予想時間)の待ち時間が生じる処理をユーザに行わせるのですが
(ユーザは例えば自社社員などのような、限られたウェブ)
万が一、Javaがメモリを食いつぶした場合、サーバなどはどうなるのでしょうか。
実行した本人のレスポンスが返ってきたページが、500エラー等になるのは仕方ないとしても、
同時間にログインしていた他のユーザがセッションが切れるとか、サーバの再起動が必要に
なったりするのでしょうか。

それはウェブサーバの種類にも依存しますか。(Tomcat等)
また、どのくらいメモリが使用されているかを確かめるUNIXのコマンドなど、リアルタイムに
確認する方法はありませんか。

回答の条件
  • 1人3回まで
  • 登録:
  • 終了:2009/01/27 22:33:24
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:shimesaba256 No.2

回答回数1ベストアンサー獲得回数1

ポイント44pt

Javaがメモリを食いつぶした場合ですが、通常はOutOfMemoryとなってエラーが返ると思われます。

メモリがちゃんと解放されるようになっていればその後の動作には支障がないとは思いますが、同時にアクセスしていたユーザは同じエラーに見舞われると予想されます。その後レスポンスがない場合などは、メモリが解放されていないかもしれないのでサーバを再起動する必要があるでしょう。

Java VMのメモリ使用量を知りたいのなら、Runtime.getRuntime().freeMemory()などを使うのいい気がします。

long free = Runtime.getRuntime().freeMemory() / 1024;

long total = Runtime.getRuntime().totalMemory() / 1024;

long max = Runtime.getRuntime().maxMemory() / 1024;

long used = total - free;

double ratio = (used * 100 / (double)total);

String info = "Java メモリ情報 : 合計=" + total + "
";

info += "使用量=" + used + " (" + ratio + "%)
";

info += "使用可能最大="+max;

out.println(info);

基本、こういった作業は運用時間中は避けたほうが無難だとは思いますが・・

id:kyoko55

ありがとうございます。

Runtime.getRuntime().freeMemory()、試したいと思います。

> メモリがちゃんと解放されるようになっていれば

これはプログラムの作り方次第で解放されたり、されなかったりするんでしょうかね。

2009/01/24 17:47:22

その他の回答1件)

id:komamitsu No.1

回答回数21ベストアンサー獲得回数2

ポイント26pt

> どのくらいメモリが使用されているかを確かめるUNIXのコマンドなど、リアルタイムに

確認する方法

ここだけに反応します。

リアルタイムにプロセス毎のメモリ使用量が見れるtopコマンドはどうでしょう?

http://www.linux.or.jp/JM/html/procps/man1/top.1.html

スワップアウトがばんばん発生しそうな状況であればRES(物理メモリ)の他にVIRT(仮想メモリ)にも注目しておけば良いかと思います。

id:kyoko55

ありがとうございます。topコマンド試してみます。

2009/01/24 17:39:21
id:shimesaba256 No.2

回答回数1ベストアンサー獲得回数1ここでベストアンサー

ポイント44pt

Javaがメモリを食いつぶした場合ですが、通常はOutOfMemoryとなってエラーが返ると思われます。

メモリがちゃんと解放されるようになっていればその後の動作には支障がないとは思いますが、同時にアクセスしていたユーザは同じエラーに見舞われると予想されます。その後レスポンスがない場合などは、メモリが解放されていないかもしれないのでサーバを再起動する必要があるでしょう。

Java VMのメモリ使用量を知りたいのなら、Runtime.getRuntime().freeMemory()などを使うのいい気がします。

long free = Runtime.getRuntime().freeMemory() / 1024;

long total = Runtime.getRuntime().totalMemory() / 1024;

long max = Runtime.getRuntime().maxMemory() / 1024;

long used = total - free;

double ratio = (used * 100 / (double)total);

String info = "Java メモリ情報 : 合計=" + total + "
";

info += "使用量=" + used + " (" + ratio + "%)
";

info += "使用可能最大="+max;

out.println(info);

基本、こういった作業は運用時間中は避けたほうが無難だとは思いますが・・

id:kyoko55

ありがとうございます。

Runtime.getRuntime().freeMemory()、試したいと思います。

> メモリがちゃんと解放されるようになっていれば

これはプログラムの作り方次第で解放されたり、されなかったりするんでしょうかね。

2009/01/24 17:47:22
  • id:shimesaba256
    >これはプログラムの作り方次第で解放されたり、されなかったりするんでしょうかね。
    「Java」「メモリリーク」等で検索すると結構引っかかると思います。オブジェクトの参照等に気をつければそうそう発生はしないと思いますが。。
    ライブラリのバグ等でメモリリークが発生することもあります。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません