دانستنی‌ها

بهبود زمان راه‌اندازی برنامه‌های جاوا در زمان توسعه

 

با وجود اینکه به طور کلی جاوا زبان کندی نیست، اما مدت زمان راه‌اندازی برنامه‌ها راضی کننده نیست! البته اگر بدانیم در پشت صحنه چه اتفاقاتی می‌افتد، همه چیز قابل توجیه است چرا که مراحلی از قبیل ساخت ماشین مجازی، لود کردن کلاس‌ها و در ادامه کامپایلر زمان اجرا (JIT) و … باید سپری شوند.

اگرچه زمان راه‌اندازی برنامه‌ها در پروژه‌های کوچک یا برنامه‌های کاربردی مشکل قابل‌توجهی به حساب نمی‌آید، اما در پروژه‌های بزرگ‌‌تر که classpath بزرگی دارند، در زمان توسعه به مسئله‌ای مهم تبدیل می‌شود. به طور خاص برنامه‌های Spring Boot با اینکه روند توسعه سریعی دارند،‌ اما با اضافه کردن تعدادی وابستگی‌، مدت زمان راه‌اندازی برنامه طولانی‌ می‌شود. 

 

آرگومان‌های ماشین‌مجازی (VM arguments)

در اینجا به شما چند آرگومان ماشین مجازی جاوا معرفی می‌شود که با آن‌ها می‌توان مدت زمان راه‌اندازی را کمتر کرد.

توجه: این نکات فقط برای اجرای برنامه در محیط توسعه است (مثلا زمانی که برنامه را راه‌اندازی مجدد می‌کنیم) و برای محیط عملیاتی (production) مطلقا توصیه نمی‌شود. 

۱- غیرفعال کردن تایید بایت‌کد (Disabling bytecode verification)

Xverify:none-

این گزینه تایید بایت کد توسط ماشین مجازی جاوا را غیرفعال می‌‌‌‌‌‌‌‌‌‌‌‌کند. وقتی این گزینه فعال باشد (یعنی در حالت پیشفرض)، ماشین مجازی جاوا در زمان بارگذاری کلاس، بایت‌کد را برای برخی از رفتارهای غیرمجاز و خطرناک بررسی می‌کند. غیرفعال کردن این گزینه از مهم ترین عوامل بهبود مدت زمان راه‌اندازی به حساب می‌آید. چرا که با انجام نشدن چنین بررسی‌هایی، زمان کمتری برای راه‌اندازی برنامه صرف می‌شود. تاکید می‌شود این گزینه در محیط عملیاتی نباید غیرفعال شود حتی اگر به امن بودن تمام بایت‌کدهای داخل classpath مطمئن هستیم. 

۲- بهینه‌سازی نشدن کد توسط ماشین مجازی

XX:TieredStopAtLevel=1-

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

تصویر ساعت شنی

یک برنامه‌ی Spring Boot ساده با پایگاه داده‌ی داخل حافظه‌ی H2 و چند مسیر REST داریم. حال می‌خواهیم تاثیر اجرای آرگومان‌های گفته شده را بر روی زمان راه‌اندازی این برنامه بسنجیم:

جدول تاثیر ویژگی‌های گفته شده روی زمان اجرای برنامه

همانطور که مشاهده می‌کنید فقط با اجرای این دو آرگومان ساده در ماشین مجازی، توانستیم مدت زمان راه‌اندازی برنامه را ۳۷٪ بهبود ببخشیم.

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

توصیه‌های مخصوص Spring Boot

در کنار این آرگومان های جادویی ماشین مجازی، در اینجا چند نکته دیگر ذکر می‌کنیم که در نظر گرفتن آنها در زمان توسعه‌ی یک برنامه‌ی Spring، روی مدت زمان راه‌اندازی برنامه، تاثیر چشمگیری دارد:

  • پروژه های Spring معمولا در classpath خود کلاس های زیادی دارند. به وابستگی های پروژه‌ی خود در برنامه های Spring نگاه کنید. احتمالا صد ها فایل jar. و هزاران کلاس هستند که باید بارگذاری شوند. جای تعجب نیست که غیرفعال کردن تایید بایت کد، زمان راه‌اندازی را به طور چشمگیری بهبود می‌بخشد. سعی کنید تعداد کتابخانه هایی که اضافه می‌کنید را کاهش دهید و قبل از اضافه کردن هر وابستگی جدید به پروژه‌تان، خیلی دقیق با خودتان فکر کنید که آیا واقعا نیاز است که آن را به پروژه‌تان اضافه کنید یا خیر. سعی کنید در نهایتا پروژه شما شبیه یک پروژه Node نشود به ظوری که نیمی از اینترنت در پوشه node_modules شما قرار داشته باشد!
  • بررسی کردن بخش های مختلف یک پروژه می‌تواند زمانگیر باشد. اگرچه این یکی از ویژگی های خاص چارچوب Spring است ولی همانطور که دربالاتر هم اشاره شد، اگر برنامه شما classpath بزرگی داشته باشد، زمان قابل توجهی برای اجرای کلاس های آن صرف می‌شود. سعی کنید پکیج‌هایی که قرار است بررسی شوند را محدود کنید و یا به این فکر کنید که شاید بهتر باشد که پروژه خود را به چند قسمت تقسیم کنید. همچنین می‌توانید برای جلوگیری از بارگذاری و ساخته شدن فوریِ Bean@ ها، از حاشیه‌نویسی Lazy@ استفاده کنید.
  • با راه‌اندازی کش می‌توانید بازدهی برنامه را زمانی که در حال اجرا است، به طور چشمگیری بهبود ببخشید اما زمانی که کش‌های زیادی دارید، فعال‌سازی همه‌ی آن‌ها در هنگام راه‌اندازی ممکن است کمی طول بکشد. در محیط توسعه می‌توانید بعضی از آن ها را خاموش کنید یا فعال‌سازی آن ها را به زمانی که واقعا نیاز است موکول کنید.
  • بر کسی پوشیده نیست که انجام عملیات مهاجرت در زمان راه‌اندزی برنامه می‌تواند باعث کندی شود. می‌توانید راه‌هایی را در نظر بگیرید که این عملیات به شکل ناهمگام انجام شود تا همه‌ی برنامه معطل انجام مهاجرت نشوند.

 

منبع: وبلاگ رایان هریسون

.

.

.

.

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


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

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

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

صفحه ویرگول: javcup

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

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

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

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

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