0Pricing
Java Academy · บทเรียน

แฟล็กปรับแต่ง JVM ที่พบบ่อย

ตัวเลือกฮีป GC และ JIT

แฟล็กปรับแต่ง JVM ที่พบบ่อย เป็นบทเรียน Java Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Java Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Java Academy มีบทเรียนทั้งหมด 4 บทเรียน

เหตุใดจึงต้องปรับ JVM

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

การปรับแต่งควรเป็นขั้นตอนสุดท้าย: สร้างโพรไฟล์ก่อน แก้ไขโค้ด แล้วจึงใช้แฟล็กเมื่อผลการวัดสนับสนุนเท่านั้น

ขนาดฮีป: -Xms และ -Xmx

แฟล็กสองรายการที่ใช้บ่อยที่สุดจะกำหนดขอบเขตของฮีป:

  • -Xms — ขนาดฮีปเริ่มต้น
  • -Xmx — ขนาดฮีปสูงสุด

ตัวอย่าง: java -Xms512m -Xmx2g MyApp การกำหนด -Xms ให้เท่ากับ -Xmx ช่วยหลีกเลี่ยงช่วงหยุดจากการปรับขนาดในเซิร์ฟเวอร์ที่ทำงานเป็นเวลานาน

อ่านค่าเริ่มต้น

คุณสามารถสอบถาม JVM ได้ว่ามันเลือกค่าใดไว้ Runtime จะแสดงค่าฮีปปัจจุบัน และ -XX:+PrintFlagsFinal จะแสดงค่าที่มีผลจริงของแฟล็กทุกตัว

ตัวอย่างนี้จะแสดงขีดจำกัดหน่วยความจำของ JVM ที่กำลังทำงานอยู่

public class Main {
    public static void main(String[] args) {
        Runtime rt = Runtime.getRuntime();
        long mb = 1024 * 1024;
        System.out.println("Max heap (Xmx): " + (rt.maxMemory() / mb) + " MB");
        System.out.println("Total heap now: " + (rt.totalMemory() / mb) + " MB");
        System.out.println("Free in heap: " + (rt.freeMemory() / mb) + " MB");
        System.out.println("Available cores: " + rt.availableProcessors());
    }
}

เลือกตัวเก็บคืนหน่วยความจำ

JDK รุ่นใหม่มีตัวเก็บคืนหน่วยความจำหลายแบบ:

  • -XX:+UseG1GC — ค่าเริ่มต้น สมดุล และแบ่งการจัดการตามภูมิภาค
  • -XX:+UseZGC — ช่วงหยุดสั้นมาก เหมาะกับฮีปขนาดใหญ่
  • -XX:+UseParallelGC — ปริมาณงานสูงสุด แต่ช่วงหยุดนานกว่า
  • -XX:+UseSerialGC — ใช้เธรดเดียว เหมาะกับแอปขนาดเล็กมากและคอนเทนเนอร์

เป้าหมายช่วงหยุดของ G1

G1 เป็นตัวเก็บคืนหน่วยความจำที่เน้นเวลาในการหยุด คุณกำหนดเป้าหมายให้มันและระบบจะพยายามทำตาม:

  • -XX:MaxGCPauseMillis=200 ขอให้ G1 ควบคุมช่วงหยุดให้อยู่ใกล้ 200 มิลลิวินาที

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

ZGC สำหรับเวลาแฝงต่ำ

เมื่อช่วงหยุดต้องต่ำกว่าหนึ่งมิลลิวินาทีแม้ใช้ฮีปขนาดหลายกิกะไบต์ ให้ใช้ZGC ร่วมกับ -XX:+UseZGC

ZGC ทำงานส่วนใหญ่พร้อมกันกับเธรดของแอปพลิเคชัน ข้อแลกเปลี่ยนคือมีค่าใช้จ่ายด้าน CPU และหน่วยความจำเพิ่มเติมเมื่อเทียบกับ G1 จึงเหมาะอย่างยิ่งสำหรับบริการที่ไวต่อเวลาแฝง

การบันทึกข้อมูลการเก็บคืนหน่วยความจำ

หากต้องการปรับการเก็บคืนหน่วยความจำ คุณต้องมองเห็นการทำงานของมันก่อน เปิดใช้การบันทึกแบบรวม:

  • -Xlog:gc*:file=gc.log:time,uptime,level,tags

การตั้งค่านี้จะบันทึกการเก็บคืนหน่วยความจำทุกครั้งพร้อมการประทับเวลาและระยะเวลา ป้อนบันทึกลงในเครื่องมือดูข้อมูล (หรือ JMC/JFR) เพื่อค้นหาช่วงหยุดที่นานหรือเกิดบ่อย ก่อนเปลี่ยนแฟล็กใด ๆ

คอนเทนเนอร์และ CPU

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

  • -XX:MaxRAMPercentage=75.0 กำหนดให้ฮีปมีขนาดเป็นเปอร์เซ็นต์ของหน่วยความจำคอนเทนเนอร์
  • -XX:ActiveProcessorCount=N แทนที่จำนวน CPU ที่ตรวจพบ

วิธีนี้ช่วยป้องกันการจัดสรรหน่วยความจำเกินขนาดจนตัวจัดการระบบสั่งยุติคอนเทนเนอร์

การคอมไพล์แบบทันเวลาและตัวเลือกการวินิจฉัย

ตัวเลือกที่มีประโยชน์เพิ่มเติมอีกเล็กน้อย:

  • -XX:+HeapDumpOnOutOfMemoryError — บันทึกฮีปเมื่อเกิด OOM เพื่อใช้วิเคราะห์ภายหลังระบบล้มเหลว
  • -XX:HeapDumpPath=/tmp — ระบุตำแหน่งที่จะเขียนไฟล์ดังกล่าว
  • -XX:+PrintCompilation — ดูกิจกรรมการคอมไพล์แบบทันเวลา

ตัวเลือกเหล่านี้ใช้ทรัพยากรเพียงเล็กน้อย แต่จะมีประโยชน์มากเมื่อเกิดปัญหา

วินัยในการปรับแต่ง

กฎทองสำหรับตัวเลือก:

  • เปลี่ยน ทีละตัวเลือก และวัดผลใหม่โดยเปรียบเทียบกับค่าพื้นฐาน
  • อย่าคัดลอกตัวเลือกจากบทความในบล็อกมาใช้โดยไม่ตรวจสอบ — ตัวเลือกเหล่านั้นอาจมีไว้สำหรับ JVM รุ่นเก่า
  • แอปส่วนใหญ่ต้องใช้เพียง -Xmx และอาจเลือกตัวเก็บขยะเพิ่มเติม ค่าเริ่มต้นนั้นเหมาะสมอยู่แล้ว

เมตาสเปซและเธรด

ฮีปไม่ใช่พื้นที่หน่วยความจำเพียงแห่งเดียว:

  • -XX:MaxMetaspaceSize จำกัดพื้นที่ข้อมูลเมตาของคลาส หากไม่กำหนด การรั่วไหลขณะโหลดคลาสอาจใช้หน่วยความจำเนทีฟจนหมด
  • -Xss กำหนดขนาดสแตกต่อเธรด ให้ลดค่านี้หากเรียกใช้เธรดจำนวนมาก หรือเพิ่มค่าสำหรับการเรียกซ้ำที่มีความลึกมาก

โดยปกติไม่จำเป็นต้องปรับแต่งค่าเหล่านี้ แต่การรู้ว่ามีตัวเลือกเหล่านี้อยู่จะช่วยได้เมื่อปัญหาเกิดจากหน่วยความจำเนทีฟ ไม่ใช่ฮีป

ตรวจสอบอย่างรวดเร็ว

ตัวเลือก -Xms และ -Xmx ควบคุมอะไร

สรุปทบทวน

ตัวเลือกที่ควรรู้จักมีดังนี้:

  • -Xms / -Xmx กำหนดขอบเขตของฮีป
  • เลือกตัวเก็บขยะ: จีวัน (ค่าเริ่มต้น), ZGC (หยุดชะงักสั้น), หรือแบบขนาน (ปริมาณงานสูง)
  • กำหนด -XX:MaxGCPauseMillis สำหรับจีวัน และเปิดใช้ -Xlog:gc* เพื่อสังเกตการทำงาน
  • ใช้ MaxRAMPercentage ในคอนเทนเนอร์ และใช้ HeapDumpOnOutOfMemoryError เพื่อความปลอดภัย
  • เปลี่ยนทีละตัวเลือกและวัดผล

คำถามที่พบบ่อย

บทเรียน “แฟล็กปรับแต่ง JVM ที่พบบ่อย” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “แฟล็กปรับแต่ง JVM ที่พบบ่อย” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Java Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Java Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “แฟล็กปรับแต่ง JVM ที่พบบ่อย”

ตัวเลือกฮีป GC และ JIT คุณปฏิบัติ Java Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Java Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Java Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน

บทเรียน “แฟล็กปรับแต่ง JVM ที่พบบ่อย” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Java Academy นี้ได้ไหม

ได้ บทเรียน Java Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การระบุคอขวด
  2. Java Flight Recorder
  3. การวิเคราะห์ด้วย JDK Mission Control
  4. แฟล็กปรับแต่ง JVM ที่พบบ่อย
← กลับไปที่ Java Academy