คนอื่น ๆ ได้ให้คำแนะนำเกี่ยวกับวิธีตรวจสอบการใช้งานหน่วยความจำ ...
สมมติว่าฉันมีเซิร์ฟเวอร์แอพ Tomcat สองตัวในการผลิตโหลดบาลานซ์ตั้งค่าไว้ด้านหลัง หากฉันเห็นสถิติหน่วยความจำ jvm ฉันสามารถบอก load balance ให้หยุดส่งคำขอไปยังเซิร์ฟเวอร์ซึ่งจะพบปัญหา OOM ทำให้เหมาะสมหรือไม่
เรียงจาก แต่มันก็ไม่ได้เป็นวิธีที่ดีที่สุดในการแก้ปัญหาของคุณ
ยอมให้ย้อนกลับไปที่รากของปัญหา ... OOME ในบริบทของ Tomcat OOME มีแนวโน้มที่จะเกิดจากหนึ่งในสาเหตุต่อไปนี้:
- หน่วยความจำรั่วในแอปพลิเคชันของคุณ (หรืออาจเป็น Tomcat เอง)
- พยายามประมวลผลคำขอมากเกินไปพร้อมกันในแต่ละ Tomcat หรือ
- คำขอแต่ละรายการที่ต้องการหน่วยความจำมากเกินไประหว่างการประมวลผล
ในการแก้ปัญหาของคุณอันดับแรกคุณต้องค้นหาว่าสิ่งใดเกิดขึ้น ... เพราะวิธีการแก้ปัญหานั้นแตกต่างกันสำหรับแต่ละปัญหา
1) เพื่อดูว่านี่เป็นหน่วยความจำรั่วหรือไม่คุณต้องใช้เครื่องมือวิเคราะห์หน่วยความจำเพื่อตรวจสอบรูปแบบการใช้หน่วยความจำระยะยาว นี่อาจจะแสดงรูปแบบฟันเลื่อย ... ซึ่งเป็นเรื่องปกติ สิ่งที่คุณต้องมองหาคือระดับของพื้นผิวของ "ฟัน" ที่มีแนวโน้มสูงขึ้นเมื่อเวลาผ่านไป นั่นบ่งชี้ว่ามีบางอย่างกำลังสร้างขยะที่ไม่สามารถรวบรวมได้ เช่นหน่วยความจำรั่ว
หากคุณมีหน่วยความจำรั่ววิธีที่ดีที่สุดคือการหาว่าส่วนใดของรหัสที่คุณรับผิดชอบและแก้ไข สิ่งอื่นใด ... รวมถึง load balancing ... เป็นโซลูชัน bandaid และอาจนำไปสู่ปัญหาที่แย่กว่าเดิมในการติดตาม
2) เมื่อมีการขจัดหน่วยความจำรั่วคุณต้องพิจารณาว่าปัญหาคือคุณกำลังประมวลผลคำขอมากเกินไปในคราวเดียวหรือไม่ ฉันไม่แน่ใจว่าวิธีที่ดีที่สุดในการทำเช่นนั้น แต่ถ้าเป็นปัญหา (หรือคุณสงสัยว่าเป็น) แล้วมีวิธีแก้ปัญหาที่เป็นไปได้:
ปรับการกำหนดค่าเซิร์ฟเวอร์ Tomcat เพื่อลดจำนวนเธรดผู้ปฏิบัติงาน
หากคำขอของคุณเป็น I / O ที่ถูกผูกไว้ความเป็นไปได้อีกอย่างหนึ่งก็คือการดูการสนับสนุนการจัดการคำขอแบบอะซิงโครนัสที่มีอยู่ในข้อกำหนด Servlet รุ่นล่าสุด - ดูที่http://docs.oracle.com/javaee/7/tutorial/doc/ servlets012.htm แต่นั่นจะทำงานได้มากขึ้น
3) หากปัญหาปรากฏว่าคำขอบางคำขอใช้หน่วยความจำมากเกินไปคุณต้องหาวิธีตรวจสอบคำขอเหล่านั้นก่อนส่งและ "จัดการกับพวกเขา" ทั้งการตรวจจับและจัดการกับคำขอเหล่านี้อาจเป็นเรื่องยาก ... และเป็นการยากที่จะให้คำแนะนำหากไม่มีรายละเอียดใบสมัครของคุณ แต่สองวิธีแก้ปัญหาในทางปฏิบัติคือ:
ส่งต่อคำขอที่ผิดปกติไปยังเซิร์ฟเวอร์อื่นด้วยกองใหญ่ ... ซึ่ง OOME จะไม่รบกวนการร้องขอ "ปกติ"
เพิ่มขนาดฮีพ หากคุณมีหน่วยความจำกายภาพเพียงพอการรันด้วยฮีปที่ใหญ่ขึ้นจะทำให้เซิร์ฟเวอร์ Tomcat ของคุณมีประสิทธิภาพมากขึ้น ... และหลีกเลี่ยง OOME
โดยสรุปแทนที่จะพยายามโหลดยอดเงินเพื่อหลีกเลี่ยง OOME ฉันขอแนะนำให้คุณหาสาเหตุที่ทำให้คุณได้รับ OOME ... และพยายามจัดการกับสาเหตุของ OOME โดยตรง