یادداشت مترجم: میل به ترجمه یادداشت در اوایل صبح ژوئن پس از خواندن آن در نیمه خواب در واگن مترو ظاهر شد. مخاطبان هدف: افرادی که اولین گام های خود را در دنیای جاوا برمی دارند و به دلیل ماهیت پیشینه فنی یا تمایل اولیه خود، بسیار مشتاق هستند تا زیر کلاه جاوا قرار بگیرند و تمام فرآیندهای "الکترودینامیک" را بیاموزند. من مطمئن هستم که برای کسانی که این را می خوانند، این نقطه شروع سفر به دنیای پیکربندی JVM و GC خواهد بود. باد منصفانه! مقاله اصلی اینجا به عنوان یک توسعهدهنده، ساعتهای بیشماری را صرف پاک کردن باگها از یک برنامه جاوا میکنید و عملکردی را که لازم است به دست میآورید. در حین تست متوجه می شوید که برنامه به تدریج کندتر اجرا می شود و در نهایت به طور کامل از کار می افتد یا به سادگی عملکرد ضعیفی را نشان می دهد. در نهایت بپذیرید که نشت حافظه رخ می دهد. زباله جمع کننده جاوا تمام تلاش خود را برای مقابله با این نشت ها انجام می دهد. اما در مواجهه با موقعیت هایی از این دست تنها کارهای بسیار زیادی می توان انجام داد. شما به روش هایی برای شناسایی تماس های نشت حافظه، شناسایی علل، و درک نقش زباله جمع کننده جاوا در تأثیرگذاری بر عملکرد کلی برنامه نیاز دارید.
علائم اصلی نشت حافظه جاوا
چندین علامت وجود دارد که نشان می دهد یک برنامه دارای مشکلات نشت حافظه است. کاهش جزئی در عملکرد، به جای شکست ناگهانی برنامه، تنها نشان دهنده نشت حافظه است. این مشکل می تواند هر بار در حین کار یا فقط زمانی رخ دهد که برنامه با حجم زیادی از داده شروع به کار کند یا برعکس، شما شروع به مقیاس گذاری برنامه کنید. هنگامی که نشت تمام منابع حافظه موجود را مصرف کرد، برنامه احتمالاً خطای کمبود حافظه را نشان می دهد. اگر برنامه را مجدداً راه اندازی کنید و به بهترین ها امیدوار باشید، با خرابی های مکرر تا رفع نشت مواجه خواهید شد. به طور کلی، نشت حافظه زمانی اتفاق میافتد که ارجاعات شیء به جای آزاد کردن حافظه جمع میشوند. آنها تمام حافظه موجود را اشغال می کنند و دسترسی برنامه را به منابع مورد نیاز خود غیرممکن می کنند.
خطاهای پیکربندی که به صورت نشت حافظه ظاهر می شوند
قبل از بررسی موقعیت هایی که باعث مشکلات حافظه جاوا می شوند و تجزیه و تحلیل انجام دهید، باید مطمئن شوید که تحقیق مربوط به مشکل کاملاً متفاوتی نیست. برخی از خطاهای خارج از حافظه به دلیل خطاهای مختلف مانند خطاهای پیکربندی رخ می دهد. حافظه برنامه ممکن است کم باشد یا ممکن است با سایر برنامه های موجود در سیستم در تضاد باشد. اگر شروع به صحبت در مورد مشکلات حافظه کم می کنید اما نمی توانید بفهمید که چه چیزی باعث نشت می شود، نگاهی متفاوت به برنامه بیندازید. متوجه خواهید شد که باید تغییراتی در رشته نهایی سازی ایجاد کنید یا مقدار فضای تولید دائمی را افزایش دهید، که منطقه ای از حافظه JVM برای ذخیره توضیحات کلاس های جاوا و برخی داده های اضافی است.
مزایای ابزارهای نظارت بر حافظه
ابزارهای نظارت بر حافظه، دید بیشتری را در استفاده برنامه جاوا از منابع موجود فراهم می کنند. با استفاده از این نرم افزار، شما گامی در جهت محدود کردن جستجوی ریشه مشکل نشت حافظه و سایر حوادث عملکردی بردارید. ابزارها در چندین دسته قرار می گیرند، و ممکن است لازم باشد از برنامه های مختلف استفاده کنید تا بفهمید چگونه به درستی مشکل را علامت گذاری کنید و چه چیزی اشتباه رخ داده است، حتی اگر با نشت حافظه سر و کار دارید. فایل های heap dump اطلاعات لازم را برای تجزیه و تحلیل حافظه جاوا فراهم می کنند. در این مورد، باید از دو ابزار استفاده کنید: یکی برای ایجاد یک فایل dump و دیگری برای تجزیه و تحلیل دقیق. این راه حل اطلاعات دقیقی در مورد آنچه در برنامه اتفاق می افتد ارائه می دهد. هنگامی که ابزار مکان مشکلات احتمالی را مشخص می کند و برای کشف مکان دقیق حادثه، منطقه را محدود می کند. و این بازه زمانی، زمان طولانیترین و آزاردهندهترین بخش آزمون و خطا است. تحلیلگر حافظه چندین مشکل را در کد شما نشان می دهد، اما شما کاملا مطمئن نیستید که برنامه شما با چه مشکلاتی مواجه است. اگر همچنان با همان خطا مواجه شدید، دوباره شروع کنید و روی خطای احتمالی دیگری کار کنید. هر بار یک تغییر ایجاد کنید و سعی کنید خطا را تکرار کنید. باید اجازه دهید برنامه برای مدتی اجرا شود تا شرایط خطا تکرار شود. اگر در اولین آزمایش نشت حافظه وجود داشت، حتماً برنامه را بارگیری کنید. یک برنامه ممکن است با مقدار کمی داده به خوبی کار کند، اما ممکن است در هنگام کار با حجم زیادی از داده ها، دوباره همان خطاها را ایجاد کند. اگر همان خطا همچنان رخ داد، باید از نو شروع کنید و به دنبال علت احتمالی دیگری باشید. ابزارهای نظارت بر حافظه زمانی که برنامه به طور کامل عملیاتی شد مفید بودن خود را ثابت می کند. میتوانید از راه دور عملکرد JVM را نظارت کنید و پیش از آنکه توسعهدهنده به مشکل بپردازد و دادههای عملکرد تاریخی را جمعآوری کند تا به بهبود تکنیکهای برنامهنویسی خود در آینده کمک کند و ببینید که جاوا در زیر بارهای سنگین چگونه عمل میکند، به طور فعال موقعیتهای خرابی را شناسایی کنید. بسیاری از راهحلها شامل حالتهای هشدار «خطر» یا سایر حالتهای مشابه هستند تا توسعهدهنده بتواند فوراً متوجه شود چه مشکلی پیش میآید. هر توسعهدهندهای نمیخواهد یک برنامه مهم، در حین تولید، از کار بیفتد و باعث از دست رفتن دهها یا صدها هزار دلار در زمان از کار افتادن برنامه شود، بنابراین ابزارهای نظارت بر حافظه زمان پاسخدهی توسعهدهنده را کاهش میدهند. برنامههای نظارت بر حافظه به شما این امکان را میدهند که بهجای اینکه از شما بخواهند به مشتری مراجعه کنید، فرآیند تشخیص را فوراً شروع کنید، جایی که هیچکس دقیقاً به شما نمیگوید چه خطایی رخ داده یا کد خطایی که برنامه ایجاد کرده است. اگر اغلب در مشکلات حافظه و عملکرد برنامه جاوا خود غوطه ور می شوید، در فرآیند تست غوطه ور شوید. هر بخش ضعیف را در فرآیند توسعه شناسایی کنید و استراتژیهای تست خود را تغییر دهید. با همکاران مشورت کنید و رویکردهای آزمایشی خود را با بهترین شیوه های موجود مقایسه کنید. گاهی اوقات شما نیاز دارید که یک کد کوچک را اصلاح کنید و سپس از تأثیر ماندگار بر کل برنامه اطمینان حاصل کنید.
نقش زباله جمع کن در حافظه جاوا و نشت حافظه
Garbage Collector در جاوا نقش کلیدی در عملکرد برنامه و استفاده از حافظه دارد. به دنبال اشیاء استفاده نشده (مرده) می گردد و آنها را حذف می کند. این اشیاء دیگر حافظه را اشغال نمی کنند، بنابراین برنامه شما به اطمینان از در دسترس بودن منابع ادامه می دهد. گاهی اوقات برنامه به GC زمان یا منابع کافی برای حذف اشیاء مرده نمی دهد و آنها جمع می شوند. ممکن است با موقعیتی مواجه شوید که در آن به اشیایی که فکر می کنید مرده اند دسترسی فعال وجود دارد. زباله جمع کن نمی تواند کاری در این مورد انجام دهد زیرا ... مکانیزم مدیریت حافظه خودکار آن اشیاء فعال را دور می زند. به طور معمول زباله جمع کن به طور مستقل کار می کند، اما شما باید رفتار آن را تنظیم کنید تا به مشکلات حافظه شدید پاسخ دهد. با این حال، GC خود می تواند مشکلات عملکردی ایجاد کند.
مناطق GC
زباله جمع کن اشیاء را در مناطق مختلف برای بهینه سازی مونتاژ جدا می کند. نسل جوان دارای اشیایی است که به سرعت از بین می روند. زباله جمع کن اغلب از زمانی که باید تمیز کند در این منطقه کار می کند. اشیایی که پس از رسیدن به یک دوره مشخص زنده می مانند به نسل قدیمی منتقل می شوند. در منطقه نسل قدیم، اشیا برای مدت طولانی باقی می مانند و اغلب توسط جمع کننده حذف نمی شوند. با این حال، هنگامی که کلکتور در محدوده اجرا می شود، برنامه از طریق یک عملیات بزرگ انجام می شود که در آن جمع کننده از طریق اشیاء زنده نگاه می کند تا زباله ها را تمیز کند. در نتیجه، اشیاء برنامه در منطقه تولید دائمی نهایی قرار دارند. به طور معمول، این اشیاء شامل ابرداده های ضروری JVM هستند. این برنامه در Permanent Generation زباله زیادی تولید نمی کند، اما برای حذف کلاس ها در زمانی که کلاس ها دیگر مورد نیاز نیستند، به جمع کننده نیاز دارد.
رابطه بین زباله جمع کن و زمان پاسخگویی
زباله گرد، صرف نظر از اولویت اجرای موضوعات برنامه، آنها را بدون انتظار برای تکمیل متوقف می کند. این پدیده را رویداد «دنیا را متوقف کنید» می نامند. منطقه نسل جوان زبالهگیر تأثیر جزئی بر عملکرد دارد، اما اگر GC پاکسازی شدید انجام دهد، مشکلات قابل توجه است. شما در موقعیتی قرار می گیرید که GC کوچک نسل جوان دائماً در حال اجرا است یا نسل قدیمی به یک حالت کنترل نشده می رود. در چنین شرایطی، باید فرکانس نسل جوان را با عملکردی که نیاز به افزایش اندازه این ناحیه جمع کننده دارد، متعادل کنید. مناطق نسل دائمی و نسل قدیم جمعآوری زباله تأثیر قابل توجهی بر عملکرد برنامه و استفاده از حافظه دارند. این عملیات بزرگ پاکسازی زباله از پشته ها عبور می کند تا اجسام مرده را بیرون برانند. این فرآیند بیشتر از یک ساخت جزئی طول می کشد و تأثیر عملکرد ممکن است بیشتر طول بکشد. هنگامی که شدت شستشو زیاد است و اندازه منطقه نسل قدیم بزرگ است، عملکرد کل برنامه به دلیل رویدادهای "توقف جهان" درگیر می شود. بهینه سازی جمع آوری زباله مستلزم نظارت بر تعداد دفعات اجرای یک برنامه، تأثیر آن بر عملکرد کلی و نحوه تنظیم تنظیمات برنامه برای کاهش دفعات نظارت است. ممکن است لازم باشد شیء مشابهی را که بیش از یک بار قرار داده شده است، بدون نیاز به حصاربندی برنامه از محل قرارگیری، شناسایی کنید، یا ممکن است لازم باشد نقاط فشردهسازی را پیدا کنید که کل سیستم را عقب نگه میدارد. برقراری تعادل صحیح مستلزم توجه دقیق به همه چیز از بار CPU گرفته تا چرخه جمعآوری زباله است، به خصوص اگر نسل جوان و پیر نامتعادل باشند. رفع نشت حافظه و بهینه سازی جمع آوری زباله به بهبود عملکرد یک برنامه جاوا کمک می کند. شما به معنای واقعی کلمه با بسیاری از قطعات متحرک شعبده بازی می کنید. اما با رویکرد عیب یابی مناسب و ابزارهای تحلیلی که برای ایجاد دید دقیق طراحی شده اند، به نور در انتهای تونل خواهید رسید. در غیر این صورت از مشکلات مربوط به عملکرد رنج خواهید برد. قرار دادن و نظارت دقیق حافظه نقش مهمی در برنامه جاوا دارد. شما باید کنترل کامل تعامل بین جمعآوری زباله، دفع اشیا و عملکرد را در دست بگیرید تا برنامه خود را بهینه کنید و از خطاهای خارج از حافظه جلوگیری کنید. ابزارهای مانیتورینگ به شما کمک میکنند تا از مشکلات احتمالی مطلع باشید و روند استفاده از حافظه را برجسته کنید تا رویکردی فعال برای عیبیابی داشته باشید. نشت حافظه اغلب ناکارآمدی عیبیابی به روش معمول را نشان میدهد، به خصوص اگر با مقادیر پارامتر پیکربندی نادرست مواجه شوید، اما حل مشکلات مربوط به حافظه میتواند به شما کمک کند تا به سرعت از حوادثی که مانع شما میشوند جلوگیری کنید. کمال تنظیم حافظه جاوا و GC روند توسعه شما را بسیار ساده تر می کند.
GO TO FULL VERSION