การกำหนดค่า Heap Memory โดย -Xms และ -Xmx เป็นหนึ่งในการตั้งค่าพื้นฐานที่สำคัญที่สุดในการจูนประสิทธิภาพของ Java Application โดยทั้งสองตัวนี้ใช้สำหรับกำหนดขนาดของ Heap Memory ซึ่งเป็นพื้นที่หน่วยความจำที่ Java ใช้เก็บ Object ต่างๆ ที่ถูกสร้างขึ้นระหว่างการทำงาน
ความหมายของพารามิเตอร์
-Xms( Initial Heap Size ): คือการกำหนด “ขนาดหน่วยความจำเริ่มต้น” ที่ Java Virtual Machine ( JVM ) จะจองไว้ทันทีเมื่อเริ่มรันโปรแกรม-Xmx( Maximum Heap Size ): คือการกำหนด “ขนาดหน่วยความจำสูงสุด” ที่ 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
แนวทางปฏิบัติที่ดีที่สุด ( Best Practices )
- ตั้งค่า
-Xmsและ-Xmxให้เท่ากัน ( สำหรับ Server Applications ): การตั้งค่าให้เริ่มต้นและสูงสุดมีค่าเท่ากัน ( เช่น-Xms2g -Xmx2g) เป็นที่นิยมมากในระบบ Production เพราะจะช่วยลด Overhead ของระบบที่ต้องมาคอยคำนวณเพื่อขอ RAM เพิ่ม หรือคืน RAM กลับให้ OS ในระหว่างที่โปรแกรมกำลังทำงานหนัก - อย่าตั้งค่า
-Xmxเต็ม 100% ของ RAM ในเครื่อง: JVM ไม่ได้ใช้แค่ Heap Memory เพียงอย่างเดียว แต่ยังมีการใช้ RAM สำหรับส่วนอื่นๆ ด้วย ( เช่น Metaspace, Stack Memory สำหรับแต่ละ Thread, และ Garbage Collection ) นอกจากนี้ยังต้องเผื่อพื้นที่ให้ Operating System ( OS ) ทำงานด้วย
สูตรเบื้องต้น: โดยทั่วไปแนะนำให้ตั้ง-Xmxไว้ที่ไม่เกิน 70-80% ของ RAM ทั้งหมดในระบบ ( ในกรณีที่เป็นเครื่อง Server ที่รัน Java ตัวเดียว ) - สังเกตพฤติกรรมผ่าน Garbage Collection ( GC ): หากตั้ง
-Xmxน้อยเกินไป JVM จะต้องเรียกทำงาน Garbage Collector บ่อยมาก ทำให้ CPU ทำงานหนักและโปรแกรมช้าลง ( GC Pause ) แต่ถ้าตั้งไว้ใหญ่เกินไป เวลา GC ทำงานแต่ละรอบอาจจะใช้เวลานานจนทำให้โปรแกรมค้างชั่วขณะได้
อ่านเเพิ่มเติม