C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: Java Plug-inのヒープサイズについて


(過去ログ 48 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■26223 / inTopicNo.1)  Java Plug-inのヒープサイズについて
  
□投稿者/ naga (1回)-(2008/10/04(Sat) 07:18:49)

分類:[Java] 

はじめまして。nagaと申します。

非常にやっかいな問題に遭遇しておりまして、ぜひ知恵をお借りできればと思います。

---<<環境です>>------------------------------------------------------------------
OS:WindowsXP SP2 または SP3
IE:6.0 または 7.0
JREのバージョン:1.4.2_16、1.5.0_6、1.6.0_7(この間のリリースもすべて試しました)
物理メモリ:4GB
仮想メモリの設定:2046-4092
不要なサービスは停止しました。
アイドリング時でメモリは150MBほどしか使用しておりません。
---------------------------------------------------------------------------------

-Xmxオプションをつけて、ヒープ領域を大きくしたいのですが、
何らかのリミット(制限)に引っかかり、大きくできない状態に陥っています。
(大きくしなければならない事情があります。ご容赦ください。
できれば、-Xmx1024Mに設定したいと思っています。)
Xmxに512Mを超える値を設定し、ブラウザでアプレットを読み込ませると、
IEがクラッシュするか、JRE1.4.0_14以上のバージョンでは「致命的エラー」となり、
アプレットを表示することができません。

これまでわかったこととしては、
1.サンマイクロシステムズのバグレポートで、
 -Xmsの値と-Xmxの値を同じにしなければならないという記述を見つけましたので、
 -Xms1024M -Xmx1024M
 に設定し、アプレットを読み込むが、「致命的エラー」となる。
2.-Xmx512Mまでは設定可能。
 これを超えると、アプレット読み込み時「致命的エラー」となる。
3.同一スペックのWindows2000SP4でも同じ試験をするが、再現しない。(-Xmx1024Mまで設定可能)
です。

最も疑問なのは、2000SP4とXPとの動きの違いです。
なぜ512MBもの差が生じるのでしょうか・・。

原因が全くわからない状態で何日も悩んでおります。
対策方法をご教授頂けないでしょうか。

よろしくお願いいたします。
引用返信 編集キー/
■26228 / inTopicNo.2)  Re[1]: Java Plug-inのヒープサイズについて
□投稿者/ 渋木宏明(ひどり) (912回)-(2008/10/04(Sat) 12:20:53)
渋木宏明(ひどり) さんの Web サイト
> 1.サンマイクロシステムズのバグレポートで、
>  -Xmsの値と-Xmxの値を同じにしなければならないという記述を見つけましたので、
>  -Xms1024M -Xmx1024M
>  に設定し、アプレットを読み込むが、「致命的エラー」となる。

1024M てのは 1GB を表してますよね?
-Xms で指定した領域と -Xmx で指定した領域は別々に確保されるとしたら、計 2GB ですか。

32bit OS で 1GB, 2GB つったら大層巨大な領域ですから、確保に失敗したんでしょうね。

> 3.同一スペックのWindows2000SP4でも同じ試験をするが、再現しない。(-Xmx1024Mまで設定可能)
> です。
>
> 最も疑問なのは、2000SP4とXPとの動きの違いです。
> なぜ512MBもの差が生じるのでしょうか・・。

理由は様々考えられますが、要するにアプリケーションで利用可能な実質的なアドレス空間が減っているんでしょう。

> 原因が全くわからない状態で何日も悩んでおります。
> 対策方法をご教授頂けないでしょうか。

あきらめるしかないでしょうね。
メモリ消費を低減するほかないと思います。

引用返信 編集キー/
■26253 / inTopicNo.3)  Re[2]: Java Plug-inのヒープサイズについて
□投稿者/ Azulean (204回)-(2008/10/05(Sun) 19:35:54)
検索してたら、似たものがあった。
http://q.hatena.ne.jp/1202102681

Win32のプロセスでは2GBという大きな単位での制限があるけれど、それを使い果たす前にメモリ確保ができなくなることがあります。
極端ですが、下記のような使われ方をしていたと仮定します。

+--------+--------+--------+--------+
|512M使用|512M空き|512M使用|512M空き|
+--------+--------+--------+--------+

この場合、空き領域は1024Mですが、連続して確保できる最大の領域は512Mとなり、1024Mのメモリ確保要求は失敗します。
OSによる差がどの辺にあるのか分かりませんが、空き領域が断片化しているのかもしれません。
過去の手元の実験では、同じ単純なアプリ(非Java)で、XPでは連続領域が少なく、Vistaでは結構連続していたりと差がありました。インストールされているコンポーネント等によって左右されているかもしれませんが。

なお、ハードディスクと違い、デフラグといった考えはできませんので、基本的に諦めるしかありません。
メモリを使わないように工夫する(ファイルに逃がす等)ぐらいでしょうか。

引用返信 編集キー/
■26257 / inTopicNo.4)  Re[3]: Java Plug-inのヒープサイズについて
□投稿者/ naga (2回)-(2008/10/05(Sun) 21:34:38)
Azuleanさん、ありがとうございます。

わかりやすく解説していただき、ありがとうございます。
やはり諦めるしかないですね。

ありがとうございました。
解決済み
引用返信 編集キー/
■26310 / inTopicNo.5)  Re[4]: Java Plug-inのヒープサイズについて
□投稿者/ naga (3回)-(2008/10/06(Mon) 19:51:19)
Windowsのメモリ管理についていろいろと調査した結果、
下記のように推測しました。

1.ユーザーメモリの制限について
非常に基本的なことだが、32bit版Windowsの1プロセスあたりのメモリは
2GBに制限される。
(WindowsXPもWindows2000も同一)

2.メモリにロードされるプログラムの数について
WindowsXPは、Windows2000に比べて読み込まれるコンポーネントの数が
増加しており、必然的にメモリーにロードされるプログラムの数も増加している。
参考URL:http://www.microsoft.com/japan/windowsxp/pro/evaluation/whyupgrade/featurecomp.mspx

3.PreFetch機能について
次にWindowsXPからは「PreFetch」機能が追加され、Windows 2000までは,EXEファイルがDLLを呼び出したときに初めて、
OSはDLLファイルをハード・ディスクからメモリーに読み込む。Windows XPでは,EXEファイルの読み込み時に,
そのEXEファイルがどのDLLを利用するかを調査し,あらかじめメモリー上にDLLを読み込むようになった。
そのため仮想メモリには、Windows2000と比較して、XPはより多くのプログラムが読み込まれる。
参考URL:http://itpro.nikkeibp.co.jp/members/NOS/ITARTICLE/20020125/2/

4.仮想メモリの断片化について
「3.」の理由から、仮想メモリ内部は、下記のような使われ方をしていると思われる。
  
+--------+--------+--------+--------+
|512M使用|512M空き|512M使用|512M空き|
+--------+--------+--------+--------+

次に、JREについて、
ブラウザのPlug-inとして動作する場合、Xmxで指定するヒープサイズを確保するには、
そのサイズの連続した仮想メモリ上の領域が必要になる。
(A)=ブラウザ本体のプログラム、スタック、ヒープなどが使う
(予約)メモリサイズ(アドインを含む)
 (B)=JavaVM本体のプログラム、スタック、ヒープなどが使う
(予約)メモリサイズ
とすると、
Xmxで指定可能なサイズ=2GB-(A)-(B)
となる。(他の要素もある)
ここで、
A=約512MB 
B=約512MB 
とすると、2GB-1GB=1GBとなり、
最大で1GB割り当て可能であり、Windows2000は連続領域を確保はできるが、
Xmxで指定可能なヒープサイズの最大値は1024MB前後に制限されることになる。
ただしブラウザの種類やアドインソフトの数により若干の誤差はある。
WindowsXPの場合はWindows2000と比較すると、PreFetch機能により多くのdllが仮想メモリに予約され断片化するため、
連続したアドレスを確保しにくく、アプレットを読み込んだ際、IEが拡張可能なアドレス空間はより厳しく制限される。
そのため、512MB前後の確保しかできない。ブラウザの種類やアドインソフトの数により若干の誤差はある。
スタートアッププログラムの見直しやアドインソフトの見直し、不要サービスの停止を行えばある程度は改善されるが、
それでも取得可能なヒープは最大で700MB前後である。

こんな考えで合っているでしょうか?
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -