Troubleshooting
Problem
[Japanese] 本技術情報では、コード生成中にメモリが不足する現象、及びその回避方法について説明します。
Symptom
例えばプロジェクト全体からのコード生成など、比較的負荷の大きいコード生成処理を実行すると、処理の途中に突然以下のエラーが出力され、コード生成処理を完了することができません。ひとたびエラーが出力されると、Rhapsody 本体や Windows の動きが不安定になったり、場合によってはマシーンを再起動しなければならない事象も報告されています。
image1
image2
text1
メモリが不足しています。
text2
Rhapsody could not allocate needed memory for XYZ bytes.
Please exit this application.
Cause
32 ビットの Windows 上では、1 プロセスが最大で利用できるユーザー・メモリ容量は 2 GB (カーネル部含めて全体で 4 GB )に制限されています。コード生成中のメモリ消費量がその許容範囲を超えてメモリを消費すると、Rhapsody は上記のエラーを出力します。
Environment
32-bit Windows
Resolving The Problem
<LANG>_CG::Configuration:ClassesPerCGCall プロパティ (*1) を使います。このプロパティを使うと、単一のコード生成プロセスを細かいチャンク(塊)に分けることで、コード生成中に消費されるメモリの容量を抑えることができます。
例えば、プロパティーの値を 500 に指定した場合、モデルに 501 から 1000 個のクラスがあれば、Rational Rhapsody は、コード生成アクションを 2 つのより小さいコード生成アクションに分割します。プロパティの値が -1 (デフォルト) に設定されていると、チャンク・メカニズムは使用されません。
(*1)
C++ エディションの場合、CPP_CG::Configuration:ClassesPerCGCall
C エディションの場合、C_CG::Configuration:ClassesPerCGCall
なお、ClassesPerCGCall は Rhapsody 7.5.3 から導入されました。 Rhapsody 7.5.3 以前の製品をお使いのお客様は、本技術情報下の【その他の回避策】項目をご覧ください。
【最適値の算出方法】
コード生成中のメモリ消費量は、モデル内のクラス数 (Actor や File を含む) や各パッケージに保存されている最大クラス総数、それからパッケージの構成などの要因によって決定されます。ClassesPerCGCall の最適値をみつけるためには、まずモデル内のクラス関連要素を 5 ~ 10 のチャンクにわけるつもりで値を指定します。
例えばクラスの数が 1000 個存在する場合には、ClassesPerCGCall の値を 200 程度に設定します。その後、コード生成に要した時間とメモリ消費量を測定します。その実行結果を基準として、プロパティ値を上下させるトライ&エラー方式を通じて、お客様のプロジェクトにあった最適値を探して下さい。なお、モデル内のクラスの総数より大きい値を指定しても、結局は 1 つのチャンク内で全てのクラスを生成しようとするため、チャンク・メカニズムを有効にする意味がありません。
以下は弊社で実施したベンチマークテストの簡単な実施結果です。
スコープ内のクラス数 | 200 | 550 | 650 | 1000 | 2000 |
スコープ内のパッケージ数 | 60 | 100 | 100 | 250 | 500 |
最適値 | 50 | 50 | 50 | 200 | 200 |
【本番モデルでの実例】
プロパティ適用前 | プロパティ適用後 (ClassesPerCGCall=200) | |
メモリ消費量 | 850 MB | 230 MB |
実行タイム | 640 秒 | 600 秒 |
【その他の回避策】
Rhapsody 7.5.3 以前のバージョンをお使いの場合には、以下の回避策が考えられます。
(1) 高負荷コード生成をコマンド・ライン(RhapsodyCL.exe)から実行する。
(2) アプリケーションの仮想アドレス・サイズを 3 GB に設定する。
(3) 巨大なコンポーネントを小さなコンポーネント群へ分割する。
(1)
編集用 (GUI) と コード生成用 (コマンド・ライン) でそれぞれ独立した Rhapsody プロセスを立ち上げます。このように用途別にプロセスを起動することで、大きなリソース負荷を分散することができます。結果として、コード生成中に消費されるメモリ使用量を抑えることができます。
(2)
システムのメモリ容量にかかわらず、Windows は 4 GB の仮想アドレス・スペースを使用します。そして、2 GB をアプリケーションに、残りの 2 GB をシステムに割り当てます。「/3GB」スイッチを使用すると、Windows はアプリケーションに 3 GB を、システムに 1 GB を割り当てます。
このスイッチの使い方につきましては、Microsoft TechNet の 「Windows の /3GB 起動スイッチを設定する方法」及び 「Windows の限界に挑む: 仮想メモリ」参照してください。
(3)
もう1つの解決策として、1つのコンポーネントの中に数千のクラスを含む巨大なコンポーネントが存在する場合、そのコンポーネントを複数の小さなコンポーネントへ分割する方法があります。このような巨大コンポーネントからコード生成を実行すると、リソースの利用効率が悪化して、大きな負荷が Rhapsody へかかることになります。現在、このような巨大なコンポーネントの作成を禁止したり、明示的に制限する条項はどこにも設けられていませんが、コンポーネントのサイズを相応の大きさに保つことは、モデリングをする上でのベスト・プラクティスとして推奨されます。しかしながら、限られた時間の中でコンポーネントをモジュール化することが難しいことから、上記 3 つの解決策が好まれるケースも確実に存在します。
【よくある質問】
●64 ビット版 Windows へ Rhapsody をインストールすることで、メモリ不足の問題を解決できますか?
残念ながら、解決することはできません。確かに、64 ビット版 Windows のアドレス空間は 4 GB よりはるかに大きいです。しかし、例え Rhapsody を 64 ビット環境へインストールしたとしても、設計上の理由により、Rhapsody は 32 ビットのアプリケーションとして稼動します。そのため、消費できる最大メモリ容量もまた 2 GB へ制限されます。ただし、 Rhapsody v7.6.1 からコード生成時のリソース・パフォーマンスが改善されました。この改善により、 64 ビット環境の場合で最大 4 GB のメモリが消費できるようになりました。
Related Information
Product Synonym
Rational Rhapsody
Was this topic helpful?
Document Information
Modified date:
27 May 2022
UID
swg21567338