دانستنی‌ها

دستورات JDK

در این مقاله، با تعدادی از دستورات مفید و پرکاربرد JDK آشنا می‎شوید.

jps: چاپ JVMهای در حال اجرا

برای نمایش لیست JVMهای در حال اجرا، می‌توانید از دستور jps استفاده کنید. این دستور در جاوا ۶ معرفی شده است.

به صورت پیش‌فرض، صرفا PID و نام ساده کلاس راه‌اندازی‌کننده (یا نام JAR راه‌اندازی‌شده) را نمایش می‌دهد.

البته تعدادی پارامتر اختیاری هم وجود دارد که با استفاده از آن‌ها می‌‌توانید اطلاعات بیشتری کسب کنید.

پارامترکارکرد
l-نمایش نام کامل کلاس (fully-qualified)، مسیر کامل فایل JAR
v-نمایش آرگومان‌های استفاده‌شده در راه‌اندازی JVM مانند Dxxx-
m-نمایش‌ پارامترهای داده‌شده به اپلیکیشن. مانند args در متد (main(String… args

با توجه به وضعیت سیستم، با فعال بودن تمام پارامترهای بالا، چنین خروجی‌ای حاصل خواهد شد:

jinfo: چاپ داده‌های راه‌اندازی‌شده بر روی JVM

برای حل مشکلات production، نیاز است که به یک‌سری اطلاعات اضافی در خصوص یک JVM خاصِ در حال اجرا دسترسی داشته باشیم. این اطلاعات شامل مجموعه‌ای از تمام flagها و آرگومان‌های JVM و همچنین propertyهای سیستم است.

به این منظور، می‌توانید از دستور jinfo استفاده کنید و به اطلاعات تنظیمات جاوا برای یک فرآیند جاوایی خاص دست بیابید.

یک نمونه خروجی مربوط به این دستور را در ادامه مشاهده می‌کنید (جهت افزایش خوانایی، کمی خلاصه و فرمت شده است):

به منظور محدود و فیلتر کردن خروجی، پارامترهای زیر وجود دارد:

پارامترکارکرد
flags-صرفا اطلاعات مرتبط با flag را نمایش می‌دهد.
sysprops-صرفا propertyهای سیستم را نمایش می‌دهد.

در قدم بعدی، لازم است دیدی نسبت به داده‌های مرتبط با کلاسِ روی JVM به دست بیاورید. مانند آمارهای مربوط به بارگذاری کلاس، اشیای در انتظار finalizeشدن و heap اشیا.

می‌توانید از دستور jmap برای جاپ جزییات یک فرآیند خاص استفاده کنید. بسته به پارامتر مورد استفاده، خروجی متفاوت خواهد بود.

جهت چاپ آمار کلاس بارگذاری‌شده:

جهت چاپ هیستوگرام heap اشیای جاوایی:

این دستور برای تشخیص نشت حافظه نیز استفاده می‌شود که قبلا در مقاله‌ای مجزا، به تفصیل توضیح داده شده است.

jstack: چاپ نخ‌های موجود بر روی JVM

اگر مشکل مربوط به نخ‌ها (threads) باشد (مانند مشکل deadlock یا livelock)، جزییات مربوط به نخ‌های در حال اجرا، در دسترس هستند.

می‌توانید از دستور jstack استفاده کرده و stack trace مربوط به یک فرآیند جاوایی خاص را ببینید.

برای چک کردن قفل‌ها، از پارامتر l- استفاده کنید. به این ترتیب، خروجی زیر چاپ خواهد شد:

۱: همانطور که می‌بینید، هیچ قفلی وجود ندارد!

jconsole: نظارت بر یک JVM

داشتن یک دید بصری از داخل JVM در حال اجرا، می‌تواند بسیار مفید باشد.

با استفاده از دستور jconsole یک کنسول گرافیکی باز می‌شود که برای نظارت و مدیریت اپلیکیشن‌های جاوایی می‌توانید از آن بهره ببرید.

jconsole یکی از مهم‌ترین ابزارهای توسعه‌دهندگان جاوا است.

این ابزار، در زمینه‌های مختلفی مانند آنچه در ادامه ذکر شده، دیدی بصری از یک JVM در حال اجرا به شما می‌دهد.

حافظه:

در این کنسول، می‌توان نمودارهای مختلف مرتبط با حافظه مانند heap یا non-heap یا old gen یا eden یا survivor یا … را دید.

نخ‌ها:

در JConsole می‌توان روند تعداد نخ‌ها در یک بازه زمانی دلخواه را مشاهده کرد. هم‌چنین می‌توان هر نخ را به صورت جداگانه به همراه نام، وضعیت و پشته‌اش (stack) مشاهده کرد.

کلاس‌ها:

تعداد کلاس‌های بارگذاری‌شده را هم می‌توان دید.

خلاصه VM:

این ابزار می‌تواند داده‌های مرتبط با JVM را به ما نشان دهد. مانند

  • آرگومان‌های VM
  • Class path
  • Library path
  • Boot class path
  • سایز Heap
  • غیره
MBeans:

JConsole قادر است تمام Mbeanهای در دسترس را در یک ساختار درختی شامل ویژگی‌ها و متدهایشان نمایش دهد. علاوه بر این، امکان مقداردهی به ویزگی‌ها و یا فراخوانی متدها را هم به ما می‌دهد.

جمع‌بندی

JDK تعداد زیادی ابزار برای کمک به توسعه‌دهندگان دارد. چه از یک IDE استفاده کنید چه نکنید، این ابزارها کمکی بزرگ در کارهای روزانه‌تان هستند.

منبع

.

.

.

با ما همراه باشید

آدرس کانال تلگرام: JavaCupIR@

آدرس اکانت توییتر: JavaCupIR@

آدرس صفحه اینستاگرام: javacup.ir

آدرس گروه لینکدین: Iranian Java Developers

نوشته های مشابه

‫۳ دیدگاه ها

  1. شکرا
    سوالی درمورد enum ذهنم را مشغول کرده اگر اساتید مشکل گشایی کنند ممنون می گردم .
    در جاوا کلاس های بسیاری وجود دارد مثل دیتا استراکچر ها ، استریم ها ، کلاس های ریاضی گرافیکی و غیره و در مورد همه آنها با ایجاد یک شی می توانیم از آن کلاس و متد ها و قابلیت های آن استفاده نماییم در نتیجه ما با شی ای از آن کلاس ها سروکار داریم .
    در مورد enum ولی ما خود یک کلاس می سازیم (با اینکه کلاس enum در جاوا وجود دارد ) و نه شی ای از آن کلاس enum .
    خوب enumی که ما می سازیم یک کلاس است پس پیش فرض اینگونه درنظر می گیریم که کلاس enum که ما می سازیم می بایست کلاس enum جاوا را extend کند ولی می دانیم که ساختن enum به هیچ وجه بدینگونه نیست و فقط با نوشتن enum و دادن نام دلخواه کلاس ساخته می شود .
    آیا کلاس enum ما بصورت ضمنی کلاس enum جاوا را ارثبری می کند ؟
    اگر جواب سوال قبل بلی باشد از کدام متد آن استفاده می کند که بدین گونه عجیب اشیا را درون خود تعریف می کند در جاواداک چنین متدی مشاهده نکردم .
    در جاواداک کلاس enum کانستراکتور دارد چرا نمی توانیم از کانستراکتور آن استفاده نماییم (مثلا به شکل new )؟
    ودر نهایت اینکه چرا کلاس enum متد finalize را بسته است ؟
    پیشاپیش سپاسگزارم

    1. سلام تا اونحایی که بنده اطلاع داره کلاسی به نام Enum داریم که یک کلاس جنریک هست
      در واقع شما وفتی یک enum برای مثال BOOK میسازی داری یک کلاس میسازی که از Enum ارث بری میکنه و متدی مثل name هم از اون کلاس اومده

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا