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

แฟล็กปรับแต่ง GC และการทำโปรไฟล์ด้วย JVisualVM

กำหนดแฟล็กขนาดฮีป เปิดใช้การบันทึกล็อก GC และใช้ JVisualVM ทำโปรไฟล์การใช้ฮีปในแอปที่กำลังทำงาน

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

เหตุใดจึงต้องปรับแต่งการเก็บขยะ

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

แฟล็กขนาดฮีป

กำหนดขนาดฮีปเริ่มต้น (-Xms) และขนาดสูงสุด (-Xmx) ในระบบจริง ควรกำหนดให้เท่ากันเพื่อป้องกันการหยุดชั่วคราวจากการปรับขนาดแบบไดนามิก เริ่มต้นที่ 60–70% ของ RAM ที่พร้อมใช้งาน

// Example production flags:
java -Xms2g -Xmx2g -XX:+UseG1GC MyApp
// Avoid:
java -Xmx8g MyApp  // initial = 256m, max = 8g → resizing pauses

ขนาดรุ่นเยาว์

เพิ่มขนาดรุ่นเยาว์สำหรับแอปที่จัดสรรหน่วยความจำจำนวนมาก เพื่อลดความถี่ของการเก็บขยะรอบย่อย ใช้ -Xmn หรือ -XX:NewRatio (อัตราส่วนรุ่นเก่าต่อรุ่นเยาว์ ค่าเริ่มต้นคือ 2)

// Set Young Gen to 1 GB:
java -Xmx4g -Xmn1g MyApp
// Or via ratio:
java -Xmx4g -XX:NewRatio=3 MyApp  // 3GB old, 1GB young

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

กำหนด -XX:MaxGCPauseMillis เพื่อบอก G1 ถึงระยะเวลาหยุดชั่วคราวสูงสุดที่ต้องการ G1 จะปรับชุดการเก็บขยะเพื่อให้บรรลุเป้าหมายนี้ แต่เป้าหมายดังกล่าวไม่ใช่การรับประกันแบบตายตัว

java -XX:+UseG1GC -XX:MaxGCPauseMillis=100 -Xmx8g MyApp
// G1 will try to keep pauses under 100 ms

จำนวนเธรดการเก็บขยะ

ควบคุมการทำงานแบบขนานด้วย -XX:ParallelGCThreads (เธรดที่หยุดการทำงานทั้งหมดของแอป) และ -XX:ConcGCThreads (เธรดที่ทำงานพร้อมกันสำหรับ G1/ZGC)

// On an 8-core machine:
java -XX:+UseG1GC -XX:ParallelGCThreads=8 -XX:ConcGCThreads=2 MyApp

การเปิดใช้การบันทึกการเก็บขยะ (JVM 9 ขึ้นไป)

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

java -Xlog:gc*:file=gc.log:time,uptime,level,tags:filecount=5,filesize=20m MyApp

คำเตือนออบเจ็กต์ขนาดมหึมา

ออบเจ็กต์ที่มีขนาดใหญ่กว่า 50% ของรีเจียน G1 จะถือว่าเป็นออบเจ็กต์ขนาดมหึมา และจะข้ามรุ่นเยาว์ไปยังรุ่นเก่าโดยตรง ซึ่งอาจทำให้หน่วยความจำเกิดการกระจัดกระจาย ควรทำให้ออบเจ็กต์ขนาดใหญ่มีขนาดเล็กลงหรือเพิ่มขนาดรีเจียน

// Increase G1 region size (range: 1 MB to 32 MB, must be power of 2):
java -XX:+UseG1GC -XX:G1HeapRegionSize=16m -Xmx16g MyApp

ภาพรวม JVisualVM

JVisualVM (มาพร้อมกับ JDK 8 และดาวน์โหลดได้สำหรับ JDK รุ่นใหม่กว่า) มี GUI สำหรับตรวจสอบฮีป การเก็บขยะ CPU และเธรดของกระบวนการ JVM ทั้งในเครื่องและระยะไกล

การเชื่อมต่อกับ JVM ระยะไกล

เปิดใช้ JMX บนเซิร์ฟเวอร์เพื่อเชื่อมต่อ JVisualVM จากระยะไกล เพิ่มแฟล็กต่อไปนี้ในการเริ่มต้น JVM เป้าหมาย

// Remote JVM flags:
java -Dcom.sun.management.jmxremote \
     -Dcom.sun.management.jmxremote.port=9090 \
     -Dcom.sun.management.jmxremote.authenticate=false \
     -Dcom.sun.management.jmxremote.ssl=false \
     MyApp

การสร้างฮีปดัมป์จาก JVisualVM

ใน JVisualVM ให้คลิกขวาที่กระบวนการ → "ฮีปดัมป์" ฮีปดัมป์จะแสดงออบเจ็กต์ที่ยังมีชีวิต ขนาดหน่วยความจำที่ยึดไว้ และการอ้างอิง ใช้ "คอนโซล OQL" เพื่อค้นหาฮีปดัมป์ด้วยรูปแบบไวยากรณ์คล้าย SQL

การทำโปรไฟล์ CPU ด้วย JVisualVM

ไปที่แท็บการทำโปรไฟล์ แล้วคลิก "CPU" JVisualVM จะเพิ่มเครื่องมือวัดให้กับเมธอดและแสดงสแตกการเรียกที่ใช้เวลามาก หยุดตัวทำโปรไฟล์เพื่อดูว่าเมธอดใดใช้เวลามากที่สุด

Java Flight Recorder เทียบกับ JVisualVM

JFR มีค่าใช้จ่ายเพิ่มเติมต่ำกว่า (ประมาณ 1–2%) และเหมาะสำหรับระบบจริง ส่วน JVisualVM ที่เปิดใช้การทำโปรไฟล์มีค่าใช้จ่ายเพิ่มเติมสูงกว่า จึงเหมาะกับการพัฒนา ใช้ JFR ในระบบจริง และใช้ JVisualVM สำหรับการแก้ไขข้อผิดพลาดระหว่างการพัฒนา

ตรวจสอบความเข้าใจ

แฟล็กใดใช้กำหนดเป้าหมายระยะเวลาหยุดชั่วคราวสูงสุดของการเก็บขยะสำหรับ G1

สรุปทบทวน

กำหนด -Xms == -Xmx ในระบบจริง ปรับแต่ง -XX:MaxGCPauseMillis สำหรับ G1 เปิดใช้การบันทึกการเก็บขยะด้วย Xlog ใช้ JVisualVM สำหรับการแก้ไขข้อผิดพลาดระหว่างการพัฒนา และใช้ JFR สำหรับการทำโปรไฟล์ในระบบจริง

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

บทเรียน “แฟล็กปรับแต่ง GC และการทำโปรไฟล์ด้วย JVisualVM” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “แฟล็กปรับแต่ง GC และการทำโปรไฟล์ด้วย JVisualVM”

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

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

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

บทเรียน “แฟล็กปรับแต่ง GC และการทำโปรไฟล์ด้วย JVisualVM” ใช้เวลานานแค่ไหน

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

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

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

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

  1. ภูมิภาคฮีปของ JVM และวงจรชีวิตออบเจ็กต์
  2. อัลกอริทึม GC: Serial, G1, ZGC, Shenandoah
  3. การตรวจจับและแก้ไขหน่วยความจำรั่ว
  4. แฟล็กปรับแต่ง GC และการทำโปรไฟล์ด้วย JVisualVM
← กลับไปที่ Java Academy