- ถึงความรู้ของฉันพื้นที่ Heap ถูกครอบครองโดยตัวแปรอินสแตนซ์เท่านั้น หากถูกต้องเหตุใดจึงเกิดข้อผิดพลาดหลังจากทำงานได้ดีในบางครั้งเนื่องจากมีการจัดสรรพื้นที่สำหรับตัวแปรอินสแตนซ์ในขณะที่สร้างวัตถุ
นั่นหมายความว่าคุณกำลังสร้างวัตถุเพิ่มเติมในแอปพลิเคชันของคุณในช่วงเวลาหนึ่งอย่างต่อเนื่อง วัตถุใหม่จะถูกเก็บไว้ในหน่วยความจำฮีปและนั่นคือสาเหตุของการเติบโตในหน่วยความจำฮีป
ฮีปไม่เพียง แต่มีตัวแปรอินสแตนซ์ มันจะจัดเก็บชนิดข้อมูลที่ไม่ใช่พื้นฐาน (Objects) ทั้งหมด อายุการใช้งานของวัตถุเหล่านี้อาจสั้น (บล็อกวิธีการ) หรือยาว (จนกว่าวัตถุจะถูกอ้างอิงในแอปพลิเคชันของคุณ)
- มีวิธีใดในการเพิ่มพื้นที่ฮีปหรือไม่?
ใช่. ดูบทความ Oracle นี้เพื่อดูรายละเอียดเพิ่มเติม
มีพารามิเตอร์สองตัวสำหรับการตั้งค่าขนาดฮีป:
-Xms:ซึ่งกำหนดขนาดฮีปเริ่มต้นและต่ำสุด
-Xmx:ซึ่งกำหนดขนาดฮีปสูงสุด
- ฉันควรทำการเปลี่ยนแปลงอะไรกับโปรแกรมของฉันเพื่อที่จะใช้พื้นที่ฮีปน้อยลง
ขึ้นอยู่กับใบสมัครของคุณ
ตั้งค่าหน่วยความจำฮีปสูงสุดตามความต้องการของแอปพลิเคชันของคุณ
อย่าทำให้หน่วยความจำรั่วไหลในแอปพลิเคชันของคุณ
หากคุณพบการรั่วไหลของหน่วยความจำในแอปพลิเคชันของคุณให้ค้นหาสาเหตุที่แท้จริงด้วยความช่วยเหลือของเครื่องมือสร้างโปรไฟล์เช่นMAT , Visual VM , jconsoleเป็นต้นเมื่อคุณพบสาเหตุที่แท้จริงแล้วให้แก้ไขการรั่วไหล
หมายเหตุสำคัญจากบทความ oracle
สาเหตุ: ข้อความรายละเอียดพื้นที่ฮีป Java ระบุว่าไม่สามารถจัดสรรอ็อบเจ็กต์ในฮีป Java ได้ ข้อผิดพลาดนี้ไม่ได้หมายความว่าหน่วยความจำรั่วเสมอไป
สาเหตุที่เป็นไปได้:
- การกำหนดค่าที่ไม่เหมาะสม (ไม่ได้จัดสรรหน่วยความจำที่เพียงพอ)
- แอ็พพลิเคชันถือการอ้างอิงถึงอ็อบเจ็กต์โดยไม่ได้ตั้งใจและป้องกันไม่ให้อ็อบเจ็กต์ถูกเก็บรวบรวม
- แอปพลิเคชันที่ใช้โปรแกรมสุดท้ายมากเกินไป หากคลาสมีวิธีการสรุปวัตถุประเภทนั้นจะไม่มีการเรียกคืนพื้นที่ในเวลารวบรวมขยะ ถ้าด้าย finalizer ไม่สามารถให้ทันกับคิวสรุปแล้วกอง Java สามารถเติมและชนิดของข้อยกเว้น OutOfMemoryError นี้จะถูกโยน
ในบันทึกอื่นให้ใช้อัลกอริทึมการรวบรวมขยะที่ดีกว่า ( CMSหรือG1GC )
ลองดูคำถามนี้เพื่อทำความเข้าใจ G1GC