ไม่สามารถสำรองพื้นที่เพียงพอสำหรับ Object Heap

1. ภาพรวม

ในบทช่วยสอนนี้เราจะเรียนรู้สาเหตุของข้อผิดพลาด“ ไม่สามารถจองพื้นที่เพียงพอสำหรับการฮีปวัตถุ”ในขณะที่ต้องดำเนินการตามสถานการณ์

2. อาการ

“ ไม่สามารถจองพื้นที่เพียงพอสำหรับฮีปอ็อบเจ็กต์” เป็นข้อผิดพลาดเฉพาะของ JVM ที่เพิ่มขึ้นเมื่อกระบวนการ Java ไม่สามารถสร้างเครื่องเสมือนได้เนื่องจากข้อ จำกัด ของหน่วยความจำที่พบในระบบที่รันอยู่:

java -Xms4G -Xmx4G -jar HelloWorld.jar Error occurred during initialization of VM Could not reserve enough space for object heap Error: Could not create the Java Virtual Machine. Error: A fatal exception has occurred. Program will exit.

โดยทั่วไปมีสองสถานการณ์ที่เป็นไปได้เมื่อเราพบข้อผิดพลาด

ประการแรกเมื่อเรารับประทานอาหารกลางวันกระบวนการ Java กับสูงสุดกองขีด จำกัด ของขนาดพารามิเตอร์ ( -Xmx )และความคุ้มค่าเป็นมากกว่าสิ่งที่กระบวนการสามารถมีอยู่ในระบบปฏิบัติการ

ขีด จำกัด ขนาดฮีปแตกต่างกันไปตามข้อ จำกัด หลายประการ:

  • สถาปัตยกรรมฮาร์ดแวร์ (32/64 บิต)
  • เวอร์ชัน JVM บิต (32/64 บิต)
  • ระบบปฏิบัติการที่เราใช้

ประการที่สองเมื่อกระบวนการ Java ไม่สามารถสำรองหน่วยความจำตามจำนวนที่ระบุได้เนื่องจากแอปพลิเคชันอื่น ๆ ที่ทำงานบนระบบเดียวกันและใช้หน่วยความจำ

3. ขนาดกอง

Java heap space คือพูลการจัดสรรหน่วยความจำสำหรับรันไทม์โปรแกรม Java ที่จัดการโดย JVM เอง ตามค่าเริ่มต้นพูลการจัดสรรถูก จำกัด ไว้ที่ขนาดเริ่มต้นและขนาดสูงสุด หากต้องการเรียนรู้เพิ่มเติมเกี่ยวกับ Heap Space ใน Java โปรดอ่านบทความนี้ที่นี่

มาดูกันว่าขนาดฮีพสูงสุดในสภาพแวดล้อมต่างๆเป็นเท่าใดและเราจะกำหนดขีด จำกัด ได้อย่างไร

3.1. ขนาดกองสูงสุด

ขีด จำกัด ฮีปทางทฤษฎีสูงสุดสำหรับ JVM 32 บิตและ 64 บิตนั้นง่ายต่อการตรวจสอบโดยดูจากพื้นที่หน่วยความจำที่มีอยู่ 2 ^ 32 (4 GB) สำหรับ JVM 32 บิตและ 2 ^ 64 (16 Exabytes) สำหรับ 64- JVM บิต

ในทางปฏิบัติเนื่องจากข้อ จำกัด ต่างๆขีด จำกัด อาจต่ำกว่ามากและแตกต่างกันไปตามระบบปฏิบัติการ ยกตัวอย่างเช่นบนระบบ Windows 32 บิตช่วงขนาดกองสูงสุดอยู่ระหว่าง 1.4 GB 1.6 GB ในทางตรงกันข้ามบนระบบ Linux 32 บิตขนาดฮีปสูงสุดสามารถขยายได้ถึง 3 GB

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

3.2. จะควบคุมขีด จำกัด ขนาดฮีปได้อย่างไร?

เรามีสองตัวเลือกในการควบคุมขีด จำกัด ขนาดฮีปของ JVM

ขั้นแรกโดยใช้พารามิเตอร์บรรทัดคำสั่ง Java ในการเริ่มต้น JVM แต่ละครั้ง:

-Xms Sets initial Java heap size. This value must be a multiple of 1024 and greater than 1 MB. -Xmx Sets maximum Java heap size. This value must be a multiple of 1024 and greater than 2 MB. -Xmn Sets the initial and maximum size (in bytes) of the heap for the young generation.

สำหรับค่าขนาดเราอาจต่อท้ายตัวอักษรkหรือK , mหรือMและgหรือGเพื่อระบุกิโลไบต์เมกะไบต์และกิกะไบต์ตามลำดับ หากไม่มีการระบุตัวอักษรจะใช้หน่วยเริ่มต้น (ไบต์)

-Xmn2g -Xmn2048m -Xmn2097152k -Xmn2147483648

ประการที่สองโดยใช้ตัวแปรสภาพแวดล้อมJAVA_OPTSเพื่อกำหนดค่าเหนือพารามิเตอร์บรรทัดคำสั่ง Java ทั่วโลก ด้วยเหตุนี้การเริ่มต้น JVM แต่ละรายการบนระบบจะใช้การกำหนดค่าที่ตั้งไว้ในตัวแปรสภาพแวดล้อมโดยอัตโนมัติ

JAVA_OPTS="-Xms256m -Xmx512m"

สำหรับข้อมูลเพิ่มเติมโปรดดูคู่มือพารามิเตอร์ JVM ที่ครอบคลุมของเรา

4. สรุป

ในการกวดวิชานี้เราพูดถึงสองสถานการณ์ที่เป็นไปได้เมื่อ JVM จะไม่สามารถจองพื้นที่เพียงพอสำหรับวัตถุกอง นอกจากนี้เรายังได้เรียนรู้วิธีควบคุมขีด จำกัด ขนาดฮีปเพื่อลดข้อผิดพลาดนี้

จากนั้นเรียนรู้เพิ่มเติมเกี่ยวกับปัญหาหน่วยความจำที่อาจเกิดขึ้นในขณะรันไทม์และวิธีการระบุ