ขึ้นอยู่กับคำจำกัดความของคุณว่าคุณต้องการรับแบบสอบถามหน่วยความจำใด
โดยปกติคุณต้องการทราบสถานะของหน่วยความจำฮีปเนื่องจากหากใช้หน่วยความจำมากเกินไปคุณจะได้รับ OOM และทำให้แอปหยุดทำงาน
สำหรับสิ่งนี้คุณสามารถตรวจสอบค่าถัดไป:
final Runtime runtime = Runtime.getRuntime();
final long usedMemInMB=(runtime.totalMemory() - runtime.freeMemory()) / 1048576L;
final long maxHeapSizeInMB=runtime.maxMemory() / 1048576L;
final long availHeapSizeInMB = maxHeapSizeInMB - usedMemInMB;
ยิ่งตัวแปร "usedMemInMB" เข้าใกล้ "maxHeapSizeInMB" มากเท่าไหร่ availHeapSizeInMB
ศูนย์มากขึ้นเท่านั้น (เนื่องจากการกระจายตัวของหน่วยความจำคุณอาจได้รับ OOM ก่อนที่จะถึงศูนย์)
นั่นคือสิ่งที่เครื่องมือ DDMS แสดงการใช้หน่วยความจำ
อีกวิธีหนึ่งคือการใช้ RAM จริงซึ่งเป็นจำนวนที่ทั้งระบบใช้ - ดูคำตอบที่ยอมรับเพื่อคำนวณ
อัปเดต: เนื่องจาก Android O ทำให้แอปของคุณใช้ RAM แบบเนทีฟด้วย (อย่างน้อยสำหรับพื้นที่เก็บข้อมูล Bitmaps ซึ่งโดยปกติจะเป็นสาเหตุหลักของการใช้หน่วยความจำขนาดใหญ่) ไม่ใช่แค่ฮีปเท่านั้นสิ่งต่าง ๆ ก็เปลี่ยนไปและคุณจะได้รับ OOM น้อยลง (เนื่องจาก ฮีปไม่มีบิตแมปอีกต่อไปโปรดตรวจสอบที่นี่ ) แต่คุณควรจับตาดูการใช้หน่วยความจำหากคุณสงสัยว่าหน่วยความจำรั่ว ใน Android O หากคุณมีการรั่วไหลของหน่วยความจำซึ่งน่าจะทำให้เกิด OOM ในเวอร์ชันเก่าดูเหมือนว่ามันจะพังโดยที่คุณไม่สามารถจับได้ วิธีตรวจสอบการใช้หน่วยความจำมีดังนี้
val nativeHeapSize = Debug.getNativeHeapSize()
val nativeHeapFreeSize = Debug.getNativeHeapFreeSize()
val usedMemInBytes = nativeHeapSize - nativeHeapFreeSize
val usedMemInPercentage = usedMemInBytes * 100 / nativeHeapSize
แต่ฉันเชื่อว่าควรใช้ตัวสร้างโปรไฟล์ของ IDE ซึ่งแสดงข้อมูลแบบเรียลไทม์โดยใช้กราฟ
ดังนั้นข่าวดีสำหรับ Android O ก็คือการล่มยากขึ้นเนื่องจาก OOM จัดเก็บบิตแมปที่มีขนาดใหญ่มากเกินไป แต่ข่าวร้ายก็คือฉันไม่คิดว่าจะเป็นไปได้ที่จะพบกรณีเช่นนี้ในระหว่างรันไทม์
แก้ไข: ดูเหมือนว่าจะมีDebug.getNativeHeapSize()
การเปลี่ยนแปลงตลอดเวลาเนื่องจากแสดงหน่วยความจำสูงสุดทั้งหมดสำหรับแอปของคุณ ดังนั้นฟังก์ชันเหล่านี้จึงใช้สำหรับผู้สร้างโปรไฟล์เท่านั้นเพื่อแสดงว่าแอปของคุณใช้งานมากเพียงใด
หากคุณต้องการรับ RAM จริงทั้งหมดและพร้อมใช้งานให้ใช้สิ่งนี้:
val memoryInfo = ActivityManager.MemoryInfo()
(getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager).getMemoryInfo(memoryInfo)
val nativeHeapSize = memoryInfo.totalMem
val nativeHeapFreeSize = memoryInfo.availMem
val usedMemInBytes = nativeHeapSize - nativeHeapFreeSize
val usedMemInPercentage = usedMemInBytes * 100 / nativeHeapSize
Log.d("AppLog", "total:${Formatter.formatFileSize(this, nativeHeapSize)} " +
"free:${Formatter.formatFileSize(this, nativeHeapFreeSize)} " +
"used:${Formatter.formatFileSize(this, usedMemInBytes)} ($usedMemInPercentage%)")
Debug.getNativeHeapFreeSize()
หากต่อแอปแล้วมันจะต้องมีการคำนวณในกองที่-la