تخصیص جاوا/کاتلین را ضبط کنید

ضبط تخصیص‌های جاوا/کاتلین به شما کمک می‌کند الگوهای حافظه نامطلوبی را که ممکن است باعث مشکلات عملکردی شوند، شناسایی کنید. نمایه ساز می تواند موارد زیر را در مورد تخصیص شی به شما نشان دهد:

  • چه نوع اشیایی به آنها اختصاص داده شد و چه مقدار از فضا استفاده می شود.
  • رد پشته هر تخصیص، از جمله در کدام رشته.
  • زمانی که اشیاء منفصل شدند.

شما باید تخصیص حافظه را در طول تعامل عادی و شدید کاربر ضبط کنید تا دقیقاً شناسایی کنید که کد شما در یک زمان کوتاه تعداد زیادی اشیاء را تخصیص می دهد یا اشیایی که لو رفته را تخصیص می دهد. درباره اینکه چرا باید حافظه برنامه خود را نمایه کنید بیشتر بیاموزید .

نحوه ثبت تخصیص جاوا/کاتلین

برای ضبط تخصیص جاوا/کاتلین، وظیفه مصرف حافظه ردیابی (تخصیص جاوا/کوتلین) را از تب صفحه اصلی پروفایلر انتخاب کنید. توجه داشته باشید که برای ضبط تخصیص‌های جاوا/کاتلین به یک برنامه قابل اشکال‌زدایی ( از Profiler استفاده کنید: برنامه را به‌عنوان قابل اشکال‌زدایی (داده‌های کامل) اجرا کنید .

Android Studio به طور پیش فرض تمام تخصیص اشیا را در حافظه ضبط می کند. اگر برنامه‌ای دارید که اشیاء زیادی را به خود اختصاص می‌دهد، ممکن است در حین پروفایل کردن، کاهش سرعت قابل مشاهده را در برنامه خود مشاهده کنید. برای بهبود عملکرد در حین نمایه سازی، به منوی کشویی Allocation Tracking رفته و به جای Full، Sampled را انتخاب کنید. هنگام نمونه‌برداری، نمایه‌ساز تخصیص‌های شی را در فواصل زمانی منظم در حافظه جمع‌آوری می‌کند.

برای اجبار یک رویداد جمع آوری زباله در حین ضبط، روی نماد زباله کلیک کنید .

مروری بر تخصیص جاوا/کاتلین

پس از توقف ضبط، موارد زیر را مشاهده می کنید:

  • جدول زمانی رویداد، وضعیت‌های فعالیت، رویدادهای ورودی کاربر و رویدادهای چرخش صفحه را نشان می‌دهد.
  • جدول زمانی استفاده از حافظه اطلاعات زیر را نشان می دهد. بخشی از خط زمانی را برای فیلتر کردن در محدوده زمانی مشخص انتخاب کنید.
    • نمودار انباشته ای از مقدار حافظه مصرف شده توسط هر دسته حافظه، همانطور که با محور y در سمت چپ و کلید رنگی در بالا نشان داده شده است.
    • یک خط چین نشان دهنده تعداد اشیاء اختصاص داده شده است، همانطور که با محور y در سمت راست نشان داده شده است.
    • یک نماد برای هر رویداد جمع آوری زباله.
  • تب Table لیستی از کلاس ها را نشان می دهد. تعداد کل تعداد تخصیص‌ها در پایان محدوده زمانی انتخاب شده است ( تخصیص منهای تقسیم‌بندی )، بنابراین ممکن است ابتدا کلاس‌هایی را که دارای بالاترین مقدار تعداد کل هستند اشکال‌زدایی کنیم. اگر بیشتر به عیب‌یابی کلاس‌ها بر اساس تخصیص پیک در محدوده زمانی انتخاب‌شده علاقه دارید، اولویت‌بندی را بر اساس تخصیص‌ها انجام دهید. به طور مشابه، اندازه باقیمانده ، اندازه تخصیص منهای اندازه تخصیص به بایت است.
  • وقتی روی یک کلاس در لیست Table کلیک می‌کنید، پنجره Instance با فهرستی از اشیاء مرتبط باز می‌شود، از جمله زمانی که آنها تخصیص داده شده‌اند، زمانی که اختصاص داده شده‌اند و اندازه کم آنها.
  • تب Visualization نمای جمعی از تمام اشیاء موجود در پشته تماس را در بازه زمانی انتخاب شده نشان می دهد. اساساً به شما نشان می‌دهد که پشته تماس با نمونه‌های نشان‌داده‌شده چه مقدار از حافظه را اشغال می‌کند. ردیف اول نام موضوع را نشان می دهد. به طور پیش فرض، اشیاء بر اساس اندازه تخصیص از چپ به راست انباشته می شوند. از منوی کشویی برای تغییر ترتیب استفاده کنید.

  • از منوی کشویی پشته برای فیلتر کردن انبوه های خاص استفاده کنید. علاوه بر فیلترهای موجود هنگام ضبط یک heap dump ، می‌توانید کلاس‌های پشته JNI را فیلتر کنید، پشته‌ای که نشان می‌دهد منابع رابط بومی جاوا (JNI) کجا تخصیص و منتشر می‌شوند.

  • از منوی کشویی آرایش برای انتخاب نحوه ترتیب دادن تخصیص ها استفاده کنید. علاوه بر تمهیدات موجود هنگام گرفتن یک پشته پشته ، می‌توانید با پشته تماس ترتیب دهید.

نحوه شمارش حافظه

بر اساس سیستم اندروید، اعدادی که در بالای آنها مشاهده می کنید، بر اساس تمام صفحات حافظه خصوصی است که برنامه شما متعهد شده است. این تعداد شامل صفحات به اشتراک گذاشته شده با سیستم یا سایر برنامه ها نمی شود. دسته بندی ها در شمارش حافظه به شرح زیر است:

  • جاوا : حافظه از اشیاء اختصاص داده شده از کد جاوا یا کاتلین.
  • Native : حافظه از اشیاء اختصاص داده شده از کد C یا C++.

    حتی اگر از ++C در برنامه خود استفاده نمی‌کنید، ممکن است مقداری حافظه بومی را در اینجا مشاهده کنید زیرا چارچوب Android از حافظه بومی برای انجام کارهای مختلف از طرف شما استفاده می‌کند، مانند هنگام مدیریت دارایی‌های تصویر و سایر گرافیک‌ها - حتی اگر کد شما نوشته شده در جاوا یا کاتلین است.

  • گرافیک : حافظه ای که برای صف های بافر گرافیکی برای نمایش پیکسل ها روی صفحه نمایش، از جمله سطوح GL، بافت های GL و موارد دیگر استفاده می شود. توجه داشته باشید که این حافظه مشترک با CPU است، نه حافظه اختصاصی GPU.

  • پشته : حافظه ای که توسط پشته های بومی و جاوا در برنامه شما استفاده می شود. این معمولاً به تعداد رشته هایی که برنامه شما در حال اجرا است مربوط می شود.

  • کد : حافظه ای که برنامه شما برای کد و منابع استفاده می کند، مانند بایت کد DEX، DEXcode بهینه شده یا کامپایل شده، . so کتابخانه ها و فونت ها.

  • سایرین : حافظه مورد استفاده برنامه شما که سیستم مطمئن نیست چگونه آن را دسته بندی کند.

  • اختصاص داده شده : تعداد اشیاء جاوا/کوتلین که توسط برنامه شما اختصاص داده شده است. این اشیاء اختصاص داده شده در C یا C++ را محاسبه نمی کند.

رکورد تخصیص را بررسی کنید

برای بررسی رکورد تخصیص، مراحل زیر را دنبال کنید:

  1. فهرست کلاس‌ها را در تب Table مرور کنید تا اشیایی را بیابید که مقادیر تخصیص یا تعداد کل غیرمعمول بزرگی دارند (بسته به چیزی که برای آن بهینه‌سازی می‌کنید) و ممکن است لو رفته باشند.
  2. در پنجره Instance View ، روی یک نمونه کلیک کنید. بسته به آنچه برای آن نمونه قابل اجرا است، برگه فیلدها یا تخصیص پشته تماس باز می شود. از اطلاعات موجود در برگه‌های Fields یا Allocation Call Stack برای تعیین اینکه آیا نمونه‌ها واقعاً مورد نیاز هستند یا تکرارهای غیر ضروری هستند، استفاده کنید.

روی هر ورودی لیست کلیک راست کنید تا به کد منبع مربوطه بروید.

مراجع جهانی JNI را مشاهده کنید

رابط بومی جاوا (JNI) چارچوبی است که به کدهای جاوا و کدهای بومی امکان تماس با یکدیگر را می دهد. مراجع JNI به صورت دستی توسط کد اصلی مدیریت می شوند، بنابراین ممکن است مشکلاتی از جمله موارد زیر رخ دهد:

  • اشیاء جاوا که توسط کدهای بومی استفاده می شوند برای مدت طولانی زنده نگه داشته می شوند.
  • اگر یک مرجع JNI بدون حذف صریح حذف شود، ممکن است برخی از اشیاء روی پشته جاوا غیرقابل دسترسی شوند.
  • محدودیت مرجع جهانی JNI تمام شده است.

برای عیب یابی چنین مشکلاتی، View JNI heap را در نمایه ساز انتخاب کنید تا همه مراجع جهانی JNI را مرور کنید و آنها را بر اساس انواع جاوا و پشته های تماس بومی فیلتر کنید. روی یک فیلد نمونه در برگه فیلدها کلیک راست کرده و Go to instance را انتخاب کنید تا پشته تماس تخصیص مربوطه را ببینید.

تب Allocation Call Stack به شما نشان می دهد که منابع JNI در کجا تخصیص یافته و در کد شما منتشر می شوند.

برای اطلاعات بیشتر در مورد JNI، به نکات JNI مراجعه کنید.