Java Profilers
Profiler و APM (Application Performance Management) ابزاری هایی برای مانیتورینگ و دیباگینگ پرفورمنس برنامه ها جاوا در زمان توسعه استفاده میشه.
JVM Profiler: یک ابزار فوق العاده برای دیباگینگ و پیدا کردن memory leak هستش و اطلاعات خیلی زیادی رو نشون میده.
قابلیتها:
- تمام اطلاعات JVN رو با جزئیات نشون میده مثل: RAM و CPU و Thread و GC
- فراخوانی تمام توابع و حافظهای که مصرف میکنن رو نشون میده و اجازه میده ساختارهای فراخوانی متدها رو ببینید.
- تمام اطلاعات حافظهی مصرف شده توسط اشیا رو میتونید ببینید.
- با نمونه گیری از CPU میتونیم زمان فعالیت کلاس ها و اشیا رو ببینیم.
- اجازه میده به صورت دستی GC رو اجرا کنیم و دادههای رم رو ببینیم.
نکته: به صورت مستقیم به JVM متصل میشه و ممکنه باعث کند شدن برنامه بشه. و برای نسخه production مناسب نیست.
برنامهها: VisualVM و JProfiler و YourKit و Java Mission Control
نکته: اندروید استودیو به صورت پیش فرض از YourKit استفاده میکنه.
Transaction Profilers: دو نوع داریم.
- Aspect Profilers: برای اضافه کردن کد به ابتدا و انتهای متد ها از AOP استفاده میکنه که مخفف aspect-oriented programming هستش. با این کار میتونه زمان شروع و خاتمه و یک گزارش کامل از متد بدست بیاره.
- Agent Profilers: برای اضافه کردن کد به برنامه از API جاوا استفاده میکنه (Java Instrumentation API). میتونه به عمیق ترین لایه های برنامه دسترسی داشته باشه و حتی تغییراتی رو توی bytecode ایجاد کنه. اجازه میده هر کدی رو توی برنامه اجرا کنی
برنامهها: XRebel و Stackify Prefix
APM Tools
- با این ابزار میتونیم نسخه production برنامه رو مانیتور کنیم.
- جزئیات کمتری رو نشون میده اما بیشتر مواقع اطلاعات صحیحی هستند و به صورت که خیلی هوشمنده انتخاب شدن تا به رفع رایجترین مشکلات کمک کنن.
نکته: از دستیار profiler جاوا استفاده میکنه اما از قوانینی خاصی پیروی میکنه تا در زمان اجرا تاثیری بر پرفرمنس برنامه نداشته باشه.
برنامهها: AppDynamics و Stackify Retrace و New Relic و Dynatrace
نگاه کوتاهی به چند تا از معروفترین و محبوبترین JVM Profiler ها با Command line
jstat: در یک بازه مشخص دادههای JVM memory و Heap size و GC هدف را نمایش میدهد.
jstat -gc
jmap: دادههای زیر رو در زمان فراخوانی نمایش میدهد.
- Heap summary
- Histogram of Java object Heap
- Class loader statistics
- Information on objects awaiting finalization
- مناسب برای دقیق تنظیمات و الگوریتمهای پیچیده
- پیشنهاد میشه از جاوا ۸ به بعد از jcmd بجای این استفاده کنیم
- اگه میخوایم وضعیت دادهها رو به طور مداوم مانیتور کنیم jstat بهتره
jmap -heap
jmap -histo
jcmd: بسیار کاربری برای ارسال دستورات تشخیص مشکل به JVM. دستور زیر یک heap dump در اختیار شما قرار میده. چون این ابزار خیلی بزرگی هستش توضیح دستوراتش توی این مطلب جا نمیشه.
jcmd GC.heap_dump filename=
jhat: در لحظه اجرا شدن ی heap dump میگیره و توپولوژی اشیا رو نشون میده.
- جایگزین HAT شده که مخفف Heap Analysis Tool هستش
- heap dump را به باینری تجزیه میکنه و برای گرفتن dump از jcmd استفاده میکنه.
- برای پیدا کردن روابط غیر عمدی میان اشیا heap استفاده میشه که موجب memory leak میشن.
jhat
hprof: در زمانی که مشکلی توی پرفورمنس داریم، یا thread handling یا memory leak داریم به ما کمک میکنه.
- در واقع یک DLL هستش که اینترفیس VJMTI که مخفف Java Virtual Machine Tool Interface رو پیاده سازی کرده.
- میتونه دادهها رو به صورت ASCII یا باینری توی فایل بنویسه یا به یک سوکت ارسال کنه.
- میتونه دادههای زیر رو بررسی و گزارش گیری کنه:
- CPU usage
- Heap allocation statistics
- Complete heap dumps
نگاه کوتاهی به دو تا از معروفترین و محبوبترین JVM Profiler ها با GUI و البته مجانی
Java VisualVM with Visual GC plugin: ی ابزار خوب ک تقریبا همه کار میکنه. میشه براش پلاگینهای شخصی توسعه داد و به دو صورت local و remote کار میکنه. همچنین میتونه از دادهها snapshot بگیرین و بعدا بررسی کنید. و تمام اینکارها رو با استفاده از ابزار خود JDK انجام میده. توجه داشته باشید که برای دسترسی به صورت remote باید JMX Remote Ports رو فعال کنید.
Java Flight Recorder & Java Mission Control: یک ابزار فوقالعاده برای آنالیز پیوسته تمام داده و اطلاعات برنامه در زمان اجرا.
JFR: وظیفه جمع آوری اطلاعات سطح پایین JVM و برنامه رو داره و توی Oracle JDK وجود داره.
JMC: یک ابزار حرفهای برای آنالیز دقیق و موثر حجم وسیعی از دادهها که توسط JFR تهیه شده.