- PR -

ファイルのダウンロードでメモリが多く消費される

1
投稿者投稿内容
ヤマオ
会議室デビュー日: 2003/08/28
投稿数: 11
投稿日時: 2009-02-20 17:46
こんにちは。以下質問をさせて頂きますので、
ご存知の方がいらっしゃいましたら、ご教示頂けたらと思います。

Webアプリケーションで、ファイルのダウンロードを
実施しておりますが、メモリの消費が激しいです。

例えば、20MBのファイル(CSV等種類は問わない)をダウンロードした場合、
Buffer/Cache込みで2GB空いている物理メモリのほとんどを
消費し、ページングでスワップ領域を1GB使用している
ような状況です。

ユーザーが比較的大きいファイルのダウンロードを何度か
実施しただけで、メモリが枯渇してしまいます。
先日は物理メモリ/スワップ領域共に枯渇してしまった結果、
サーバでカーネルパニック(Out Of Memory)が発生し、
ダウンしてしまいました。
なぜ数十MBほどのファイルのダウンロードでこれだけの
メモリを使用してしまうのか、原因がわからず、困っております。

アプリケーションの実行環境は以下の通りとなっております。
-------------------------------------------------
OS:RHEL4.6
M/W:WAS ND 6.1.0.15、IHS
java:IBM J2RE Standard 1.5.0 SR6
物理メモリ:3GB
スワップ領域:2GB
-------------------------------------------------

また、ファイルのダウンロードは以下コードにて実行しております。
-------------------------------------------------
OutputStream os = null;
FileInputStream fis = null;
byte[] bytebuf = new byte[128];
try {
os = response.getOutputStream();
fis = new FileInputStream(uri);
int readByte = -1;
while ((readByte = fis.read(bytebuf)) != -1) {
os.write(bytebuf, 0, readByte);
os.flush();
}

} catch (IOException ioe) {
// ファイルのダウンロード中に画面を閉じた場合は、アプリケーションエラーとする。

} finally {

try {
if (os != null) {
os.close();
}
} catch (IOException ioe) {
// do nothing
}
try {
if (fis != null) {
fis.close();
}
} catch (IOException ioe) {
// do nothing
}
-------------------------------------------------

上記にて何か問題点等ございましたら、
ご指摘頂けますでしょうか。

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

[ メッセージ編集済み 編集者: ヤマオ 編集日時 2009-02-20 17:46 ]
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2009-02-23 14:07
ざっとコードを見たところでは問題はわかりませんでした。
ヒープダンプを取得するなどしてどのようなオブジェクトがヒープ領域を占めているのか確認してみてはいかがでしょうか。
・メモリリークトラブルシューティング記
http://yusuke.homeip.net/diary/2008/11/03/1225722480000.html
わたなべ
大ベテラン
会議室デビュー日: 2007/12/09
投稿数: 123
お住まい・勤務地: 札幌
投稿日時: 2009-02-23 16:38
ダウンロードではなくてそのファイルを作成する方に問題はないですか?
巨大な配列を作ってCSVを吐こうとしているとか…

まずはJConsoleでモニタリングしながらヒープがどのタイミングで肥大化するのか確認するといいかと思います。
1

スキルアップ/キャリアアップ(JOB@IT)