Java Flight Recorder
การวิเคราะห์ประสิทธิภาพที่ใช้ทรัพยากรต่ำ
Java Flight Recorder เป็นบทเรียน Java Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Java Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Java Academy มีบทเรียนทั้งหมด 4 บทเรียน
JFR คืออะไร
ตัวบันทึกการทำงานของ Java (JFR) คือเอนจินสำหรับสร้างโพรไฟล์และรวบรวมเหตุการณ์ที่สร้างรวมอยู่ใน JVM โดยตรง
เครื่องมือนี้บันทึกเหตุการณ์ขณะทำงานโดยละเอียด เช่น ตัวอย่างการทำงานของเมธอด การจัดสรรหน่วยความจำ การเก็บคืนหน่วยความจำ ล็อก และ IO ลงในไฟล์ไบนารี .jfr โดยมีค่าใช้จ่ายด้านประสิทธิภาพต่ำมาก เครื่องมือนี้มาพร้อมกับ JDK จึงไม่ต้องใช้เอเจนต์เพิ่มเติม
เหตุใดค่าใช้จ่ายด้านประสิทธิภาพต่ำจึงสำคัญ
เครื่องมือสร้างโพรไฟล์แบบแทรกการวัดแบบดั้งเดิมอาจทำให้แอปทำงานช้าลงสองเท่าหรือมากกว่า จนทำให้เวลาที่คุณต้องการวัดคลาดเคลื่อนไป
JFR ได้รับการออกแบบให้ทำงานในระบบจริง โดยทั่วไปมีค่าใช้จ่ายด้านประสิทธิภาพประมาณ 1% นั่นหมายความว่าคุณสามารถเปิดใช้งานไว้และเก็บบันทึกเมื่อเกิดเหตุขัดข้องจริง แทนที่จะใช้เฉพาะในห้องทดลอง
เริ่มบันทึกเมื่อเปิดใช้งาน
เปิดใช้งาน JFR ด้วยแฟล็กของ JVM เมื่อเริ่มแอปพลิเคชัน:
-XX:StartFlightRecording=duration=60s,filename=app.jfr
การตั้งค่านี้จะบันทึกเหตุการณ์เป็นเวลา 60 วินาที แล้วเขียนลงใน app.jfr คุณยังสามารถเริ่มการบันทึกที่ทำงานต่อไปจนกว่า JVM จะสิ้นสุดการทำงานได้
การควบคุมด้วยคำสั่ง JVM
คุณยังสามารถเริ่ม หยุด และส่งออกการบันทึกบน JVM ที่กำลังทำงานอยู่ได้โดยใช้คำสั่งต่อไปนี้:
jcmd <pid> JFR.start name=rec settings=profilejcmd <pid> JFR.dump name=rec filename=out.jfrjcmd <pid> JFR.stop name=rec
วิธีนี้เหมาะอย่างยิ่งสำหรับเก็บภาพสถานะจากกระบวนการที่กำลังทำงานผิดปกติอยู่
การตั้งค่า: ค่าเริ่มต้นเทียบกับโพรไฟล์
JFR มาพร้อมการกำหนดค่าในตัวสองแบบ:
- ค่าเริ่มต้น — มีค่าใช้จ่ายด้านประสิทธิภาพต่ำ เหมาะสำหรับใช้งานต่อเนื่องในระบบจริง
- โพรไฟล์ — สุ่มตัวอย่างได้ละเอียดกว่า มีค่าใช้จ่ายสูงขึ้นเล็กน้อย เหมาะสำหรับการตรวจสอบเฉพาะจุด
เลือกใช้ด้วย settings=profile นอกจากนี้คุณยังเขียนการกำหนดค่า .jfc แบบกำหนดเองเพื่อปรับเหตุการณ์แต่ละรายการได้
สิ่งที่ JFR บันทึก
JFR บันทึกเหตุการณ์ได้หลากหลาย รวมถึง:
- ตัวอย่างการทำงาน (เวลาของ CPU ถูกใช้ไปที่ใด)
- การจัดสรรอ็อบเจ็กต์และกิจกรรมของ TLAB
- ช่วงหยุดระหว่างการเก็บคืนหน่วยความจำ
- การแย่งใช้ล็อก (
jdk.JavaMonitorWait) - ไฟล์และซ็อกเก็ต IO การพักเธรด และข้อยกเว้น
เหตุการณ์แต่ละรายการมีการประทับเวลา ระยะเวลา และร่องรอยการเรียกใช้งาน
เหตุการณ์แบบกำหนดเอง
คุณสามารถกำหนดเหตุการณ์ JFR ของตนเองเพื่อวัดเวลาของตรรกะทางธุรกิจได้ โดยสืบทอดจาก jdk.jfr.Event ใส่คำอธิบายประกอบ แล้วครอบงานด้วย begin() / commit()
ส่วนนี้ของส่วนเชื่อมต่อโปรแกรม JFR เหมาะสำหรับแอปแบบแยกเดี่ยว การบันทึกจริงยังต้องใช้แฟล็กของ JVM แต่คลาสเหตุการณ์สามารถคอมไพล์และทำงานบน JDK ใดก็ได้
import jdk.jfr.Event;
import jdk.jfr.Label;
public class Main {
@Label("Order Processing")
static class OrderEvent extends Event {
@Label("Order Id") int orderId;
}
public static void main(String[] args) {
OrderEvent e = new OrderEvent();
e.orderId = 42;
e.begin();
// ... do the work being measured ...
e.commit();
System.out.println("Custom JFR event committed for order " + e.orderId);
}
}การบันทึกอย่างต่อเนื่อง
สำหรับบริการที่ทำงานเป็นเวลานาน ให้ใช้การบันทึกอย่างต่อเนื่องโดยกำหนดขนาดหรืออายุสูงสุดไว้ ซึ่งเรียกว่าบัฟเฟอร์วงแหวน
เหตุการณ์เก่าจะถูกลบออกเมื่อมีเหตุการณ์ใหม่เข้ามา ทำให้การใช้พื้นที่ดิสก์มีขอบเขตจำกัด เมื่อเกิดเหตุขัดข้อง คุณสามารถส่งออกบัฟเฟอร์และได้ข้อมูลหลายนาทีก่อนเกิดเหตุการณ์นั้นทันที
ส่งออกเมื่อสิ้นสุดการทำงาน
เพิ่ม dumponexit=true ลงในแฟล็กสำหรับเริ่มบันทึกการทำงาน แล้ว JFR จะเขียนบัฟเฟอร์เมื่อ JVM ปิดการทำงาน
ใช้ร่วมกับ -XX:FlightRecorderOptions เพื่อกำหนดขนาดบัฟเฟอร์ วิธีนี้รับรองว่าคุณจะเก็บข้อมูลได้แม้แต่จากกระบวนการที่กำลังจะสิ้นสุดลง
อ่านไฟล์
ไฟล์ .jfr เป็นไฟล์ไบนารี คุณสามารถวิเคราะห์ด้วยภาพในเครื่องมือควบคุมภารกิจของ JDK (บทถัดไป) หรือวิเคราะห์ด้วยโปรแกรมผ่านส่วนเชื่อมต่อโปรแกรม jdk.jfr.consumer และ RecordingFile
บรรทัดคำสั่ง jfr print app.jfr ยังสามารถส่งออกเหตุการณ์เป็นข้อความเพื่อค้นหาอย่างรวดเร็วได้
ส่งเหตุการณ์แบบต่อเนื่องทันที
ตั้งแต่ JDK 14 เป็นต้นมา JFR รองรับการส่งเหตุการณ์แบบต่อเนื่องผ่านส่วนเชื่อมต่อโปรแกรม jdk.jfr.consumer.RecordingStream
แทนที่จะส่งออกไฟล์แล้วเปิดภายหลัง คุณสามารถสมัครรับเหตุการณ์ขณะที่เกิดขึ้นและตอบสนองได้ทันที เช่น แจ้งเตือนเมื่อช่วงหยุดจากการเก็บคืนหน่วยความจำเกินเกณฑ์ วิธีนี้ทำให้ JFR เป็นแหล่งข้อมูลสำหรับตรวจสอบแบบสด ไม่ใช่เพียงเครื่องมือวิเคราะห์ย้อนหลังหลังเกิดเหตุ
ตรวจสอบอย่างรวดเร็ว
เหตุผลหลักที่สามารถเปิด JFR ทิ้งไว้ในระบบจริงได้คืออะไร
สรุป
JFR คือเครื่องบันทึกข้อมูลการทำงานในตัวของ JVM:
- รวบรวมเหตุการณ์ที่มีค่าใช้จ่ายด้านประสิทธิภาพต่ำและปลอดภัยสำหรับระบบจริงลงในไฟล์
.jfr - เริ่มทำงานผ่าน
-XX:StartFlightRecordingหรือjcmd JFR.start - เลือกการตั้งค่าค่าเริ่มต้นหรือโพรไฟล์ และกำหนดเหตุการณ์แบบกำหนดเองได้
- ใช้การบันทึกต่อเนื่องด้วยบัฟเฟอร์วงแหวนและ
dumponexit - วิเคราะห์ด้วยเครื่องมือควบคุมภารกิจของ JDK ในบทถัดไป
คำถามที่พบบ่อย
บทเรียน “Java Flight Recorder” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “Java Flight Recorder” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Java Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Java Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “Java Flight Recorder”
การวิเคราะห์ประสิทธิภาพที่ใช้ทรัพยากรต่ำ คุณปฏิบัติ Java Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Java Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Java Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน
บทเรียน “Java Flight Recorder” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Java Academy นี้ได้ไหม
ได้ บทเรียน Java Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การระบุคอขวด
- Java Flight Recorder
- การวิเคราะห์ด้วย JDK Mission Control
- แฟล็กปรับแต่ง JVM ที่พบบ่อย