การใช้พารามิเตอร์ HeapDumpOnOutOfMemoryError สำหรับดัมพ์ฮีพสำหรับ JBoss


182

ฉันบอกว่าฉันสามารถเพิ่ม-XX:+HeapDumpOnOutOfMemoryErrorพารามิเตอร์ในตัวเลือกการเริ่มต้น JVM ของฉันไปที่สคริปต์เริ่มต้น JBoss ของฉันเพื่อรับการถ่ายโอนข้อมูลฮีปเมื่อเราได้รับข้อผิดพลาดหน่วยความจำไม่เพียงพอในแอปพลิเคชันของเรา ฉันสงสัยว่าข้อมูลนี้ถูกทิ้งที่ไหน มันเป็นเพียงคอนโซลหรือไฟล์บันทึกบางอย่าง? หากเป็นเพียงคอนโซลจะเกิดอะไรขึ้นถ้าฉันไม่ได้ลงชื่อเข้าใช้เซิร์ฟเวอร์ Unix ผ่านคอนโซล


1
นั่นคือโฟลเดอร์ปัจจุบันฉันเดา
Valentin Tihomirov

คำตอบ:


246

นี่คือสิ่งที่เอกสารของออราเคิลมีการพูดว่า:

ตามค่าดีฟอลต์แล้วดัมพ์ฮีปถูกสร้างขึ้นในไฟล์ชื่อ java_ pid .hprof ในไดเร็กทอรีการทำงานของ VM ดังในตัวอย่างด้านบน คุณสามารถระบุชื่อไฟล์หรือไดเรกทอรีทาง-XX:HeapDumpPath=เลือกด้วยตัวเลือก ตัวอย่างเช่น-XX:HeapDumpPath=/disk2/dumps จะทำให้การถ่ายโอนข้อมูลฮีปจะถูกสร้างขึ้นใน/disk2/dumps ไดเรกทอรี


16
นอกจากนี้ยังแสดงรายการตัวเลือกที่เกี่ยวข้องกับประสิทธิภาพของ VM ทั้งหมด: java.sun.com/javase/technologies/hotspot/ …
Ravi Gupta

4
สำคัญ! การตั้งค่าสถานะ HeapDump จะพร้อมใช้งานจาก Java 1.5.0_07 เท่านั้น
rustyx

14
นอกจากนี้สิ่งสำคัญคือต้องตระหนักว่า JVM จะไม่เขียนทับฮีปที่มีอยู่ในHeapDumpPathนั้นคุณจะเห็นสิ่งที่คล้ายกับ"Unable to create /tmp/java_pidpid.hprof: File exists"ในมาตรฐานของคุณ ให้แน่ใจว่าได้ย้ายไฟล์ดัมพ์ของคุณออกจากพา ธ ดัมพ์เพื่อล้างวิธีสำหรับไฟล์ดัมพ์ใด ๆ ในอนาคต และใช้ประโยชน์จาก<pid>ตัวยึดตำแหน่งในชื่อไฟล์เพื่อเพิ่มเอนโทรปีในชื่อไฟล์
เบ็น

1
มันมีประโยชน์มาก ใช้เวลาเพียงไม่กี่นาทีในการค้นหารอยรั่วด้วย Eclipse Memory Analyzer
Aron Lorincz

จะเกิดอะไรขึ้นถ้าเราให้พา ธ ไปยังโฟลเดอร์ที่ไม่มีอยู่ในระบบ? มันจะสร้างโฟลเดอร์และดันดัมพ์ hump ภายในโฟลเดอร์นั้นหรือไม่
Vinit89

47

คุณสามารถดูดัมพ์นี้จากคอนโซล UNIX

เส้นทางสำหรับดัมพ์ฮีปจะถูกจัดเตรียมเป็นตัวแปรทันทีหลังจากที่คุณวางตัวแปรที่กล่าวถึงแล้ว

เช่น:

-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${DOMAIN_HOME}/logs/mps"

คุณสามารถดูดัมพ์จากคอนโซลบนพา ธ ที่กล่าวถึง


4

ฉันพบว่ามันยากที่จะถอดรหัสสิ่งที่มีความหมายโดย "ไดเรกทอรีทำงานของ VM" ในตัวอย่างของฉันฉันใช้โปรแกรม Java Service Wrapper เพื่อเรียกใช้ jar ไฟล์ดัมพ์สร้างขึ้นในไดเรกทอรีที่ฉันวางโปรแกรม wrapper เช่น c: \ myapp \ bin เหตุผลที่ฉันค้นพบนี้เป็นเพราะไฟล์สามารถมีขนาดค่อนข้างใหญ่และพวกเขาเติมฮาร์ดไดรฟ์ก่อนที่ฉันจะค้นพบตำแหน่งของพวกเขา


ไดเร็กทอรีการทำงานของคุณสามารถพบได้ผ่านคำสั่ง pwdx <PID> อันดับแรกทำ ps -ef | grep java ค้นหา PID ของคุณสำหรับแอป java ของคุณจากนั้นเรียกใช้ pwdx <PID> มันจะบอกคุณไดเรกทอรีการทำงาน
RCG

2

หากคุณไม่ได้ใช้ตัวเลือก "-XX: HeapDumpPath" ในกรณีของ JBoss EAP / As โดยค่าเริ่มต้นไฟล์การถ่ายโอนข้อมูลฮีปจะถูกสร้างขึ้นในไดเรกทอรี "JBOSS_HOME / bin"

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