Posts Tagged ‘ SpringFramework

SpringFramework java.lang.OutOfMemoryError: Java heap space on Tomcat 6

เนื่องจากมีโอกาสในการนำ Spring Framework ไปรันใน Web Service Tomcate 6.0.x ซึ่งใช้งานผ่านจาก Eclipse ตอนสั่ง Start Server (Deploy) จะใช้เวลานานมาก และ ขั้นตอนในการ Initialized bean จะเกิด ข้อผิดพลาดดังนี้

SEVERE: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener
...... Invocation of init method failed; nested exception is java.lang.OutOfMemoryError: Java heap space
	at org.springframework.beans.factory.support. AbstractAutowireCapableBeanFactory. initializeBean(AbstractAutowireCapableBeanFactory.java:1412)
......
	at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289)
	at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414)
Caused by: java.lang.OutOfMemoryError: Java heap space
	at java.util.HashMap.addEntry(HashMap.java:753)
	at java.util.HashMap.put(HashMap.java:385)
	at java.util.HashMap.putAll(HashMap.java:524)
......
	at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045

จากความรู้ที่ผ่านๆ มาก็ต้องขยายขนาดของ heap space กันหน่อย อันดับแรกเลยไปแก้ที่ไฟล์

Tomcat.x.x\bin\catalina.bat

โดยเพิ่มบรรทัดต่อไปนี้บนสุดของไฟล์ (หลัง comment) ถ้าเป็น Linux , UNIX ก็ ใช้ catalina.sh

set JAVA_OPTS = "-server -Xms512m -Xmx512m -XX:PermSize=256m -XX:MaxPermSize=256m -XX:+DisableExplicitGC"

และก็คิดว่าน่าจะทำงานได้ปกติไม่มีปัญหาอะไร แต่พอลอง start server ใหม่ ผลที่ตามมาคือ ไม่แตกต่างจากเดิมเลยครับ ทำเอา งง ไปสักพัก กำหนดอะไรผิดหรือเปล่าเพิ่งมาคิดได้ว่า เนื่องจากทำการ Start Server จาก Eclipse ดังนั้นค่าที่กำหนดใน catalina.bat อาจไม่ได้ช่วยอะไร หรือ ไม่มีผล (รวมทั้ง กำหนดผิดเองหรือเปล่า แต่ที่ผ่านๆมาได้ปกติ ถ้า Start Server โดยไม่ผ่าน Eclipse) พอคิดได้แบบนั้นก็ เอาละ ใส่เข้าไปใน JVM ตอน start ซะเลยสิ้นเรื่อง ก็ทำดังรูป

สามารถทำงานได้ปกติ เป็นอันจบปัญหาเบื้องต้นไป ซึ่งผมเองก็ไม่แน่ใจว่าเป็นทางแก้ไขที่ดีมากน้อยแค่ไหน เพราะงานมันเร่งให้แก้ไขแบบนี้ไปก่อน เดียวพอมีเวลาเหลือแล้วจะมาลองหาวิธีการอื่นๆ ดู