จะใช้ Java Heap Dumps อย่างเชื่อถือได้อย่างไร


9

ทีมของฉันประสบปัญหาเมื่อพยายามที่จะทิ้งกองขยะที่ดีซึ่งถูกเรียกโดย OutOfMemoryErrors สำหรับเหตุผลเฉพาะเรากำลังทำการทิ้งด้วย jmap ที่เรียกจากสคริปต์ทุบตีแทนการใช้การตั้งค่าสถานะ HeapDumpOnOutOfMemoryError เราใช้ JVM ขนาด 64 บิตที่มีขนาดฮีปประมาณ 3 GB กองขยะของเราล้มเหลว 90% ของเวลา (คาดเดา)

มีอะไรที่เราสามารถทำได้เพื่อปรับปรุงอัตราต่อรองของเราในการทำความสะอาด heap dump ที่เราสามารถใช้เพื่อแก้ไขปัญหาหน่วยความจำได้หรือไม่? ฉันได้อ่านว่า jmap มีปัญหาที่สำคัญใน Java 1.4 แต่ปัญหาเหล่านั้นควรได้รับการแก้ไขเป็นส่วนใหญ่ในขณะนี้


4
ฉันเสนอคำถามนี้เพื่อ "ทำให้เกิดเสียงที่น่ารังเกียจที่สุด" โดยไม่ได้ตั้งใจ
phoebus

1
ฮ่าฮ่า - ฉันคิดว่าจะทำให้มันน่ารังเกียจโดยเจตนา แต่ฉันใหม่ที่นี่และฉันไม่แน่ใจว่าชุมชนจะทำอย่างไร :)
karlcyr

คำตอบ:


7

ระบบปฏิบัติการของคุณอยู่ไหน? (ฉันไม่สามารถเพิ่มความคิดเห็น)

สำหรับ Solaris เราจะได้ผลลัพธ์ที่ดีกว่าก่อนการบังคับให้มีการถ่ายโอนข้อมูลหลัก ( gcore <pid>) จากนั้นแนบ jmap กับไฟล์ core dump ( jmap -heap:format=b <path to java bin> <path to core>)

gcoreเป็นยูทิลิตี้ * nix เพื่อสร้างภาพของโปรแกรมที่กำลังทำงานอยู่ ดูการเชื่อมโยง


ลองกับ gdb บน linux และใช้งานได้ดี
Christian

JDK ตัวใดมี "gcore" ฉัน Sun 32 bit jdk สำหรับ linux 1.6.0.20 ไม่มีเลย
djangofan

แก้ไขด้วยการชี้แจง gcore
fglez

2

เรามี JSP ที่สอบถาม ManagementFactory.getThreadMXBean () และสร้างรายงาน อาจไม่เป็นประโยชน์เมื่อแอปขัดข้อง แต่ถ้าคุณสำรวจทุกนาทีหรือมากกว่านั้นคุณจะได้รับความคิดว่าเกิดอะไรขึ้น

ข้อมูลเพิ่มเติมที่นี่


2

คุณสามารถตรวจสอบใบสมัครของคุณผ่านทาง jmx จากด้านนอก เมื่อคุณรู้ว่ามีตัวชี้วัดบางตัวซึ่งบ่งชี้ว่า OutOfMemory ที่กำลังจะมาถึงคุณสามารถเรียกใช้ jmap ก่อนที่จะเกิดข้อยกเว้น


ขอบคุณคริสเตียน - jmap มีแนวโน้มที่จะเชื่อถือได้มากขึ้นก่อนที่จะเกิดข้อผิดพลาดหรือไม่
karlcyr

jmap จะยังคงต้องใช้เวลาสักพักเพื่อให้คุณได้ถ่ายโอนกอง แต่คุณจะได้รับ heapdump เต็มตราบใดที่ jvm / tomcat ของคุณเป็นผู้รับผิดชอบ
คริสเตียน

ฉันคิดว่าเครื่องมือที่สะอาดและง่ายที่สุดในการทำเช่นนี้คือ "Visual VM" อาจไม่อยู่ในขอบเขต แต่การสร้างปลั๊กอินที่กำหนดเองสำหรับ VisualVM ที่ตรวจพบสภาพและใช้การถ่ายโอนข้อมูลอัตโนมัติจากภายใน VisualVm น่าจะเป็น IMHO ที่ยอดเยี่ยม
djangofan

2

ขอบคุณทุกท่านสำหรับคำแนะนำของคุณ

สิ่งที่เราทำลงไปคือการเขียนสคริปต์เพื่อตรวจสอบบันทึกการรวบรวมขยะอย่างกระตือรือร้น จากประสบการณ์ของเรา Full-back-to-back Full GC นำหน้า OOM เกือบทุกครั้งดังนั้นสคริปต์ของเราตรวจพบเหตุการณ์นี้อย่างสง่างามลบเซิร์ฟเวอร์ออกจากพูลการปรับสมดุลโหลดและบังคับให้กองถ่ายโอนกอง สิ่งนี้เพิ่มประสิทธิภาพของเราอย่างมาก


2

นี่เป็นคำถามที่ค่อนข้างเก่า แต่ฉันจะตอบด้วยความหวังว่าบางคนอาจพบว่ามีประโยชน์

jmap มีตัวเลือก -F (บังคับ) สิ่งนี้ได้พิสูจน์แล้วว่าไม่ได้ผลสำหรับฉันในอดีต หากคุณต้องการใช้อ็อพชัน -F ฉันขอแนะนำให้คุณระบุไดเร็กทอรี java.io.tmp เป็นส่วนหนึ่งของคำสั่ง jmap มีปัญหากับ JVM เวอร์ชัน 1.6.22 ซึ่งยูทิลิตี jmap ไม่ทำงานอย่างถูกต้องเนื่องจากการตั้งค่าไดเรกทอรีชั่วคราว

คุณสามารถลองใช้การถ่ายโอนข้อมูลหลักผ่าน gdb เมื่อคุณมีแกนแล้ว jmap สามารถแปลงแกนให้เป็นกองดัมพ์ได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.