2011-09-29 51 views
1

我的CF 8服務器上出現「OutOfMemoryError:PermGen space」錯誤。 在我的應用程序中,1000個模板被加載到相同的局部變量中(用於測試目的),因此一旦下一個加載,之前的一個應該可用於GC - 但這不會發生。 我得到了內存轉儲,並用jhat查看它。我看到的是它加載了1000個模板,每個模板都有自己的TemplateClassLoader實例。在TemplateClassLoader中,它自身有一個對所有TemplateClassLoader實例的靜態引用(同樣來自jhat)。可能因爲這個原因,這些實例被保存在內存中,所以類對象不能成爲permgen中的GC。Coldfusion TemplateClassLoader是否支持類加載器實例?

只有當我在模板中調用cfscript函數後,纔會發生這種「內存佔用」。如果我只加載模板但不調用該函數,則類對象將被GCed並且不會發生OOM錯誤。

任何想法在TemplateClassLoader上(出現)靜態引用發生了什麼?

回答

2

我已經想通了。 在CF管理頁面的服務器設置>緩存中有一個字段「最大緩存模板數量」。它控制着LRU緩存中應該有多少個模板。如果模板位於該緩存中,則會強烈引用java類對象,並且不能被GCed。 在我的CF設置中,它使用默認值1024.這就是爲什麼在我的測試中,1000個獨特模板沒有得到GCed。

有一點這裏更多的信息: http://blogs.sanmathi.org/ashwin/2006/07/12/tangling-with-the-template-cache/

+0

我碰到這個尋找的理由來爲什麼Eclipse的MAT說「的‘coldfusion.runtime.TemplateClassLoader’佔據242105472個字節3421個實例」。看起來這是模板緩存。謝謝。 –