Java アプレットでOut of Memoryが発生して困っています。

-Xmsや-Xmxオプションをつけて、ヒープ領域を大きくしようとしているのですが、
何らかのリミット(制限)に引っかかり、大きくできない状態に陥っています。
Java アプリケーションでは、問題なく大きくできるのでJava Pluginの制限かと思っ
ているのですが…制限しているモノが何かを知りたいのです。
(実メモリ、JREのバージョン、OS、ブラウザ、レジストリを変更、調査してみました
が若干の変化はあるものの明確に連動しているものが見つかっていません)

Java アプレットのヒープ領域に制限を掛けているものを教えてください。
できれば、解除方法も…。

回答の条件
  • 1人2回まで
  • 登録:2008/02/04 14:24:42
  • 終了:2008/02/10 08:29:28

回答(5件)

id:ffmpeg No.1

ffmpeg回答回数1202ベストアンサー獲得回数92008/02/05 22:12:07

id:maq

確かにその設定なんですけど…その設定値に対してリミット(制限)を掛けているところを知りたいのです。

2008/02/05 23:34:06
id:ardarim No.2

ardarim回答回数892ベストアンサー獲得回数1422008/02/06 00:18:06

ポイント20pt

具体的な数字(これ以上はダメというサイズ)はどれくらいなんでしょうか。

Javaアプレットで動作するということは、ブラウザのプロセス内で動作するということになりますので、ブラウザ自体が使うメモリの分、Javaアプリ単体で動かすよりも使える最大メモリは当然少なくなります。


通常Windowsでは1つのプロセスが扱える仮想アドレス空間は、プログラム、スタック、ヒープなど全てをひっくるめて2GBです。これを超えるメモリは確保できません。

観測するとしたら実メモリよりは仮想メモリの使用量を見たほうが良いと思います。これには例えばProcess Explorerなどが使えます。タスクマネージャで表示されるメモリ使用量はワーキングセットサイズなのであまり意味がありません。


またJavaはメモリリークがないとか思っていませんか? 低級言語でのポインタによるメモリリークはありませんが、かといってGCは万能というわけではありません。GCは不要になったオブジェクトを自動的に解放してくれますが、使わなくなったオブジェクトへの参照が残っているとGCはまだ必要なオブジェクトと判断して解放しません。こうしたことの積み重ねでJavaの空きヒープ領域はどんどん減っていきます。(いわばJava版のメモリリークです)

id:maq

残念ながら、まったく回答になっていません。

Xmxで設定しようとしている値は2GBなどというふざけた値では

ありません。せいぜい512MB程度です。

また、リークうんぬんの話は全く聞いていません。

あくまで知りたいのは、制限を掛けている部分です。

2008/02/06 01:16:53
id:KUROX No.3

KUROX回答回数3542ベストアンサー獲得回数1402008/02/06 16:12:40

ポイント20pt

http://shinsei.e-gov.go.jp/menu/prepare/use.html

「20MB以上の申請データを送信する場合について」

で、java pluginの-Xmxの設定の変更方法が載ってますが、

このように指定しても、Out of Memoryになりますか?

id:maq

はい。と言うかXmx512mの設定を行うと何らかの制限にかかって

そこまでサイズを指定できないのが問題なのです。

設定の方法自体は1の回答でも書きましたが、既知です。

よろしくお願いします。

2008/02/06 17:29:29
id:KUROX No.4

KUROX回答回数3542ベストアンサー獲得回数1402008/02/07 08:05:24

ポイント20pt

指定できないと言う意味が不明ですが・・。

設定画面でエラーになるんでしょうか?

ならないのなら、設定は反映されてるだろうし、

ヒープ領域は拡大されてると思います。

-----------

アプレットに実コードをいれて、本当にメモリーが増えてるかどうか

調べてみたほうが良さそうに思います。

totalMemory

maxMemory

freeMemory

http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/java/lang/Runtime....()

------------

増えてないのなら、私なら、

本当にそのアプレットは、Java PluginのJVMをつかって

実行してるかどうかを疑いますね。

------------

あと、明示的に Runtime.getRuntime().gc()をかいてみるとか。

アプレットとアプリケーションでは、gcのタイミングが違うという

ことは考えられます。

id:maq

指定できるのですが、一定の値(これが環境によって、少し違う場合あり)を超えると

起動できないエラーが発生します。

設定をすることによって、挙動が変わるのでJava PluginのJVMが使用されていること

は間違いないですし、起動できる範囲ではverboseオプションを付けることでメモリの

状況は確認しています。

2008/02/07 11:26:47
id:DASM No.5

DASM回答回数6ベストアンサー獲得回数02008/02/10 04:32:19

ポイント20pt

アプレットが原因なのか、VM のメモリ設定が原因なのか、問題の切り分けが出来ていないので、まずそこからではないですか?

のようなサイトで max の値を知ることもできるし、ただメモリを allocate するだけのアプレットもすぐ作れるはずです。Java コンソールを表示しながら作業すると、より確実でしょう。

VM のメモリ設定が原因ではない (他のアプレットでは目的のヒープ領域を確保できる) ことをまず確かめてはどうでしょうか。

同じ VM、他のアプリでうまくいくなら、アプレット固有の問題です。

VM のメモリ設定が原因なら、お手あげです。アプレットで 512 MB 以上に設定すると OutOfMemory になることがあるというのは有名なバグで、直そうという動きがあるようですが、まだ最新の jre に反映されていないかもしれません。

Java Web Start ならうまくいくかもしれません。

id:maq

アプレット固有の問題との認識です。

512MBにすべての環境で広げられれば十分なのですが…広げられない環境がある原因が

わからないので困っています。

ありがとうございました。

2008/02/10 08:24:59
  • id:ardarim
    質問の次点では512MBという数字がわからなかったので原因の見当もつかないのでまずはこういう回答しかできませんでしたが。

    回答に書いたように、Xmxで指定できる最大サイズが2GBという訳ではありません。
    (A)=ブラウザ本体のプログラム、スタック、ヒープなどが使うメモリサイズ(BHOなどのアドインを含む)
    (B)=JavaVM本体のプログラム、スタック、ヒープなどが使うメモリサイズ
    とすると、
    Xmxで指定可能なサイズ=2GB-(A)-(B)
    となるわけです。(もうちょっと他の要素があるかもしれません)

    Javaアプリ単体の場合は(A)の部分がありませんから、Javaアプレットで動作する場合よりも指定可能なサイズも増える訳です。

    メモリリークについては参考です。Xmxで増やして場当たり的な解決をするより、メモリリークしているのであればそれを直すべきだと思います。
  • id:maq
    残念ながら、場当たり的な解決とも言えないんです。
    リークではなく実際必要です。まぁ、その大きな領域が必要という作りが問題
    と言えば問題なんですけど。ありがとうございます。
  • id:KUROX
    Java アプレットのコントロールパネルで、
    -Xmx512m
    と指定するとエラーになって設定自体できないということでしょうか?



  • id:maq
    指定はできるのですが…アプレット起動時にエラーになってしまいます。
  • id:KUROX
    ・アプレット起動時のエラーが、Out of Memoryなのでしょうか?
     違うエラーの事例もGoogleでは見つかります。
    ・アプレットビューアで実行してみても同じなのでしょうか?
    ・思い切って、-Xmx1024mとかしてみてもだめなのでしょうか?
    ・JDKのバージョンによっては、アプレットでのみメモリーリークをしたり
     するようです

  • id:maq
    そうなんですよね~色々やってはみたのですが、JDKも6 Update 4まで
    5系も試したのですが…。
    確かに事例も色々あるのですが、決め手がないので人力検索でなんとか
    ならないかと質問した次第です。
    そのアプレットがすべて内製なら良いのですが…ちょっと特殊なモノな
    ので、アプレットビューワとかでは動かないです。
    色々ありがとうございます。

  • id:KUROX
    MSのVMやSUNのJava Plugin以外のものもありますが
    そういう環境で動く種類のものでしょうか?
    例:オラクルデベロッパとか。
  • id:maq
    どうやら,6update10で解決する問題のようですね…。

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

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

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

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません