ขนาดฮีปดัมพ์เทียบกับขนาด hprof

ฉันเพิ่งสร้างฮีปดัมพ์ในรูปแบบ hprof เมื่อเซิร์ฟเวอร์ jboss ของฉันทำงานด้วย xms ที่ 4096m และ xmx ที่ 4096m และขนาดอนุญาตที่ 512m

ไฟล์ hprof ที่สร้างขึ้นมีขนาดเกิน 5GB เมื่อฉันโหลดฮีปดัมพ์ใน Visualvm, Mat Analyzer หรือ Yourkit ฉันจะเห็นเพียงไบต์ทั้งหมดประมาณ 1GB เท่านั้น ฉันได้ลองเปลี่ยนขอบเขตการเข้าถึงใน yourkit แล้ว แต่มันไม่แสดงเกิน 1 gb

มีความคิดใดบ้างว่าความแตกต่างใหญ่ของขนาดไฟล์เทียบกับขนาดฮีปดัมพ์ที่แสดงสามารถทำให้เกิดอะไรได้บ้าง

PS: ฉันใช้ jdk1.6.0_23

ขออภัย ฉันไม่ได้รับอนุญาตให้ส่งภาพหน้าจอที่นี่

ในระบบไฟล์ขนาด hprof คือ 5.227.659 kb และใน yourkit ระบุว่า:

วัตถุ: 9.738.282 / ขนาดตื้น 740 mb / ขนาดที่คงไว้: 740 mb สตริงที่เข้าถึงได้: 6.652.515 (68%) / ขนาดตื้น: 381 mb (51%) / ขนาดที่คงไว้: 381 MB (51%)

ขนาดที่คงไว้ที่ใหญ่ที่สุดคือ 1 ไบต์[] เท่ากับ 206.810.176


person Michael    schedule 26.07.2012    source แหล่งที่มา
comment
คุณสามารถโพสต์ภาพหน้าจอของแท็บ 'สรุป' จาก VisualVM ได้หรือไม่   -  person Tomas Hurka    schedule 26.07.2012
comment
ฉันไม่สามารถเพิ่มภาพหน้าจอได้ แต่ฉันเพิ่มข้อมูลจาก yourkit แล้ว   -  person Michael    schedule 27.07.2012
comment
ข้อมูลจาก YourKit ไม่ได้ช่วยฉัน - ฉันไม่รู้ว่ามันคำนวณอย่างไร ฉันรู้ว่าสิ่งนี้เสร็จสิ้นใน VisualVM หากคุณต้องการให้ฉันช่วยคุณ ให้ระบุข้อมูลจากส่วน 'ข้อมูลพื้นฐาน' (สำเนาอยู่ในเมนูบริบท) หรือคุณสามารถอัปโหลดฮีปดัมพ์ที่บีบอัดของคุณที่ไหนสักแห่งแล้วส่งลิงก์มาให้ฉัน   -  person Tomas Hurka    schedule 27.07.2012
comment
สวัสดีโทมัส ฉันไม่สามารถให้ฮีปดัมพ์แก่คุณได้เนื่องจากข้อจำกัดด้านความปลอดภัย แต่ฉันสามารถให้ข้อมูลพื้นฐานแก่คุณได้: วันที่ถ่าย: ศุกร์ 20 ก.ค. 14:23:43 CEST 2012 ไฟล์: OutOfMemoryProd\20120720-20120723\FOFO1\ java_11607_lnx0399vm_201207201423.hprof\java_11607_201207201423.hprof ขนาดไฟล์: 5.147,4 MB ไบต์ทั้งหมด: 998.064.824 คลาสทั้งหมด: 24.457 อินสแตนซ์ทั้งหมด: 10.241.901 Classloaders: 1.72 8 ราก GC: 0 จำนวนออบเจ็กต์ที่รอการสรุป: 0   -  person Michael    schedule 30.07.2012
comment
ราก GC: 0 - นี่เป็นเรื่องน่าสงสัยมาก ดูเหมือนว่ามีบางอย่างผิดปกติกับฮีปดัมพ์ของคุณ   -  person Tomas Hurka    schedule 30.07.2012
comment
น่าแปลกที่แทบจะเป็นไปไม่ได้เลยที่จะสร้างกองขยะที่พังหรือประมาณนั้น   -  person Michael    schedule 30.07.2012
comment
อย่างที่ฉันบอกไปแล้วว่าการไม่มีรูต GC นั้นผิดอย่างแน่นอน ฉันกลัวว่าหากไม่มีฮีปดัมพ์ ฉันจะบอกไม่ได้ว่าปัญหาคืออะไร   -  person Tomas Hurka    schedule 31.07.2012


คำตอบ (3)


คุณใช้คำสั่งใดในการสร้างฮีปดัมพ์?

$JAVA_HOME/bin/jmap -dump:live,format=b,file=c:/tmp/heap_dump.bin PID

บางทีคุณอาจต้องผ่านออปชั่นสดตามสเป็ค

 -dump:<dump-options> to dump java heap in hprof binary format
                   dump-options:
                     live         dump only live objects; if not specified,
                                  all objects in the heap are dumped.
person Andrey Borisov    schedule 26.07.2012
comment
สวัสดี เราใช้คำสั่งต่อไปนี้: jmap -F -dump:format=b,file=${filename} $PID ตามออราเคิล ตัวเลือกสด: หากระบุไว้ เฉพาะอ็อบเจ็กต์สดในฮีปเท่านั้นที่จะถูกทิ้ง ดังนั้นหากฉันระบุสิ่งนี้ ฮีปดัมพ์น่าจะมีขนาดเล็กลงแต่อาจลดโอกาสในการค้นหาสาเหตุของหน่วยความจำรั่วด้วย - person Michael; 26.07.2012
comment
นี่เป็นคำถามที่ดีจริงๆ - วัตถุสดคืออะไร ฉันคิดว่าวัตถุสดเป็นสิ่งที่ไม่พร้อมใช้งานสำหรับ GC ดังนั้นฉันเดาว่าตัวเลือกสดจะลบวัตถุขยะออกและคุณจะมีเพียงวัตถุมีชีวิตเท่านั้น - นี่ไม่ได้หมายความว่าสิ่งนี้จะลดโอกาสในการค้นหา... ฉันพบว่าหน่วยความจำรั่วเล็กน้อยเมื่อเร็ว ๆ นี้พร้อมกับตัวเลือกสดในการถ่ายโอนข้อมูลขนาดใหญ่มาก (ประมาณ 16 GB) ... - person Andrey Borisov; 26.07.2012
comment
สวัสดี Andrey ขอบคุณสำหรับคำตอบของคุณ ฉันพบหน่วยความจำรั่วเล็กน้อยเมื่อเร็ว ๆ นี้พร้อมตัวเลือกสดในดัมพ์ขนาดใหญ่มาก (ประมาณ 16 GB) ฉันสามารถจินตนาการได้ว่ามันอาจช่วยได้ แต่ก็ยังไม่สมเหตุสมผลว่าทำไมจึงมีความแตกต่างอย่างมากระหว่างขนาด hprof บนดิสก์และขนาด เครื่องมือวิเคราะห์จะแสดงเมื่อฉันโหลด hprof (heapdump) ในเครื่องมือดังกล่าว... - person Michael; 26.07.2012

คุณได้ลองใช้ "ฮิสโตแกรมวัตถุที่ไม่สามารถเข้าถึงได้" (คุณสามารถหาลิงค์ได้จากด้านบนของหน้า "ภาพรวม") หรือไม่ ในหนึ่งในฮีปดัมพ์ของฉันขนาด 1509MB นั้น mat แสดงเพียง 454MB แต่ส่วนที่เหลือนั้นเป็นขยะ และแน่นอนว่าผลรวมของ "Shallow Heap" ในฮิสโตแกรมของวัตถุที่ไม่สามารถเข้าถึงได้คือ 966MB

person haridsv    schedule 27.07.2012
comment
จะรับค่าประเภทที่ระบุ int Unreachable Objects Histogram ได้อย่างไร ตัวอย่างเช่น ฉันพบว่า java.lang.String ครอบครอง 500M แต่ฉันไม่พบว่าสตริงคืออะไร ฉันทราบได้เฉพาะประเภทและขนาดรวมของประเภทเท่านั้น แต่ไม่พบเนื้อหาใน Eclipse Memory Analyzer - person gfan; 20.03.2019

นี่หมายความว่าเป็นไปได้มากว่าฮีปดัมพ์ของคุณประกอบด้วยออบเจ็กต์ที่ไม่สามารถเข้าถึงได้จำนวนมากซึ่งจะถูกรวบรวมขยะ หาก GC ทำงาน ตอนนี้ไม่ได้หมายความว่าคุณยังไม่มีการรั่วไหล แต่หมายความว่าใน Hprof ขนาด 5 GB ของคุณ ไม่สามารถเข้าถึงอ็อบเจ็กต์ขนาด 4 GB ได้ และด้วยเหตุนี้จึงไม่ใช่แหล่งที่มาของการรั่วไหลที่น่าสนใจ

ใน Java หน่วยความจำรั่วสามารถเกิดขึ้นได้ก็ต่อเมื่อ Garbage Collection ไม่สามารถล้างออบเจ็กต์ได้เนื่องจากมีบางสิ่งที่อ้างอิงถึงมัน (โดยไม่คาดคิด) ดังนั้นจะพบรอยรั่วของคุณ (ถ้ามี) ในอ็อบเจ็กต์ขนาด 1 GB ที่ยังคงอยู่ใน hprof ของคุณ

person sfali16    schedule 20.09.2013