การบันทึกการจัดสรร Java/Kotlin จะช่วยให้คุณระบุรูปแบบหน่วยความจำที่ไม่พึงประสงค์ ซึ่งอาจทำให้เกิดปัญหาด้านประสิทธิภาพได้ Profiler จะแสดงข้อมูลต่อไปนี้เกี่ยวกับการจัดสรรออบเจ็กต์
- ออบเจ็กต์ประเภทใดที่ได้รับการจัดสรรและใช้พื้นที่เท่าใด
- การติดตามสแต็กของการจัดสรรแต่ละรายการ รวมถึงในเธรด
- เมื่อมีการยกเลิกการจัดสรรออบเจ็กต์
คุณควรรบันทึกการจัดสรรหน่วยความจำระหว่างการโต้ตอบของผู้ใช้ในระดับปกติและระดับสูง เพื่อระบุตำแหน่งที่แน่นอนซึ่งโค้ดของคุณจัดสรรออบเจ็กต์มากเกินไปใน ระยะเวลาสั้นๆ หรือจัดสรรออบเจ็กต์ที่รั่วไหล ดูข้อมูลเพิ่มเติมเกี่ยวกับเหตุผลที่คุณควรสร้างโปรไฟล์หน่วยความจำของแอป
วิธีบันทึกการจัดสรร Java/Kotlin
หากต้องการบันทึกการจัดสรร Java/Kotlin ให้เลือกงานติดตามการใช้หน่วยความจำ (การจัดสรร Java/Kotlin) จากแท็บหน้าแรกของโปรไฟล์เลอร์ โปรดทราบว่าคุณต้องมี แอปที่แก้ไขข้อบกพร่องได้ (ใช้ Profiler: เรียกใช้ "แอป" เป็นแอปที่แก้ไขข้อบกพร่องได้ (ข้อมูลที่สมบูรณ์)) เพื่อบันทึก การจัดสรร Java/Kotlin
Android Studio จะบันทึกการจัดสรรออบเจ็กต์ทั้งหมดในหน่วยความจำโดยค่าเริ่มต้น หากคุณมี แอปที่จัดสรรออบเจ็กต์จำนวนมาก คุณอาจสังเกตเห็นว่าแอป ทำงานช้าลงอย่างเห็นได้ชัดขณะทำการโปรไฟล์ หากต้องการปรับปรุงประสิทธิภาพขณะสร้างโปรไฟล์ ให้ไปที่เมนูแบบเลื่อนลงการติดตามการจัดสรร แล้วเลือกสุ่มตัวอย่างแทนเต็ม เมื่อทำการสุ่มตัวอย่าง โปรไฟล์เลอร์จะรวบรวมการจัดสรรออบเจ็กต์ในหน่วยความจำในช่วงเวลาปกติ
หากต้องการบังคับให้เกิดเหตุการณ์การเก็บขยะขณะบันทึก ให้คลิกไอคอนถังขยะ
ภาพรวมการจัดสรร Java/Kotlin
หลังจากหยุดบันทึกแล้ว คุณจะเห็นสิ่งต่อไปนี้
- ไทม์ไลน์เหตุการณ์แสดงสถานะกิจกรรม เหตุการณ์อินพุตของผู้ใช้ และเหตุการณ์การหมุนหน้าจอ
- ไทม์ไลน์การใช้หน่วยความจำจะแสดงข้อมูลต่อไปนี้ เลือกส่วนหนึ่งของไทม์ไลน์เพื่อกรองตามช่วงเวลาที่ต้องการ
- กราฟแบบซ้อนของปริมาณหน่วยความจำที่ใช้ในแต่ละหมวดหมู่หน่วยความจำ ตามที่ระบุโดยแกน Y ทางด้านซ้ายและคีย์สีที่ด้านบน
- เส้นประแสดงจำนวนออบเจ็กต์ที่จัดสรรตามที่ระบุไว้ในแกน y ทางด้านขวา
- ไอคอนสำหรับเหตุการณ์การเก็บขยะแต่ละรายการ
- แท็บตารางจะแสดงรายการชั้นเรียน จำนวนทั้งหมดคือจำนวน การจัดสรร ณ สิ้นสุดช่วงเวลาที่เลือก (การจัดสรรลบด้วย การยกเลิกการจัดสรร) ดังนั้นจึงควรแก้ไขข้อบกพร่องของคลาสที่มีค่าจำนวนทั้งหมดสูงสุดก่อน หากสนใจการแก้ปัญหาชั้นเรียนตามการจัดสรรสูงสุดในช่วงเวลาที่เลือก ให้จัดลำดับความสำคัญตามการจัดสรร ในทำนองเดียวกัน Remaining Size คือ Allocations Size ลบด้วย Deallocations Size ในหน่วยไบต์
- เมื่อคลิกคลาสในรายการตาราง บานหน้าต่างอินสแตนซ์จะเปิดขึ้น พร้อมรายการออบเจ็กต์ที่เชื่อมโยง รวมถึงเวลาที่จัดสรร เวลาที่ ยกเลิกการจัดสรร และขนาดแบบตื้น
แท็บการแสดงภาพจะแสดงมุมมองรวมของออบเจ็กต์ทั้งหมดใน Call Stack ในช่วงเวลาที่เลือก ซึ่งจะแสดงให้เห็นว่า Callstack ที่มีอินสแตนซ์ที่แสดงใช้หน่วยความจำทั้งหมดเท่าใด แถวแรก แสดงชื่อชุดข้อความ โดยค่าเริ่มต้น ออบเจ็กต์จะซ้อนกันจากซ้ายไปขวา ตามขนาดการจัดสรร ใช้เมนูแบบเลื่อนลงเพื่อเปลี่ยนลำดับ
ใช้เมนูแบบเลื่อนลงของฮีปเพื่อกรองฮีปบางรายการ นอกเหนือจากตัวกรองที่ใช้ได้เมื่อคุณบันทึก Heap Dump คุณยังกรองไปยังคลาสในฮีป JNI ซึ่งเป็นฮีปที่แสดงตำแหน่งที่ระบบจัดสรรและเผยแพร่การอ้างอิง Java Native Interface (JNI) ได้ด้วย
ใช้เมนูแบบเลื่อนลงการจัดเรียงเพื่อเลือกวิธีจัดสรร นอกเหนือจากการจัดเรียงที่ใช้ได้เมื่อบันทึก Heap Dump แล้ว คุณยังจัดเรียงตาม Callstack ได้ด้วย
วิธีนับหน่วยความจำ
ตัวเลขที่เห็นที่ด้านบนสุดอิงตามหน้าหน่วยความจำส่วนตัวทั้งหมดที่แอปของคุณได้คอมมิตไว้ตามที่ระบบ Android ระบุ จำนวนนี้ไม่รวมหน้าเว็บที่แชร์กับระบบหรือแอปอื่นๆ หมวดหมู่ในการนับหน่วยความจำมีดังนี้
- Java: หน่วยความจำจากออบเจ็กต์ที่จัดสรรจากโค้ด Java หรือ Kotlin
เนทีฟ: หน่วยความจำจากออบเจ็กต์ที่จัดสรรจากโค้ด C หรือ C++
แม้ว่าคุณจะไม่ได้ใช้ C++ ในแอป แต่คุณอาจเห็นหน่วยความจำเนทีฟบางส่วน ที่ใช้ที่นี่เนื่องจากเฟรมเวิร์ก Android ใช้หน่วยความจำเนทีฟเพื่อจัดการงานต่างๆ ในนามของคุณ เช่น เมื่อจัดการชิ้นงานรูปภาพและกราฟิกอื่นๆ แม้ว่าโค้ดที่คุณเขียนจะอยู่ใน Java หรือ Kotlin ก็ตาม
กราฟิก: หน่วยความจำที่ใช้สำหรับคิวบัฟเฟอร์กราฟิกเพื่อแสดงพิกเซลไปยัง หน้าจอ รวมถึงพื้นผิว GL, เท็กซ์เจอร์ GL และอื่นๆ โปรดทราบว่านี่คือ หน่วยความจำที่แชร์กับ CPU ไม่ใช่หน่วยความจำ GPU โดยเฉพาะ
สแต็ก: หน่วยความจำที่ใช้โดยทั้งสแต็กเนทีฟและสแต็ก Java ในแอปของคุณ โดยปกติแล้ว จะเกี่ยวข้องกับจำนวนเธรดที่แอปของคุณกำลังทำงานอยู่
โค้ด: หน่วยความจำที่แอปใช้สำหรับโค้ดและทรัพยากร เช่น ไบต์โค้ด DEX, โค้ด DEX ที่เพิ่มประสิทธิภาพหรือคอมไพล์แล้ว
so
ไลบรารี และแบบอักษรอื่นๆ: หน่วยความจำที่แอปใช้ซึ่งระบบไม่แน่ใจว่าจะจัดหมวดหมู่ อย่างไร
จัดสรร: จำนวนออบเจ็กต์ Java/Kotlin ที่แอปจัดสรร ซึ่งจะไม่นับรวมออบเจ็กต์ที่จัดสรรใน C หรือ C++
ตรวจสอบบันทึกการจัดสรร
หากต้องการตรวจสอบบันทึกการจัดสรร ให้ทำตามขั้นตอนต่อไปนี้
- เรียกดูรายการคลาสในแท็บตารางเพื่อค้นหาออบเจ็กต์ที่มีค่าการจัดสรรหรือจำนวนทั้งหมดที่สูงผิดปกติ (ขึ้นอยู่กับสิ่งที่คุณกำลังเพิ่มประสิทธิภาพ) และอาจมีการรั่วไหล
- ในแผงมุมมองอินสแตนซ์ ให้คลิกอินสแตนซ์ แท็บฟิลด์หรือสแต็กการเรียกการจัดสรรจะเปิดขึ้น ทั้งนี้ขึ้นอยู่กับสิ่งที่เกี่ยวข้องกับอินสแตนซ์นั้น ใช้ข้อมูลในแท็บฟิลด์หรือสแต็กการเรียกการจัดสรร เพื่อพิจารณาว่าอินสแตนซ์จำเป็นจริงๆ หรือเป็นการทำซ้ำที่ไม่จำเป็น
คลิกขวาที่รายการในรายการเพื่อไปยังซอร์สโค้ดที่เกี่ยวข้อง
ดูการอ้างอิง JNI ทั่วโลก
Java Native Interface (JNI) เป็นเฟรมเวิร์กที่ช่วยให้โค้ด Java และโค้ดเนทีฟ เรียกกันได้ โค้ดเนทีฟจะจัดการการอ้างอิง JNI ด้วยตนเอง ดังนั้นจึงอาจเกิดปัญหาต่างๆ รวมถึงปัญหาต่อไปนี้
- ออบเจ็กต์ Java ที่โค้ดดั้งเดิมใช้จะยังคงใช้งานได้นานเกินไป
- ออบเจ็กต์บางรายการในฮีป Java อาจเข้าถึงไม่ได้หากมีการทิ้งการอ้างอิง JNI โดยไม่ได้ลบอย่างชัดเจนก่อน
- การอ้างอิง JNI ทั่วโลกหมดแล้ว
หากต้องการแก้ปัญหาดังกล่าว ให้เลือกดูฮีป JNI ในโปรไฟล์เลอร์เพื่อเรียกดู การอ้างอิง JNI ทั่วโลกทั้งหมด และกรองตามประเภท Java และสแต็กการเรียกเนทีฟ คลิกขวาที่ฟิลด์อินสแตนซ์ในแท็บฟิลด์ แล้วเลือกไปที่ อินสแตนซ์เพื่อดูสแต็กการเรียกการจัดสรรที่เกี่ยวข้อง
แท็บสแต็กการเรียกการจัดสรรจะแสดงตำแหน่งที่การอ้างอิง JNI ได้รับการจัดสรรและเผยแพร่ในโค้ด
ดูข้อมูลเพิ่มเติมเกี่ยวกับ JNI ได้ที่เคล็ดลับเกี่ยวกับ JNI