Garbage Collector in Java | زباله روب در جاوا
توضیحات جلسه
جزوه و مستندات
مفاهیم کلیدی
- Garbage Collection (GC)
Garbage Collection یا GC فرایندی خودکار در جاوا است که وظیفه مدیریت حافظه را بر عهده دارد.
این سیستم بهصورت هوشمند، اشیایی را که دیگر در برنامه استفاده نمیشوند شناسایی میکند و آنها را از حافظه حذف میکند.
- Heap Memory
Heap Memory بخشی از حافظه است که همه اشیاء (Object) در زمان اجرا داخل آن ساخته و نگهداری میشوند.
زبالهروب (GC) مستقیماً با همین بخش از حافظه سروکار دارد.
- Unreachable Objects
Unreachable Objects به اشیایی گفته میشود که دیگر هیچ رفرنسی به آنها وجود ندارد و در نتیجه، برنامهنویس راهی برای دسترسی به آنها از طریق کد ندارد.
این اشیاء توسط GC شناسایی و پاکسازی میشوند.
- Memory Leak
Memory Leak یا نشتی حافظه زمانی رخ میدهد که اشیای بیاستفاده، بهدلیل وجود رفرنسهای ناخواسته، توسط GC پاک نمیشوند.
این وضعیت در نهایت میتواند باعث پر شدن حافظه و توقف برنامه شود.
- Young Generation
Young Generation بخشی از Heap است که اشیای تازهساختهشده در آن قرار میگیرند.
عملیات پاکسازی در این بخش معمولاً سریع و پرتکرار انجام میشود.
- Old Generation
Old Generation بخشی از Heap است که برای اشیایی با طول عمر بیشتر در نظر گرفته میشود.
اگر یک شیء چندین مرحله پاکسازی را در Young Generation پشت سر بگذارد، به این بخش منتقل میشود.
نکات مهم مصاحبهای
- تفاوت مدیریت حافظه در
JavaوC++چیست؟
در زبانهایی مانند C++، برنامهنویس باید حافظه را بهصورت دستی تخصیص دهد و سپس آن را آزاد کند؛ این موضوع ریسک خطای انسانی و Memory Leak را افزایش میدهد.
اما در جاوا، JVM این کار را بهصورت خودکار و از طریق Garbage Collector انجام میدهد.
- آیا میتوان اجرای زبالهروب را تضمین کرد؟
خیر.
متدهایی مانند System.gc() فقط یک درخواست به JVM برای اجرای GC ارسال میکنند. JVM بر اساس شرایط و اولویتهای خود تصمیم میگیرد چه زمانی این کار را انجام دهد و هیچ تضمینی برای اجرای لحظهای وجود ندارد.
- چگونه یک شیء را آماده زبالهروبی (Eligible for GC) کنیم؟
با از بین بردن رفرنسهای آن شیء.
برای مثال:
-
قرار دادن مقدار
nullداخل یک متغیر رفرنس -
خارج شدن شیء از محدوده در پایان اجرای یک متد
-
اختصاص دادن مقدار جدید به متغیری که قبلاً به یک شیء دیگر اشاره میکرد
-
ارور
OutOfMemoryErrorچه زمانی رخ میدهد؟
زمانی که Heap پر شده باشد و GC نتواند با حذف اشیای قدیمی، فضای کافی برای ایجاد اشیای جدید فراهم کند.
در این حالت، برنامه با خطای OutOfMemoryError متوقف میشود.
بیشتر بدانید
- ابزار
VisualVM
یک ابزار کاربردی برای مانیتور کردن وضعیت حافظه و مشاهده زنده عملکرد GC بهصورت نموداری است.
- نکته برنامهنویسی
تا حد امکان، اشیاء را در Scope متدها تعریف کنید تا پس از پایان متد، آزادسازی حافظه آنها توسط GC سادهتر انجام شود.
- فرایند ترفیع (Promotion)
اشیایی که چندین مرحله زبالهروبی را در بخش Young پشت سر میگذارند، به بخش Old منتقل میشوند؛ چون سیستم فرض میکند این اشیاء در بلندمدت مورد نیاز هستند.
- متد
finalize()
متد finalize() در نسخههای جدید جاوا Deprecated شده است و دیگر برای پاکسازی یا تخریب اشیاء پیشنهاد نمیشود.
