Wednesday, June 01, 2005

Tapestry and OutOfMemoryError

อ่านพบใน mailing list ของ Tapestry
ว่ามีคนสั่ง start server ด้วย parameter
-Dorg.apache.tapestry.disable-caching=ture
แล้วเกิด OutOfMemory ขึ้น

ตัว parameter disable-caching โดยปกติจะมีค่าเป็น false
ซึ่งหมายความว่าทุกๆ page นั้นจะมี การ cache page
เก็บไว้ใน page pool
เมื่อมี request มาก็จะดึง page object จาก pool
ออกมาแจกงานให้ทำ
โดยวัตถุประสงค์ของ cache ก็คือ เพื่อลดเวลา
ที่ต้องเสียไปในการ initialize page object
ทุกครั้งที่ request วิ่งเข้ามา

ในกรณีที่ developer มีการแก้ไขค่าใน html template
หรือ page specification บ่อยๆ ก็สามารถ
disable-caching เพื่อที่จะได้ไม่ต้อง restart web application กันบ่อยๆ

ประเด็นว่าทำไมจึงเกิด OOME (out of memory error)
มีคนคาดเดาว่า น่าจะเป็นที่ Permanent heap
เกิดเต็มขึ้นมา (ตัว Permanent Heap เป็นที่เก็บ
classes, types) ส่วนสาเหตุที่เต็มก็อาจเป็นเพราะ
ทุกครั้งที่เกิดการ setup page จะเกิดการสร้าง
Enhance Class จาก Page Class เดิม (dynamic extends)
ซึ่งน่าจะเป็นสาเหตุให้ Permanent Heap เต็มได้

ทางแก้ไม่มี (ถือเป็นกรรมของ developer
ว่าให้คิดก่อนแก้ อย่าแก้เล็กแก้น้อยบ่อยๆ)
แต่มีการแนะนำให้ยืดเวลาก่อนเต็มออกไปได้โดย
ระบุ parameter ของ jvm ในส่วนของ
-XX:MaxPermSize (default 64MB)

Related link from Roti

No comments: