แฟล็กปรับแต่ง 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การระบุคอขวด
- Java Flight Recorder
- การวิเคราะห์ด้วย JDK Mission Control
- แฟล็กปรับแต่ง JVM ที่พบบ่อย