บทความนี้เป็นบทความพิเศษในซีรี่ส์ "คุณไม่ทราบ 5 ... " สำหรับนักพัฒนาซอฟต์แวร์ อย่างไรก็ตามพวกเราไม่กี่คนที่สามารถเข้าใจได้ว่า JVM ทำงานอย่างไร - เช่นการจัดสรรงานและการรวบรวมขยะการเปลี่ยนเธรดการเปิดและปิดไฟล์การขัดจังหวะและ/หรือ JIT รวบรวม Java bytecode และอื่น ๆ
ไม่คุ้นเคยกับ JVM จะไม่เพียง แต่ส่งผลกระทบต่อประสิทธิภาพของแอปพลิเคชัน แต่ยังพยายามแก้ไขเมื่อมีปัญหากับ JVM
บทความนี้จะแนะนำธงบรรทัดคำสั่งบางอย่างที่คุณสามารถใช้ในการวินิจฉัยและปรับแต่งประสิทธิภาพของเครื่องเสมือน Java ของคุณ
1. disablexplicitlegc
ฉันจำไม่ได้ว่าผู้ใช้หลายครั้งที่ขอให้ฉันปรึกษาเกี่ยวกับปัญหาประสิทธิภาพของแอปพลิเคชัน
รายการ 1. System.gc ();
การคัดลอกรหัสมีดังนี้:
// เราเพิ่งปล่อยวัตถุมากมายดังนั้นบอกคนโง่
// Garbage Collector เพื่อรวบรวมแล้ว!
System.gc ();
คอลเลกชันขยะที่ชัดเจนเป็นความคิดที่แย่มาก - เช่นล็อคคุณและบูลด็อกบ้าในตู้โทรศัพท์ แม้ว่าไวยากรณ์ของการโทรจะถูกนำไปใช้อย่างอิสระ แต่หาก JVM ของคุณกำลังใช้งานสะสมขยะทั่วไป (ส่วนใหญ่ System.gc (); บังคับให้ VM ดำเนินการ "กวาดทั้งหมด" ของกองแม้ว่าบางคนไม่จำเป็น การทำความสะอาดทั้งหมดเป็นคำสั่งของขนาดที่แพงกว่าการดำเนินการ GC ปกติและเป็นเพียงปัญหาทางคณิตศาสตร์ที่เรียบง่าย
คุณไม่สามารถนำคำพูดของฉันไปที่หัวใจ - วิศวกรของซุนจัดให้มีการตั้งค่าสถานะ JVM สำหรับข้อผิดพลาดคู่มือพิเศษนี้ สามารถดูได้ว่า system.gc () เป็นอันตรายหรือเป็นประโยชน์ต่อการดำเนินการ JVM ทั้งหมดหรือไม่
2. HEAPDUMPONOUTOFMEMORYERROR
คุณเคยประสบสถานการณ์ที่ JVM ไม่สามารถใช้งานได้อย่างต่อเนื่องโยน outofMemoryError อย่างต่อเนื่องและคุณไม่สามารถสร้างตัวดีบักให้ตัวเองจับได้หรือดูว่ามีอะไรผิดปกติ? ปัญหาที่ร้ายแรงและ/หรือไม่แน่นอนเช่นนี้มักจะทำให้นักพัฒนาบ้าคลั่ง
ผู้ซื้อมีหน้าที่รับผิดชอบต่อตัวเอง
ไม่รองรับธงบรรทัดคำสั่งทั้งหมดโดย VM ใด ๆ ยกเว้น Sun/Oracle VMS วิธีที่ดีที่สุดในการตรวจสอบว่ามีการรองรับธงคือลองใช้และดูว่ามันทำงานได้อย่างถูกต้องหรือไม่ หากโลโก้เหล่านี้ไม่ได้รับการสนับสนุนทางเทคนิคคุณจะต้องรับผิดชอบอย่างเต็มที่ในการใช้งาน I, Sun/Oracle และ IBM จะไม่รับผิดชอบหากธงใด ๆ เหล่านี้สร้างรหัสข้อมูลเซิร์ฟเวอร์ของคุณหรือทุกอย่างเกี่ยวกับคุณหายไปโดยไม่มีร่องรอย ในกรณีนี้ขอแนะนำให้ทำการทดลองในสภาพแวดล้อมเสมือนจริง (การผลิตมาก) ก่อน
สิ่งที่คุณต้องการในขณะนี้คือการจับภาพสแน็ปช็อตของกองเมื่อ JVM ตาย - เพียงแค่ -xx:+heapdumponoutofmemoryError คำสั่งสามารถทำสิ่งนี้ได้
การรันคำสั่งจะแจ้งให้ JVM ใช้ "ฮีปดั๊มสสแน็ปช็อต" และบันทึกไว้ในไฟล์สำหรับการประมวลผลโดยปกติจะใช้ยูทิลิตี้ JHAT (ฉันอธิบายไว้ในโพสต์ก่อนหน้า) คุณสามารถระบุพา ธ จริงไปยังไฟล์ที่บันทึกไว้โดยใช้ธงที่เกี่ยวข้อง -xx: HEAPDUMPPATH (ไม่ว่าไฟล์จะถูกบันทึกไว้ที่ใดตรวจสอบให้แน่ใจว่ากระบวนการไฟล์และ/หรือกระบวนการ Java ต้องมีสิทธิ์ในการกำหนดค่าและสามารถเขียนได้ที่นั่น)
3. BootClassPath
มันจะเป็นประโยชน์ในการนำชั้นเรียนเข้าสู่ ClassPath เป็นประจำซึ่งแตกต่างจาก classpath เล็กน้อยที่มาพร้อมกับสินค้าคงคลัง JRE หรือ JRE classpath ที่ขยายออกไปในบางวิธี (ผู้ให้บริการ Java Crypto API ใหม่เป็นตัวอย่าง) หากคุณต้องการขยาย JRE การใช้งานที่กำหนดเองของคุณจะต้องสามารถใช้ bootloader classloader ซึ่งสามารถโหลด java.lang.Object ใน rt.jar และไฟล์ที่เกี่ยวข้องทั้งหมด
แม้ว่าคุณจะสามารถเปิด RT.JAR อย่างผิดกฎหมายและย้ายการใช้งานที่กำหนดเองหรือแพ็คเก็ตใหม่เข้ามา แต่คุณละเมิดข้อตกลงที่คุณตกลงทางเทคนิคเมื่อดาวน์โหลด JDK
ให้ใช้ตัวเลือก -xbootclasspath ของ JVM รวมถึงสกิน -xbootclassPath/P และ -xbootClassPath/A
-xBootClassPath ช่วยให้คุณตั้งค่าการบูตแบบบูตแบบเต็มรูปแบบ (ซึ่งมักจะมีการอ้างอิงถึง RT.JAR) รวมถึงไฟล์ JAR ที่เข้าถึงได้ JDK อื่น ๆ (ไม่ใช่ส่วนหนึ่งของ RT.JAR) -xbootClassPath/P นำหน้าค่าลงใน bootclassPath ที่มีอยู่และผนวก -xbootClassPath/a
ตัวอย่างเช่นหากคุณแก้ไข java.lang.integer ในไลบรารีและวางการปรับเปลี่ยนภายใต้ mods subpath พารามิเตอร์ -xbootClassPath/AMODS จะทำให้จำนวนเต็มใหม่ก่อนพารามิเตอร์เริ่มต้น
4. คำพูด
สำหรับแอปพลิเคชันเสมือนจริงหรือทุกประเภทของแอปพลิเคชัน Java -Verbose เป็นแอปพลิเคชันการวินิจฉัยระดับแรกที่มีประโยชน์ โลโก้มีโลโก้ย่อยสามรายการ: GC, Class และ JNI
นักพัฒนาพยายามที่จะตรวจสอบว่า JVM Garbage Collector ล้มเหลวหรือก่อให้เกิดประสิทธิภาพที่ไม่ดีหรือไม่ น่าเสียดายที่การอธิบายเอาท์พุท GC นั้นยุ่งยาก - เพียงพอที่จะเขียนหนังสือ ที่แย่กว่านั้นเอาต์พุตที่พิมพ์บนบรรทัดคำสั่งเปลี่ยนไปในเวอร์ชัน Java ที่แตกต่างกันหรือไม่ได้อยู่ใน JVMs ที่แตกต่างกันซึ่งทำให้การตีความอย่างถูกต้องยากขึ้น
โดยทั่วไปหากนักสะสมขยะเป็นตัวสะสมรุ่น (VM ระดับองค์กร "ส่วนใหญ่คือ) ธงเสมือนบางชนิดจะปรากฏขึ้นเพื่อบ่งบอกถึงเส้นทาง GC แบบกวาดเต็มรูปแบบ
ชั้นเรียนสามารถช่วยคุณได้หากคุณต้องการวินิจฉัยความขัดแย้งในชั้นเรียนและ/หรือความขัดแย้งในชั้นเรียนที่ไม่ตรงกัน ไม่เพียง แต่รายงานเมื่อมีการโหลดคลาส แต่ยังมีการโหลดคลาสรวมถึงเส้นทางไปยังขวด (ถ้ามาจากขวด)
JNI ไม่ค่อยใช้ยกเว้นเมื่อใช้ JNI หรือไลบรารีท้องถิ่น เมื่อเปิดขึ้นจะรายงานเหตุการณ์ JNI ต่างๆเช่นเมื่อโหลดไลบรารีท้องถิ่นและเมื่อวิธีการเด้งกลับมาอีกครั้ง
5. Command-Line-X
ฉันได้แสดงรายการตัวเลือกบรรทัดคำสั่งที่ฉันชอบใน JVM แต่มีอีกสองสามสิ่งที่คุณต้องการในการค้นหาตัวเองเรียกใช้อาร์กิวเมนต์บรรทัดคำสั่ง -x โดยแสดงรายการที่ไม่ได้มาตรฐานทั้งหมด (แต่ส่วนใหญ่ปลอดภัย) โดย JVM ) พารามิเตอร์ - ตัวอย่างเช่น:
-xint การรัน JVM ในโหมดตีความ (ซึ่งมีประโยชน์สำหรับการทดสอบว่าคอมไพเลอร์ JIT ใช้งานได้จริงสำหรับรหัสของคุณหรือตรวจสอบว่ามีข้อบกพร่องในคอมไพเลอร์ JIT หรือไม่)
-xloggc :, และ -verbose: GC ทำสิ่งเดียวกัน แต่บันทึกไฟล์โดยไม่ส่งออกไปยังหน้าต่างบรรทัดคำสั่ง
ตัวเลือกบรรทัดคำสั่ง JVM เปลี่ยนเป็นครั้งคราวดังนั้นจึงเป็นความคิดที่ดีที่จะตรวจสอบเป็นประจำ แม้คุณจะจ้องที่จอภาพตอนดึกและกลับบ้านเวลา 17.00 น. เพื่อทานอาหารมื้อเย็นกับภรรยาและลูก ๆ ของคุณ (หรือทำลายศัตรูของคุณใน Mass Effect 2 ขึ้นอยู่กับความชอบของคุณ) พวกเขาต่างกัน
บทสรุป
ในสภาพแวดล้อมการผลิตธงบรรทัดคำสั่งไม่ได้ออกแบบมาเพื่อการใช้งานอย่างถาวร-ในความเป็นจริงยกเว้นธงที่คุณยุติเพื่อปรับแต่ง JVM Garbage Collector ไม่มีธงบรรทัดคำสั่งที่ไม่ได้มาตรฐานจะทุ่มเทให้กับการใช้งานการผลิต อย่างไรก็ตามมันมีประโยชน์มากในการเป็นเครื่องมือในการสอดแนมงานภายในของเครื่องเสมือนจริงที่ทึบแสงอย่างสมบูรณ์