آشنایی با پروفایلرها و معرفی ابزار YourKit Java Profiler

آیا تابه حال در یک پروژه بزرگ با مشکلاتی مانند مصرف زیاد حافظه یا زمان اجرای طولانی برنامه روبرو شدید؟ و احتمالا متوجه شدهاید که چقدر پیدا کردن تابع یا تکه کد مشکلدار از بین دهها تابع که هرکدام توسط یکی از اعضای تیم تولید شدهاند مشکل است. در ادامه برای حل این مشکلات و بسیاری از مسائل دیگر ابزارهای Profiler را معرفی میکنیم و شرح کوتاهی بر معرفی و نحوه استفاده از یکی از این ابزارها خواهیم داشت.
ابزارهای Profiler ابزارهایی برای نظارت بر بسیاری از پارامترهای سطح JVM مانند اجرای توابع، اجرای ریسهها، ایجاد اشیاء و garbage collection هستند. این ابزارها دید جزئیتری از اجرای برنامه و منابعی که در حین اجرا مورد استفاده قرار میگیرد برای کمک به بهینهسازی کد در اختیار برنامهنویس قرار میدهند. برای پروفایل کردن برنامههای جاوا نیز ابزارهای زیادی وجود دارد که در ادامه ابزار YourKit Java Profiler را معرفی میکنیم.
نرمافزار YourKit Java Profiler یک نرمافزار تجاری است که برای سیستم عاملهای ویندوز، مک، لینوکس و سولاریس قابل دریافت است. برای دانلود این نرمافزار میتوانید از سایت https://www.yourkit.com آن را دانلود کنید و در مدت ۱۵ روز میتوانید مجوز استفاده رایگان آن را دریافت نمایید. بعد از اتمام این دوره لازم است لایسنس آن را بر حسب نیاز خود خریداری کنید. البته نسخههای قدیمیتر آن به صورت کرک شده از سایتهای ایرانی قابل دانلود هستند. بعد از دانلود و سپری کردن مراحل عادی نصب برنامه، پلاگین آن را در اکلیپس(یا IDEهای دیگری مانند Intellij Idea, NetBeansو …) نیز نصب نمایید. برای انجام این کار در اکلیپس مراحل زیر را دنبال میکنیم:
۱- برنامه اکلپیس را باز میکنیم
۲- در منوی Help گزینه Install New Software… را انتخاب میکنیم
۳- در نوار Work with: آدرس http://www.yourkit.com/download/yjp2015_for_eclipse/ را کپی میکنیم و Enter میزنیم
۴- منتظر میمانیم تا اطلاعات آدرس وارد شده را دریافت کرده و در لیست موجود در صفحه نام Profiling نشان داده شود.
۵- آن را انتخاب کرده و گزینه next را میزنیم و منتظر نصب میمانیم.
۶- بعد از اتمام نصب با پیغام ریستارت اکلیپس موافقت کرده و منتظر باز شدن مجدد ان میشویم.
به این ترتیب در نوار ابزار ما آیکون این نرمافزار اضافه میشود و در صورتی که روی پروژه جدید راست کلیک کنیم گزینه Profile as… نیز به قابلیتهای اکلیپس ما اضافه شده است.
حال به عنوان نمونه نحوه استفاده از این ابزار را روی تکه کد زیر نشان میدهیم.
public class JavaCup { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int i = scanner.nextInt(); int j = scanner.nextInt(); int k = scanner.nextInt(); temp(); eval(i, j, k); } public static void eval(int i, int j, int k) { if (i * i + j * j == k * k || i * i == j * j + k * k || j * j == i * i + k * k) { System.out.println("YES"); } else { System.out.println("NO"); } } public static void temp() { ArrayList<Integer> a = new ArrayList<>(); for (int i = 0; i < 10000; i++) { for (int j = 0; j < 20000; j++) { a.add(i + j); } } } }
این کد یک تابع main دارد که سه ورودی دریافت کرده و دو متد temp, eval را صدا میزند. متد temp تابعی است که زمان زیادی را گرفته است و هدف پیدا کردن این تابع از بین چندین تابعی است که در یک پروژه بزرگ توسط افراد مختلف ممکن است نوشته شده باشد. (تابع eval چه میکند؟)
برای پروفایل کردن اجرای این پروژه روی آیکون Yourkit java Profiler در اکلیپس کلیک کرده و منتظر باز شدن برنامه پروفایلر میشویم.
بعد از اجرای پروفایلر در صفحه مربوط به CPU profiling با انتخاب گزینه Method list لیست توابع نشان داده میشود.
از آن جا که هنوز ورودی های لازم به برنامه داده نشده است توابع temp , eval در این لیست مشاهده نمیشوند. پس به اکلیپس رفته و سه عدد صحیح در کنسول وارد میکنیم.
بعد از بازگشت به برنامه پروفایلر در همان قسمت متدهای دیگری که اجرا شدند نیز به لیست اضافه شدند و مطابق شکل زیر اولین تابع main بوده و بعد از آن تابع temp قرار گرفته است . اگر دقت کنیم این توابع بر اساس ستون time که زمان مصرف کرده در حین اجراست مرتب شده اند به این ترتیب به آسانی کشف نمودیم که بیشترین مصرف زمان مربوط به تابع temp بوده و به دنبال بهینهسازی آن میرویم.
در این مثال یک قابلیت ساده ولی پرکاربرد این ابزار را دیدیم اما این تنها یکی از چندین قابلیت این ابزار است. اگر خودتان با آن کار کنید از اطلاعات مفید و کامل و نمودارهای جامعی که در اختیارتان قرار گذاشته میشود به شگفت میآیید. به عنوان مثال در تب Performance Charts نمودارهایی مانند میزان مصرف CPUو تعداد ریسهها و مصرف حافظه هیپ و غیر هیپ مشاهده خواهید کرد یا در تب Memory مصرف حافظه (heap, non-heap) و وضعیت مجموعههای garbage در حین زمان، وضعیت تخصیص حافظه به اشیاء و کلاس ها و زمان سپری شده در زباله روب را در حین اجرای برنامه نشان میدهد.
به علاوه در منواصلی برنامه میتوانید snapshotهایی برای بررسی پارامترهای مختلف بگیرید که اطلاعات دقیقتر و جزئیتری را مشاهده کنید. به عنوان مثال با دریافت snapshot از حافظه، اطلاعات مصرف حافظه به صورت دقیق در اجزای مختلف برنامه نشان داده میشود.
به طور کلی برنامههای پروفایلر قابلیتهای خیلی زیادی دارند که شرح جزئی همه آنها در این مطلب نمیگنجد. اما اگر در پروژههای خود با چنین نیازهایی روبرو شدید بدانید راهحل شما در یک ابزار پروفایلر مانند Yourkit Java Profiler قرار گرفته است.