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

با وجود اینکه به طور کلی جاوا زبان کندی نیست، اما مدت زمان راهاندازی برنامهها راضی کننده نیست! البته اگر بدانیم در پشت صحنه چه اتفاقاتی میافتد، همه چیز قابل توجیه است چرا که مراحلی از قبیل ساخت ماشین مجازی، لود کردن کلاسها و در ادامه کامپایلر زمان اجرا (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