การกำหนดค่า Heap Memory โดย -Xms และ -Xmx เป็นหนึ่งในการตั้งค่าพื้นฐานที่สำคัญที่สุดในการจูนประสิทธิภาพของ Java Application โดยทั้งสองตัวนี้ใช้สำหรับกำหนดขนาดของ Heap Memory ซึ่งเป็นพื้นที่หน่วยความจำที่ Java ใช้เก็บ Object ต่าง ๆ ที่ถูกสร้างขึ้นระหว่างการทำงาน
ความหมายของพารามิเตอร์
-Xms: คือการกำหนด “ขนาดหน่วยความจำเริ่มต้น” ที่ Java Virtual Machine จะจองไว้ทันทีเมื่อเริ่มรันโปรแกรม-Xmx: คือการกำหนด “ขนาดหน่วยความจำสูงสุด” ที่ JVM ได้รับอนุญาตให้ขยาย Heap Memory ออกไปได้ หากใช้หน่วยความจำเกินค่านี้ โปรแกรมจะเกิด Error ยอดฮิตคือjava.lang.OutOfMemoryError: Java heap space
วิธีการกำหนดค่าและหน่วยที่ใช้
การกำหนดค่าจะใส่ต่อท้ายพารามิเตอร์โดยไม่มีเว้นวรรค และสามารถระบุหน่วยความจำได้ดังนี้
kหรือK= KilobytesmหรือM= MegabytesgหรือG= Gigabytes
ตัวอย่างคำสั่ง
java -Xms512m -Xmx2g -jar my-application.jar
ความหมาย: โปรแกรมนี้จะเริ่มทำงานโดยจอง RAM ไว้ที่ 512 Megabytes และอนุญาตให้ใช้ RAM เพิ่มขึ้นได้สูงสุดไม่เกิน 2 Gigabytes
แนวทางปฏิบัติที่ดีที่สุด
- ตั้งค่า
-Xmsและ-Xmxให้เท่ากัน : การตั้งค่าให้เริ่มต้นและสูงสุดมีค่าเท่ากัน เป็นที่นิยมมากในระบบ Production เพราะจะช่วยลด Overhead ของระบบที่ต้องมาคอยคำนวณเพื่อขอ RAM เพิ่ม หรือคืน RAM กลับให้ OS ในระหว่างที่โปรแกรมกำลังทำงานหนัก - อย่าตั้งค่า
-Xmxเต็ม 100% ของ RAM ในเครื่อง: JVM ไม่ได้ใช้แค่ Heap Memory เพียงอย่างเดียว แต่ยังมีการใช้ RAM สำหรับส่วนอื่น ๆ ด้วย นอกจากนี้ยังต้องเผื่อพื้นที่ให้ Operating System ทำงานด้วย
สูตรเบื้องต้น: โดยทั่วไปแนะนำให้ตั้ง-Xmxไว้ที่ไม่เกิน 70-80% ของ RAM ทั้งหมดในระบบ - สังเกตพฤติกรรมผ่าน Garbage Collection : หากตั้ง
-Xmxน้อยเกินไป JVM จะต้องเรียกทำงาน Garbage Collector บ่อยมาก ทำให้ CPU ทำงานหนักและโปรแกรมช้าลง แต่ถ้าตั้งไว้ใหญ่เกินไป เวลา GC ทำงานแต่ละรอบอาจจะใช้เวลานานจนทำให้โปรแกรมค้างชั่วขณะได้
อ่านเเพิ่มเติม