حافظه بومی به تخصیصهایی اشاره دارد که در کد C، C++ یا Rust با استفاده از توابعی مانند malloc ، free یا عملگرهایی مانند new و delete انجام میشود. برخلاف جاوا، حافظه بومی به طور خودکار زبالهروب نمیشود؛ شما مسئول مدیریت چرخه عمر هر تخصیص هستید.
پروفایل سازی با heapprofd
heapprofd یک ابزار پروفایلر هیپ بومی برای اندروید در سطح پلتفرم است. این ابزار از یک رویکرد مبتنی بر نمونهگیری برای ثبت تخصیصها و آزادسازی تخصیصها با حداقل سربار استفاده میکند.
استفاده از ابزار heap_profile
سادهترین راه برای ثبت یک پروفایل هیپ بومی، استفاده از اسکریپت heap_profile ارائه شده توسط Perfetto است.
اسکریپت را از مخزن Perfetto دانلود کنید:
curl -O https://raw.githubusercontent.com/google/perfetto/master/tools/heap_profile chmod +x heap_profileمطمئن شوید که دستگاه شما از طریق ADB متصل است و ابزار را اجرا کنید و فرآیند هدف را مشخص کنید:
./heap_profile -n <package_name_or_process_name>سفر کاربر را در برنامه خود انجام دهید.
پروفایلر را متوقف کنید (Ctrl+C). اسکریپت به طور خودکار پروفایل را دریافت میکند، یک سرور محلی
pprofرا راهاندازی میکند و مرورگر وب شما را برای مشاهده نمودار شعلهای باز میکند.
فعال کردن اسنپشاتها
همچنین میتوانید در حین اجرای یک ردیابی Perfetto، یک dump از وضعیت فعلی هیپ (heap) را فعال کنید:
adb shell killall -USR1 heapprofd
این یک تصویر لحظهای (آیکون الماس) در رابط کاربری Perfetto ایجاد میکند. از یک نمونه پیکربندی heapprofd مانند این استفاده کنید:
buffers: {
size_kb: 65536
}
data_sources: {
config {
name: "android.heapprofd"
heapprofd_config {
sampling_interval_bytes: 4096
process_cmdline: "com.example.myapp"
}
}
}
duration_ms: 20000
تجزیه و تحلیل با pprof
خروجی heapprofd مجموعهای از فایلهای .pb.gz است. اگر از اسکریپت heap_profile استفاده کرده باشید، این فایلها بهطور خودکار به دایرکتوری موقت دستگاه میزبان شما (مثلاً /tmp/heap_profile-XXXXXX در لینوکس یا macOS) منتقل میشوند و یک لینک نمادین مناسب در /tmp/heap_profile-latest ایجاد میشود.
همچنین ببینید: ضبط پروفایلهای حافظه با Perfetto
شما میتوانید این فایلها را به صورت دستی با استفاده از pprof، ابزاری برای تجسم و تجزیه و تحلیل دادههای پروفایل، تجزیه و تحلیل کنید.
مشاهده نمودارهای شعلهای
پروفایل خود را در یک ابزار نمایش pprof مانند Google pprof که در GitHub موجود است ، آپلود کنید.

- حافظه آزاد نشده : به دنبال تخصیصهایی باشید که انجام شدهاند اما هرگز آزاد نشدهاند. یک نمودار شعلهای، پشتههای فراخوانی مسئول بیشترین بایتهای آزاد نشده را نشان میدهد.
- کل تخصیصها : همچنین میتوانید تعداد کل یا بایتهای اختصاص داده شده در کل مدت زمان پروفایل را مشاهده کنید، که برای یافتن ریزش تخصیص در کد نیتیو مفید است.
PerfetoSQL برای پروفایلهای هیپ بومی
اگر نمایه هیپ بومی را در یک ردیابی کامل Perfetto (با استفاده از heapprofd ) ثبت کردهاید، میتوانید تخصیصهای خام را پرسوجو کنید. این برای شمارش اشیاء یا خلاصه کردن بایتها مفید است:
SELECT
upid,
count(id) AS allocation_count,
sum(size) AS total_bytes
FROM heap_profile_allocation
GROUP BY upid
ORDER BY total_bytes DESC;
همچنین میتوانید تعداد کل یا بایتهای اختصاص داده شده در طول پروفایل را مشاهده کنید، حتی اگر متعاقباً آزاد شده باشند. این برای یافتن "ریزش تخصیص" مفید است.
نمادسازی
اگر فریمهای «ناشناخته» را در نمودار شعلهای خود مشاهده میکنید، باید پروفایل را نمادگذاری کنید. این امر مستلزم ارائه نسخههای بدون محدودیت کتابخانههای بومی شما (فایلهای .so با نمادهای اشکالزدایی) است.
محل یافتن نمادها در AOSP: نمادها در طول فرآیند ساخت تولید میشوند و در آدرس زیر ذخیره میشوند: out/target/product/<device_name>/symbols/
از فلگ --sym-dir با ابزار heap_profile استفاده کنید:
./heap_profile -n <process> --sym-dir <path-to-unstripped-symbols>
تحلیل گرافیکها و DMA-BUFها
در دستگاههای مدرن مبتنی بر اندروید، بخش قابل توجهی از حافظه اغلب توسط بافرهای گرافیکی، معروف به DMA-BUFها ، اشغال میشود. این بافرها برای لایههای رابط کاربری، فریمهای دوربین و بافرهای ویدیویی استفاده میشوند.
از آنجا که DMA-BUFها بین فرآیندها (مثلاً بین برنامه شما و surfaceflinger یا سرویس دوربین) به اشتراک گذاشته میشوند، ردیابی آنها میتواند دشوار باشد. ابزار dmabuf_dump تمام فرآیندهایی را که از DMA-BUFها استفاده میکنند، گزارش میدهد.
← بیتمپها | ↑ بالا | وبویو →