摘要:本章會說明什么是內存泄漏,為什么發生,以及如何防止它們。但是,未使用的對象并不是全部未被引用,其中一些被引用這是內存泄漏的來源。注意集合類,如等,因為它們是發現內存泄漏的常見地方。如果一個類管理自己的內存,程序應該對內存泄漏保持警惕。
內存管理是Java最重要的優勢之一,你只需創建對象,Java垃圾收集器會自動負責分配和釋放內存。但是,情況并不那么簡單,因為在Java應用程序中經常發生內存泄漏。
本章會說明什么是內存泄漏,為什么發生,以及如何防止它們。
什么是內存泄漏?
內存泄漏的定義:應用程序不再使用的對象,垃圾收集器卻無法刪除它們,因為它們正在被引用。
為了理解這個定義,我們需要了解對象在內存中的狀態。下圖說明了什么是未引用的,什么是引用的對象。
從圖中可以看出,有被引用的對象和未被引用的對象。未引用的對象將被垃圾收集,而被引用的對象將不會被垃圾收集。未引用的對象肯定是未使用的,因為沒有其他對象引用它。但是,未使用的對象并不是全部未被引用,其中一些被引用!這是內存泄漏的來源。
為什么內存泄漏發生?
讓我們來看看下面的例子,看看為什么發生內存泄漏。在下面的例子中,對象A是指對象B。A的生命周期(t1 - t4)比B的(t2 - t3)長得多,當應用中不再使用B時,A仍然有一個B的引用,這樣垃圾收集器就不能從內存中刪除B。這就可能會導致內存不足的問題,因為如果A同時為更多的對象做同樣的事情,那么會有很多像B這樣的對象沒有收集并占用內存空間。
B也可能擁有一堆其他對象的引用,B引用的對象也不會被收集。所有這些未使用的對象將消耗寶貴的內存空間。
如何防止內存泄漏?
以下是防止內存泄漏的一些快速實用技巧。
注意集合類,如HashMap、ArrayList等,因為它們是發現內存泄漏的常見地方。當它們被聲明為靜態時,它們的生命時間與應用程序的生命時間是相同的。
注意事件監聽器和回調。如果一個偵聽器被注冊了,但是當類不再被使用時,可能會發生內存泄漏。
如果一個類管理自己的內存,程序應該對內存泄漏保持警惕。通常情況下,指向其他對象的成員變量需要為null值。
思考
為什么JDK 6中的substring方法會導致內存泄漏?
推薦閱讀
去BAT面試完的Mysql面試題總結(55道,帶完整答案)
阿里高級Java面試題(首發,70道,帶詳細答案)
2017派臥底去阿里、京東、美團、滴滴帶回來的面試題及答案
Spring面試題(70道,史上最全)
通往大神之路,百度Java面試題前200頁。
分享Java干貨,高并發編程,熱門技術教程,微服務及分布式技術,架構設計,區塊鏈技術,人工智能,大數據,Java面試題,以及前沿熱門資訊等。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/71381.html
摘要:然而,中依然有可能發生內存泄漏。所以你的安卓快速定位解決內存泄漏掘金昨天是個好日子,程序員的節日,在這里給所有的程序員送上一份遲到的祝福。應用內存泄漏的定位分析與解決策略掘金,大家好,我是。 Android 性能優化之巧用軟引用與弱引用優化內存使用 - Android - 掘金前言: 從事Android開發的同學都知道移動設備的內存使用是非常敏感的話題,今天我們來看下如何使用軟引用與弱...
摘要:如果這個靜態變量在生命周期結束后沒有清空,就導致內存泄漏。因此造成內存泄露。注冊沒取消造成的內存泄露這種的內存泄露比純的內存泄漏還要嚴重,因為其他一些程序可能引用系統的程序的對象比如注冊機制。 原文鏈接 更多教程 為什么會發生內存泄漏 內存空間使用完畢之后未回收, 會導致內存泄漏。有人會問:Java不是有垃圾自動回收機制么?不幸的是,在Java中仍存在很多容易導致內存泄漏的邏輯(...
閱讀 1500·2021-11-17 09:33
閱讀 1267·2021-10-11 10:59
閱讀 2900·2021-09-30 09:48
閱讀 1909·2021-09-30 09:47
閱讀 3032·2019-08-30 15:55
閱讀 2343·2019-08-30 15:54
閱讀 1499·2019-08-29 15:25
閱讀 1653·2019-08-29 10:57