內部類和靜態內部類在對GC效能影響如何?

時間 2021-06-01 02:13:33

1樓:ETIN

看到很多大神的答案了,再來做點補充。對於非靜態成員內部類和匿名內部類,他們的例項都會隱式持有外部類例項物件的引用。正因為此,在某些場合——例如移動Android開發或其他嵌入式使用場景下,如果非靜態內部類例項的生存週期長於外部類生存週期,則會導致外部類例項所占用的堆空間無法及時釋放,從而導致記憶體洩露

所以,在Android開發時,某些內部類類使用非static的定義方式會導致lint test無法通過,有時會提示使用static內部類替代之,就是這個原因。

乙個典型的例子可以參考:[Android]Context洩露之謎:Handle & 內部類

2樓:六道絕形蹤

你這個問題真是讓人感覺思路清奇.

假如設計合理的話,那麼你設計為內部類的物件就算不設計為內部類,同樣還是需要持有外部類這個物件的引用的.

如果本身是不需要外部類引用,你卻設計為內部類,那麼說明你的設計不合理,跟內部類沒有關係.

而既然本身就應該有引用物件,那麼內部類的預設引用和顯式引用在GC上似乎沒有任何區別吧?

題目裡又加乙個靜態內部類更搞不懂什麼意思了,靜態內部類並不持有外部類引用,跟你問的GC更沒有聯絡吧?

3樓:祖春雷

成員內部類物件持有乙個建立該內部類物件的外部類物件。

說的有點繞,其實就是編譯器為內部類生成了乙個型別為外部類的例項域!final OuterClass this$0。

而靜態內部類沒有這個例項域。

所以,我認為:內部類物件與外部類物件在執行時其實和普通的物件也沒啥區別,也不會增加GC難度!

為什麼內部類的private變數可被外部類直接訪問?

夏蟲 成員內部類首先是外部類的成員 key 所以可以互相訪問對方的靜態變數和靜態方法 和修飾符無關,修飾符是對其他類而言,對外部類無效 非靜態內部類不能有靜態的東西 外部類訪問內部類非靜態的東西需要建立內部類物件,所以非靜態內部類一定要例項化才能訪問 非靜態內部類必須依賴外部類物件,所以也可以訪問外...

java為什麼匿名內部類的引數引用時final?

椒圖 public class InnerClass private int counts 10 public void test new Thread new Runnable private String a counts System.out.println in a.counts retur...

在java裡,外部類為啥不能用private和protected修飾,內部類卻可以?

yuantj 為什麼不能用 private 你寫完這個類給誰用呢?為什麼不能用 protected 包與包之間不存在繼承關係,所以不存在可以給子類訪問這一說,那就只剩可以給同包類訪問了,跟 package private 有啥差別呢? 李舜生 關於外部類只能用public或缺省修飾的說法 publi...