ฉันจะวิเคราะห์ไฟล์. hprof ได้อย่างไร


227

ฉันมีเซิร์ฟเวอร์ที่ใช้งานจริงที่ใช้แฟล็กต่อไปนี้: - XX: + HeapDumpOnOutOfMemoryError

เมื่อคืนมันสร้างไฟล์ java-38942.hprof เมื่อเซิร์ฟเวอร์ของเราพบข้อผิดพลาดของฮีป ปรากฎว่าผู้พัฒนาระบบรู้ถึงการตั้งค่าสถานะ แต่ไม่มีทางที่จะได้รับข้อมูลที่เป็นประโยชน์ใด ๆ จากมัน

ความคิดใด ๆ

คำตอบ:


215

หากคุณต้องการเครื่องมือขั้นสูงพอสมควรที่จะทำเรื่องจริงจังลองดูที่โครงการวิเคราะห์หน่วยความจำที่ Eclipse โดย SAP

บางสิ่งที่คุณสามารถทำได้นั้นดีมากสำหรับการค้นหาการรั่วไหลของหน่วยความจำและอื่น ๆ รวมถึงการรัน SQL แบบ จำกัด (OQL) กับวัตถุในหน่วยความจำเช่น

SELECT toString (ชื่อแรก) จาก com.yourcompany.somepackage.User

ยอดเยี่ยมโดยสิ้นเชิง


18
ฉันแค่ต้องการเพิ่ม +100 สำหรับ Eclipse Memory Analyzer ขณะนี้ฉันพยายามคัดกรองไฟล์ถ่ายโอนข้อมูลขนาด 400mb + heap และใช้เวลาในการอ่านไฟล์นานกว่า 70 นาทีก่อนที่จะเกิดปัญหา JVM ที่สมบูรณ์ EMA สามารถเปิดขึ้นได้ใน <5 นาที
matt b

3
ฉันได้รับการแยกวิเคราะห์ข้อผิดพลาดเมื่อเปิดไฟล์ HPROF โดยใช้ Eclipse Memory Analyzer (ซึ่งในความเป็นจริงแล้วยังถูกทิ้งโดย Eclipse!) โชคร้าย .. ถอนหายใจ
lost_bits1110

3
MAT ยังคงต้องการ RAM ค่อนข้างน้อย [น้อยกว่า JHAT แต่ก็ยังค่อนข้างน้อย] ดูstackoverflow.com/questions/7254017/…สำหรับเคล็ดลับหากเกิดเหตุการณ์เช่นนี้
rogerdpack

71

คุณสามารถใช้JHAT , เครื่องมือวิเคราะห์ Java Heap Analysis ที่มีให้ตามค่าเริ่มต้นด้วย JDK เป็นบรรทัดคำสั่ง แต่เริ่มต้นเว็บเซิร์ฟเวอร์ / เบราว์เซอร์ที่คุณใช้ตรวจสอบหน่วยความจำ ไม่ได้เป็นมิตรกับผู้ใช้มากที่สุด แต่อย่างน้อยมันก็ถูกติดตั้งแล้วในสถานที่ส่วนใหญ่ที่คุณจะไป มุมมองที่มีประโยชน์มากคือลิงค์ "ฮีสโตแกรมฮีสโตแกรม" ที่ด้านล่างสุด

อดีต: jhat -port 7401 -J-Xmx4G dump.hprof

jhat สามารถรัน OQL "วันนี้" ได้เช่นกัน (ลิงค์ด้านล่าง "รัน OQL")


หลังจากรันคำสั่งข้างต้นในคอนโซลคุณจะได้รับข้อความ int เทอร์มินัล "เซิร์ฟเวอร์พร้อม" พอร์ต: 7401 หลังจากนั้นเปิด URL นี้: localhost: 7401 "คุณสามารถดูรายละเอียดในหน้าต่างเบราว์เซอร์"
Laxman G

35

คุณยังสามารถใช้HeapWalkerจาก Netbeans Profiler หรือเครื่องมือVisual VMแบบสแตนด์อโลน Visual VM เป็นทางเลือกที่ดีสำหรับ JHAT เนื่องจากเป็นแบบสแตนด์อะโลน แต่ใช้งานได้ง่ายกว่า JHAT

คุณต้องการ Java 6+ เพื่อใช้ Visual VM อย่างเต็มที่


คุณควรเพิ่มหมายเหตุว่านี่สำหรับ Java 6 และ 7 เท่านั้น
Nick Stinemates

AFAIK, HeapWalker และ VisualVM ไม่จำเป็นต้องใช้ Java 6/7 ในการอ่านไฟล์ HPROF
James Schek

ฉันพยายามโหลดด้วย Java 5 และมีข้อความว่า 'โปรดใช้ Java 6 หรือ 7' ฉันทำอะไรผิด
Nick Stinemates

อืมมม บางทีคุณต้องรัน Java 6 แต่สามารถอ่าน Java 5 HPROF ได้ (นั่นอาจเป็นวิธีที่ฉันใช้งานได้) ฉันรู้ว่าคุณไม่สามารถสร้าง heap-dump จาก Visual VM บนแอปที่ใช้ Java 5 จะอัปเดต
James Schek

คุณยังสามารถใช้ JVM แบบเห็นได้จาก java SDK - มองหาjvisualvm.exeที่JAVASDK/binโฟลเดอร์
xxxvodnikxxx

11

เพิ่งได้รับการวิเคราะห์หน่วยความจำคราส ไม่มีอะไรจะดีไปกว่านี้แล้วและมันฟรี

JHAT ใช้งานได้เฉพาะสำหรับ "แอปพลิเคชันของเล่น"


3
JHAT จำเป็นสำหรับการสร้างความประทับใจให้กับแฮ็กเกอร์ "l33t" ที่สร้าง BSD distro ด้วยมือโดยเริ่มจาก LILO เดี๋ยวก่อน ... พวกเขาจะไม่ใช้จาวาเลย :-)
James Schek

ฉันคิดว่านี่เป็นความคิดเห็นมากกว่า ... : \
rogerdpack


5

หากคุณต้องการทำการวิเคราะห์ฮีปป์ดัมของคุณเอง:

ห้องสมุดนี้เร็ว แต่คุณจะต้องเขียนรหัสการวิเคราะห์ของคุณใน Java

จากเอกสาร:

  • ห้ามสร้างไฟล์ชั่วคราวบนดิสก์เพื่อประมวลผลดัมพ์ฮีป
  • สามารถทำงานได้โดยตรงกับ GZ ที่บีบอัดฮีปทิ้ง
  • สัญกรณ์ HeapPath

2

ฉันชอบ VisualVM เป็นส่วนตัว หนึ่งในคุณสมบัติที่ฉันชอบใน VisualVM คือการเปรียบเทียบการถ่ายโอนข้อมูลกอง เมื่อคุณทำการวิเคราะห์การถ่ายโอนข้อมูลกองมีหลายวิธีที่จะไปเกี่ยวกับการหาสิ่งที่ทำให้เกิดความผิดพลาด อีกวิธีหนึ่งที่ฉันพบว่ามีประโยชน์คือทำการเปรียบเทียบการทิ้งกองสุขภาพที่ไม่ดีต่อสุขภาพ

ต่อไปนี้เป็นขั้นตอนที่คุณสามารถติดตามได้:

  1. การรับดัมพ์ฮีปของ OutOfMemoryError ลองเรียกมันว่า "oome.hprof" คุณสามารถรับสิ่งนี้ผ่านพารามิเตอร์ JVM HeapDumpOnOutOfMemoryError
  2. รีสตาร์ทแอปพลิเคชันปล่อยให้แอปพลิเคชั่นมีขนาดใหญ่ (นาที / ชั่วโมง) ขึ้นอยู่กับแอปพลิเคชันของคุณ รับดัมพ์ฮีปอื่นขณะที่แอ็พพลิเคชันยังคงทำงานอยู่ มาเรียกมันว่า "healthy.hprof"
  3. คุณสามารถเปิดดัมพ์ทั้งสองนี้ใน VisualVM และทำการเปรียบเทียบการดัมพ์ฮีป คุณสามารถทำได้ในชั้นเรียนหรือระดับแพ็คเกจ สิ่งนี้มักจะชี้ให้คุณไปในทิศทางของปัญหา

ลิงก์: https://visualvm.github.io

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