ส่วนใหญ่แล้วในแอพพลิเคชั่นระดับองค์กรนั้น Java heap ที่ให้นั้นมีขนาดใหญ่กว่าขนาดสูงสุด 12 ถึง 16 GB ฉันพบว่ามันยากที่จะทำให้ NetBeans profiler ทำงานโดยตรงบนแอป java ขนาดใหญ่เหล่านี้
แต่โดยปกติแล้วสิ่งนี้ไม่จำเป็น คุณสามารถใช้ยูทิลิตี jmap ที่มาพร้อมกับ jdk เพื่อถ่ายโอนข้อมูลฮีป "สด" นั่นคือ jmap จะดัมพ์ฮีปหลังจากเรียกใช้ GC ทำการดำเนินการบางอย่างกับแอปพลิเคชันรอจนกว่าการดำเนินการจะเสร็จสิ้นจากนั้นใช้การถ่ายโอนข้อมูลฮีป "สด" อีกครั้ง ใช้เครื่องมือเช่น Eclipse MAT เพื่อโหลด heapdumps จัดเรียงบนฮิสโตแกรมดูว่ามีวัตถุใดเพิ่มขึ้นหรือสูงสุดใดซึ่งจะให้เบาะแส
su proceeuser
/bin/jmap -dump:live,format=b,file=/tmp/2930javaheap.hrpof 2930(pid of process)
มีปัญหาเดียวกับวิธีนี้คือ กองขนาดใหญ่ทิ้งแม้มีตัวเลือกสดอาจใหญ่เกินไปที่จะถ่ายโอนไปยังรอบการพัฒนาและอาจต้องใช้เครื่องที่มีหน่วยความจำ / RAM เพียงพอที่จะเปิด
นั่นคือที่ซึ่งฮิสโตแกรมของชั้นเรียนเข้ามาในรูปภาพ คุณสามารถดัมพ์ฮิสโตแกรมระดับสดด้วยเครื่องมือ jmap สิ่งนี้จะให้ฮิสโตแกรมระดับเดียวของการใช้หน่วยความจำโดยปกติจะไม่มีข้อมูลที่จะโยงการอ้างอิง ตัวอย่างเช่นมันอาจทำให้อาร์เรย์ถ่านที่ด้านบน และคลาสสตริงที่ด้านล่าง คุณต้องทำการเชื่อมต่อด้วยตัวเอง
jdk/jdk1.6.0_38/bin/jmap -histo:live 60030 > /tmp/60030istolive1330.txt
แทนที่จะเก็บฮีปสองกองใช้ฮิสโทแกรมระดับสองดังที่อธิบายไว้ข้างต้น จากนั้นเปรียบเทียบฮิสโตแกรมของชั้นเรียนและดูชั้นเรียนที่เพิ่มขึ้น ดูว่าคุณสามารถเชื่อมโยงคลาส Java กับคลาสแอ็พพลิเคชันของคุณหรือไม่ นี่จะให้คำแนะนำที่ดีงาม นี่คือสคริปต์ pythons ที่สามารถช่วยคุณเปรียบเทียบการทิ้งค่าฮิสโตแกรม jmap สองรายการ histogramparser.py
ในที่สุดเครื่องมือเช่น JConolse และ VisualVm มีความสำคัญต่อการดูการเติบโตของหน่วยความจำเมื่อเวลาผ่านไปและดูว่ามีหน่วยความจำรั่ว ในที่สุดบางครั้งปัญหาของคุณอาจไม่ใช่การรั่วไหลของหน่วยความจำ แต่การใช้หน่วยความจำสูงสำหรับการเปิดใช้งานการบันทึก GC ใช้ GC ที่มีความก้าวหน้าและกระชับใหม่เช่น G1GC; และคุณสามารถใช้เครื่องมือ jdk เช่น jstat เพื่อดูพฤติกรรมของ GC แบบสด
jstat -gccause pid <optional time interval>
การอ้างอิงอื่น ๆ ไปยัง google สำหรับ -jhat, jmap, GC เต็มรูปแบบ, การจัดสรรแบบ Humongous, G1GC