ป้ายกำกับ: หน่วยความจำ

Java: กำหนด Heap MemoryJava: กำหนด Heap Memory

การกำหนดค่า 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 = Kilobytes
  • m หรือ M = Megabytes
  • g หรือ 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 ทำงานแต่ละรอบอาจจะใช้เวลานานจนทำให้โปรแกรมค้างชั่วขณะได้

อ่านเเพิ่มเติม