簡體   English   中英

誰能詳細解釋 Java/Android 中的內存泄漏是如何工作的?

[英]Can anyone explain how this memory leak in Java/Android works in detail?

我從事Java開發已經有很長時間了,但是我很慚愧地說我仍然沒有很好地了解內存泄漏是如何發生的。 但是,我沒有 Android 開發經驗。

本演示文稿中的以下代碼為例:

在此處輸入圖像描述

我有以下問題(請注意,我是 Android 新手,但這個例子主要不是針對 Android 的)

  1. 這里怎么可能發生內存泄漏? 作者說這是因為內部類沒有標記為static ,它將持有對外部類的引用。

因此,如果我像這樣繼續創建外部類的對象:

MainActivity one = new MainActivity();
one.onCreate(bundle);

MainActivity two = new MainActivity();
two.onCreate(bundle);

MainActivity three = new MainActivity();
three.onCreate(bundle);

有什么關系? 如果我對static引用的工作方式沒有錯,那么只會創建一個LeakClass對象,對吧? 除非涉及到單獨的classloader ,對吧?

  1. 由於Android的工作方式,內存泄漏是否僅可能在這里? 如果我要手動創建這些對象,那么這不會是一個問題,對吧?

因為 LeakClass 是一個內部類,它具有對擁有它的外部類實例的固有引用。 由於您將該值存儲在靜態變量中,這意味着您將對該外部類的引用存儲在該靜態變量中。 將 Activity 存儲在靜態中總是泄漏,而且總是一個壞主意。 活動不是單例,你不能假設只有其中一個。

如果您不需要該父引用,則可以將其設為靜態內部類。 靜態內部類沒有隱式外部引用,但不能訪問所屬類的函數的成員變量。 或者你可以讓它成為一個獨立的、非內部的類(這兩個是同樣好的解決方案)。

如果確實需要該父引用,則不能將其存儲在靜態變量中而不會泄漏。 找出另一種使該數據可用的方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM