java.lang.OutOfMemoryError: Java heap space について

実運用環境にて「java.lang.OutOfMemoryError: Java heap space」エラーは ColdFusionの内部
エンジンであるJavaが確保するメモリが不足し、正常に処理が行えない場合に発生するエラーです。

ColdFusion Administrator で指定されている『最大 JVM ヒープサイズ (MB) 』(デフォルト 1024MB)は ColdFusion(の内部エンジンのJava仮想マシン)に割り当てられるメモリサイズとなります。ColdFusionの処理において大量のメモリを使用するような処理を行ったり、同時にリクエストが集中するような場合は、そのメモリ上限まで使用量が達するなど、メモリ不足の状態となり、「java.lang.OutOfMemoryError: Java heap space」エラーが発生致します。

 

【OutOfMemoryの症状について】
  1. ColdFusionは、起動時より定期的に実行されている処理(例えば、メールのスプール処理やスケジュールタスク管理、クライアント変数の破棄)の他、作成したアプリケーションの処理(.cfmや.cfc)などで処理の必要に応じてメモリが使用されます。メモリは ColdFusion内部のJava仮想マシンで管理され、必要に応じてサイズを拡張して、処理に使用していきます。Java仮想マシン内では、用途に応じた複数のブロックにメモリが細分され(New-Eden/Survivor-・Old)されていますが、メモリ管理はJava仮想マシン側で行われ、通常は使用状況を意識する必要はありません(参考サイト:一般ユーザーサイト)。
  2. ColdFusionの処理において大量のメモリを使用するような処理を行ったり、同時にリクエストが集中するような場合は、Java仮想マシンに割り当てられたメモリ上限まで使用量が達し、ガベージコレクション(使用されなくなったオブジェクトをメモリから破棄する処理)が行われてもほとんどメモリが開放されないような場合、OutOfMemoryが発生します

上記2.の状態が特定の一つの処理で発生する場合は、その処理が中断した以外は正常に動作する場合がありますが、複数の処理によって継続的に引き起こされた場合などは、ガベージコレクションが何度も繰り返され高いCPU負荷と無応答時間が発生する場合があります。

また、発生のタイミングによっては、ColdFusionの内部で実行されている処理に影響が生じる場合があります。例えば、メールのスプール処理が中断してしまい<cfmail>のメールの送信処理が行われない(spoolフォルダに一時ファイルが滞留し続ける)場合や、スケジュールタスクが動かなくなるなどの影響が生じる場合があります。また、OutOfMemoryが発生する状況を繰り返すような場合は、ColdFusionアプリケーションの動作が不安定な状態になり、ページが表示されない現象が発生する場合があります。

 

【発生頻度について】

実稼働環境で運用されているアプリケーション(作成した.cfmや.cfcの処理の内容、データベースなどから取得するデータ量、リクエストの頻度など)に依存するため、一概にすべての環境で現象が発生するとは限りません。ただし、ColdFusion Administratorでデフォルトととして割り当てられているサイズは、必要最小限のシステム構成に沿った値となっているため、運用されているアプリケーションの処理では不足することも考えられます。

ColdFusion 2018 Standard版では、ColdFusion ランタイムおよび ColdFusion 関連サービス用に 2 GB の RAM(4 GB 推奨)と定められています。ColdFusion Administrator で指定されている『最大 JVM ヒープサイズ (MB) 』(デフォルト 1024MB)は、最小のシステム要件に沿った値となっています
https://helpx.adobe.com/jp/coldfusion/standard/system-requirements.html

また、アプリケーション運用開始は問題がなくても、その後データが蓄積されることによって(例えば、データベースから取得するデータの上限を設けていないような場合)、運用開始から時を経て、エラーが発生するような場合もあります。

 

【対応について】

メモリを大量に使用しているような処理の内容を変える、あるいは「同時テンプレートリクエスト」数を減らすなどの方法も考えられますが、現在の『最大 JVMヒープサイズ(MB) 』のサイズだとアプリケーションの運用においてメモリが不足しているため、その値を増やすといった対応も有効な手段となります。

運用中のOSに空きメモリ(物理メモリ)がある場合は、『最大 JVM ヒープサイズ (MB) 』の数を増やして頂き、OutOfMemoryErrorの発生を回避する方法も一般的な対応方法のため、ご検討頂ければと存じます。

【注意】 OSのメモリ使用量に余裕があることを確認してください。
仮想OS環境など、割り当てメモリ量に余裕がない場合はメモリの増加を検討ください。

「参考手順」

  1. ColdFusionのAdministratorにログインして、[サーバーの設定] > [JavaとJVM]の『最大 JVM ヒープサイズ (MB)』 を変更します
     
  2. 運用環境で、メモリの割り当てが重要な場合は、『最小 JVM ヒープサイズ (MB)』を『最大 JVM ヒープサイズ (MB)』 と同じサイズに指定し、起動直後から上限のメモリを確保する方法についても検討してください
    • ヒープサイズの変更を反映するためにColdFusion の再起動が必要となりますので、運用中のサービスに影響がないタイミングに作業を行ってください
       
  3. 再起動後、アプリケーションの動作を確認し、引き続き OutOfMemoryError: Java heap space が発生する場合は、さらにサイズを変更するか、アプリケーションの処理の見直しを検討します

 

【heap spaceの計測について】

ColdFusion Administratorの[デバックとロギング] > [デバック出力の設定]「メトリクスのロギングを有効にする」のチェックボックスを有効にすると、「メトリクスの頻度」で指定された間隔で[CF_Home]/cfusion/logs/metrics.logに最大スレッド数、現在のスレッド数、ビジースレッド、最大処理時間、要求数、エラー数、空きメモリ、合計メモリ、アクティブセッション数を書き出すことができます
https://helpx.adobe.com/coldfusion/kb/coldfusion10-enable-metric-logging.html

【例】
"Information","scheduler-1","10/10/19","14:35:57","","Max threads: 200 Current thread count: 10 Current thread busy: 0 Max processing time: 22689 Request count: 85 Error count: 0 Bytes received: 679 Bytes sent: 1087276 Free memory: 291961360 Total memory: 466616320 Active Sessions: 0"

「Total memory」が、ヒープとして確保されているメモリサイズ、「Free memory」は確保されている中で使用が可能なメモリサイズとなります。使用ヒープサイズやスレッド数の増減を確認することが可能です。

ColdFusion 2018 では『パフォーマンス管理ツールセット(別のインストーラーで提供されているソフトウェア)』、ColdFusion 2016以前では Enterprise版でのみ使用可能な『サーバーモニター』でも測定が可能です

 

【メモリを大量に使用する処理について】

ColdFusion で、以下のような処理を行っている場合、処理に十分なメモリサイズを指定しているかを確認してください

  • <cfquery> の Maxrowsを指定していないクエリで、一度に大量のレコードを取得している処理
  • 「アプリケーション変数」「セッション変数」に大量のデータを格納している処理
  • SpreadSheet系の処理で、サイズの大きいxlsxファイルに対する読み込みや書き込み処理
  • 長時間の実行が予測される「スケジュールタスク」処理。例えば、日次バッチ的な処理
  • <cffile>でファイルサイズの大きいファイルを読み込む処理
  • <cffile>やSpreadSheet系の処理で、大量のデータを書き込む処理(ヒープ以外にも ネイティブ領域で管理されるC heapやMetaspaceメモリの圧迫にも注意が必要です)

 


記事公開日:2019年11月25日
最終更新日:2019年11月25日

 


x

Sample Modal Window

This is just a sample…

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent suscipit iaculis libero sed tristique. Quisque mollis dolor non tellus placerat vitae sodales lectus porta. Curabitur ut suscipit tellus. Maecenas rhoncus, ante vitae vehicula vestibulum, metus sapien dapibus tellus, et mattis dolor neque vitae nisl. Nullam eleifend ultrices ipsum eget pretium. Curabitur semper metus ut ante adipiscing nec volutpat sem rutrum. Nullam a nisi lacus, non interdum ante. Vivamus ante augue, commodo vel egestas sed, pharetra nec dui. Quisque sed tellus felis. Donec ipsum mauris, sagittis eu accumsan in, aliquam non ipsum.

Vestibulum tempor nunc nec felis scelerisque eget elementum erat dignissim. Ut vel ipsum mollis orci venenatis luctus. Aenean vehicula quam vel quam porttitor ac iaculis elit pulvinar. Proin consequat, ipsum eu venenatis semper, justo turpis posuere tortor, ac placerat metus nisl et lectus. Nulla cursus dui id nunc ullamcorper sed semper nisl lobortis. Aliquam erat volutpat. Phasellus arcu ante, imperdiet in ornare sed, laoreet eu massa.