1

CF 8サーバーで「OutOfMemoryError:PermGenspace」エラーが発生しました。私のアプリでは、1000個のテンプレートが(テスト目的で)同じローカル変数にロードされたため、次のテンプレートがロードされると、前のテンプレートがGCで使用できるようになりますが、これは発生しません。メモリダンプを取得し、jhatで確認しました。私が見たのは、それぞれが独自のTemplateClassLoaderインスタンスを持つ数千のテンプレートをロードすることでした。TemplateClassLoader自体には、すべてのTemplateClassLoaderインスタンスへの静的参照があります(これもjhatからのものです)。おそらくこれが原因で、インスタンスはメモリに保持されているため、クラスオブジェクトをpermgenでGCにすることはできません。

この「メモリの保持」は、ロードされた後にテンプレートでcfscript関数を呼び出した場合にのみ発生します。テンプレートをロードしただけで関数を呼び出さなかった場合、クラスオブジェクトはGCされ、OOMエラーは発生しません。

TemplateClassLoaderの(表示された)静的参照で何が起こっているのか考えてみてください。

4

1 に答える 1

2

私はそれを理解しました。CF 管理ページの [サーバー設定] > [キャッシュ] には、[キャッシュされたテンプレートの最大数] フィールドがあります。LRU キャッシュに含めるテンプレートの数を制御します。テンプレートがそのキャッシュにある場合、Java クラス オブジェクトへの強い参照があり、GC できません。私の CF セットアップでは、デフォルト値の 1024 を使用しています。これが、私のテストで 1000 個の一意のテンプレートが GC されない理由です。

ここにもう少し情報があります: http://blogs.sanmathi.org/ashwin/2006/07/12/tangling-with-the-template-cache/

于 2011-10-04T13:19:07.940 に答える