Computer >> คอมพิวเตอร์ >  >> การแก้ไขปัญหา >> Linux

แก้ไข:เกิดข้อผิดพลาดระหว่างการเริ่มต้น VM ไม่สามารถจองพื้นที่เพียงพอสำหรับวัตถุ heap

แม้ว่าแอปเพล็ต Java จะไม่ใช่เทคโนโลยีเว็บยอดนิยมในปัจจุบัน แต่ก็ยังมีเหตุผลมากมายที่จะปรับใช้ Java Virtual Machine บนเซิร์ฟเวอร์ Linux โดยตรง หากคุณพยายามเรียกใช้คำสั่ง Linux java ทั้งบนฮาร์ดแวร์แบบแยกหรือภายใน VM ของตัวเอง คุณอาจได้รับข้อความ “ข้อผิดพลาดเกิดขึ้นระหว่างการเริ่มต้น VM ไม่สามารถจองพื้นที่เพียงพอสำหรับข้อความฮีปของวัตถุ

นี่อาจดูค่อนข้างแปลกเพราะคุณน่าจะมี RAM เพียงพอที่จะเรียกใช้คำสั่ง แต่ส่วนใหญ่เป็นเพราะมุมแหลมที่เฉพาะเจาะจงในลักษณะที่หน้าหน่วยความจำจริงและเสมือนถูกนำมาใช้ การระบุขนาดที่ค่อนข้างใหญ่บางขนาดจะช่วยให้คุณสามารถข้ามข้อความนี้ไปโดยสิ้นเชิงและเรียกใช้คำสั่ง java ในลักษณะเดียวกับที่คุณทำกับอย่างอื่น

วิธีที่ 1:การใช้ตัวเลือกบรรทัดคำสั่ง

หากคุณได้ลองใช้จาวาและได้รับข้อความนี้ แสดงว่าคุณอาจได้เรียกใช้คำสั่งฟรีเพื่อให้แน่ใจว่ามีหน่วยความจำเพียงพอสำหรับเรียกใช้โปรแกรม

แก้ไข:เกิดข้อผิดพลาดระหว่างการเริ่มต้น VM ไม่สามารถจองพื้นที่เพียงพอสำหรับวัตถุ heap

โปรดสังเกตว่าในเครื่องทดสอบของเรา เรามี RAM จริง 2.3 GB และยังไม่มีการใช้หน่วยความจำเสมือนหน้าเดียว หากคุณสังเกตเห็นว่าคุณมีหน่วยความจำไม่เพียงพอ คุณจะต้องปิดสิ่งอื่น ๆ ที่คุณกำลังทำงานอยู่ก่อนที่จะลองอีกครั้ง ในทางกลับกัน ผู้ที่พบว่ามีหน่วยความจำว่างเพียงพอสามารถลองระบุขนาดได้โดยตรง

ตัวอย่างเช่น บนเครื่องของเรา เราสามารถเรียกใช้คำสั่งเป็น java -Xms256m -Xmx512M และมันทำงานเหมือนที่คาดหวังไว้เป็นอย่างอื่น สิ่งนี้จำกัดขนาดฮีปที่เครื่องเสมือน Java พยายามจองเมื่อเริ่มทำงาน เนื่องจากเครื่องเสมือนที่ไม่ถูกจำกัดอาจทำสิ่งผิดปกติโดยสมมุติฐาน จึงอาจแสดงข้อความแสดงข้อผิดพลาดบนระบบที่ว่างอย่างอื่น คุณอาจต้องการลองใช้ค่าทั้งสองนี้ก่อนที่จะพบชุดค่าผสมที่เหมาะสม

นี่อาจเป็นปัญหาได้ไม่ว่าคุณจะใช้งานอะไรอยู่ก็ตาม เนื่องจาก JVM ไม่มีส่วนเกี่ยวข้องกับประเภทของ VM ที่คุณอาจใช้เพื่อเรียกใช้ GNU/Linux

วิธีที่ 2:การส่งออกตัวแปรเพื่อทำให้การเปลี่ยนแปลงเป็นแบบถาวร

เมื่อคุณพบค่าที่ใช้งานได้ คุณสามารถส่งออกค่าดังกล่าวเพื่อทำให้เป็นค่าถาวรสำหรับเซสชันนั้น ตัวอย่างเช่น เราใช้ export _JAVA_OPTIONS='-Xms256M -Xmx512M' จากพรอมต์คำสั่ง bash และอนุญาตให้เราเรียกใช้คำสั่ง java ได้ด้วยตัวเองโดยไม่มีตัวเลือกอื่นใด จนกว่าเราจะออกจากระบบเซิร์ฟเวอร์ของเรา

จำเป็นต้องเรียกใช้อีกครั้งเมื่อเราเข้าสู่ระบบในเซสชันอื่น ดังนั้นคุณอาจต้องการเพิ่มลงในสคริปต์เริ่มต้นที่เกี่ยวข้องหากคุณวางแผนที่จะใช้คำสั่ง java ค่อนข้างบ่อย เราเพิ่มบรรทัดลงในไฟล์ .bash_login และดูเหมือนว่าจะใช้งานได้ทุกครั้งที่เราใช้พรอมต์การเข้าสู่ระบบโดยไม่ต้องเรียกใช้อีกครั้ง แม้ว่าคุณอาจต้องค้นหาตำแหน่งอื่นหากคุณทำงานกับเชลล์อื่น

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

วิธีที่ 3:การพิมพ์ตัวเลือก Java ปัจจุบัน

หากคุณเคยทำงานที่บรรทัดคำสั่งและต้องการอ้างอิงอย่างรวดเร็วถึงสิ่งที่คุณได้ตั้งค่า _JAVA_OPTIONS ไว้เป็นปัจจุบัน ให้เรียกใช้ echo $_JAVA_OPTIONS แล้วระบบจะพิมพ์ค่าปัจจุบันออกมาทันที ซึ่งมีประโยชน์สำหรับการแก้ปัญหาเมื่อคุณพยายามหาตัวเลขที่เหมาะสมที่จะลอง

โปรดจำไว้ว่าในขณะที่การแก้ไขนี้ไม่ต้องการการเล่นอื่นใด Java จะทิ้งข้อความ "ไม่สามารถสำรองพื้นที่เพียงพอสำหรับอ็อบเจกต์ฮีป" หากคุณพบว่าตัวเองอยู่ในจุดสิ้นสุดของหน่วยความจำเสมือนแบบสั้น หากเป็นกรณีนี้ คุณจะต้องตรวจสอบอีกครั้งว่ากระบวนการใดกำลังทำงานอยู่และอาจรีสตาร์ทเซิร์ฟเวอร์หากเป็นตัวเลือก คุณยังสามารถสร้างพื้นที่สว็อปเพิ่มเติมได้ แต่ถ้านี่เป็นปัญหา ให้ลองแก้ไขด้วยวิธีอื่นโดยทั่วไปดีกว่า

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