برنامه نویسی

نشت حافظه جاوا: پیدا کردن و تسخیر

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

ما در این مقاله وبلاگ به نشت حافظه، نحوه یافتن آنها و بهترین راه های متوقف کردن آنها در برنامه های جاوا خواهیم پرداخت.

دلایل رایج نشت حافظه در جاوا عبارتند از:

  • مراجع ایستا: اشیاء ارجاع شده به فیلد استاتیک دارای طول عمری برابر با کلاس لودر هستند که در صورت مدیریت نادرست می تواند منجر به نشت حافظه شود.

  • منابع بسته نشده: نشت حافظه می تواند با بستن نادرست منابعی مانند فایل ها، جریان ها یا اتصالات پایگاه داده رخ دهد.

  • مراجع شنونده یا پاسخ به تماس: اشیاء با عمر کوتاه‌تر (مانند تماس‌ها یا شنوندگان) که توسط اشیاء با عمر طولانی‌تر ارجاع داده می‌شوند، حتی پس از اینکه دیگر مورد نیاز نباشند، زباله جمع‌آوری نمی‌شوند.

  • اشیاء ذخیره شده در حافظه پنهان: یکی از روش‌های رایج برای افزایش سرعت برنامه، ذخیره‌سازی پنهان است. با این حال، نشت حافظه بزرگ ممکن است از مواردی رخ دهد که در حافظه پنهان ذخیره شده و زمانی که دیگر مورد نیاز نیستند، به‌درستی حذف شده‌اند.

چگونه نشت حافظه را تشخیص دهیم؟

در حالی که یافتن نشت حافظه در جاوا ممکن است دشوار باشد، تعدادی ابزار و روش برای کمک وجود دارد:

  1. تجزیه و تحلیل دامپ هیپ: Heap dump ها را می توان با استفاده از برنامه هایی مانند VisualVM، YourKit یا Eclipse Memory Analyzer (MAT) گرفته و بررسی کرد. نمونه هایی از مواردی را پیدا کنید که حافظه زیادی را اشغال می کنند یا نباید وجود داشته باشند.

  2. ابزارهای پروفایل: پروفایلرهای جاوا را می توان برای ردیابی استفاده از حافظه و یافتن نشت احتمالی استفاده کرد. پروفایلرها امکان نمایش الگوهای استفاده از حافظه، نرخ تخصیص اشیا و اشیایی که زباله جمع آوری نمی شوند را فراهم می کنند.

  3. استثناهای OutOfMemoryError: این استثناها هشداری در مورد نشت حافظه در برنامه و اتمام حافظه برنامه است.

تکنیک های پیشگیری

اتخاذ روش های کدگذاری جامد و استفاده از ابزارهای مناسب برای جلوگیری از نشت حافظه ضروری است:

  • از مراجع ضعیف استفاده کنید: از مراجع ضعیف می‌توان برای حافظه پنهان یا الگوهای شنونده استفاده کرد تا از نگهداری اشیا در حافظه برای مدت طولانی‌تر از حد لازم جلوگیری شود.
WeakReference<Object> weakRef = new WeakReference<>(object);
// Use weakRef.get() to access the object
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

  • بستن منابع به درستی: سعی کنید با منابع یا در نهایت بلوک‌ها همیشه باید برای بستن منابع (مانند جریان‌های ورودی، خروجی‌ها و اتصالات) استفاده شوند تا مطمئن شوید که به درستی منتشر شده‌اند.
try (InputStream is = new FileInputStream("file.txt")) {
    // Read the input stream from here
} catch (IOException e) {
    // Handle the exceptions here
}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

  • اجتناب از مراجع استاتیک: فیلدهای ایستا حاوی ارجاعات شیء باید با دقت مدیریت شوند. برای اینکه بتوانید آنها را برای زباله جمع آوری کنید، مطمئن شوید زمانی که دیگر مورد نیاز نیست، آنها را باطل کنید.
public class MySingletonInstance {
    private static MySingletonInstance instance;

    public static MySingletonInstance getInstance() {
        if (instance == null) {
            instance = new MySingletonInstance();
        }
        return instance;
    }

    public void cleanup() {
        // Clean up resources
        instance = null;
    }
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

  • از گزارش های جمع آوری زباله استفاده کنید: به منظور ردیابی رفتار جمع‌آوری زباله و شناسایی روندهای مصرف غیرعادی حافظه، می‌توانید گزارش‌های جمع‌آوری زباله (-XX:+PrintGCDdetails و -XX:+PrintGCDateStamps) را فعال کنید.

نتیجه

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

منابع:

GitHub: https://github.com/tharindu1998/java-memory-leaks

https://www.jetbrains.com/help/idea/cpu-and-memory-live-charts.html

https://sematext.com/blog/java-memory-leaks/

https://www.baeldung.com/java-memory-leaks

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

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