簡體   English   中英

關於非靜態類和垃圾收集中的靜態成員的問題

[英]A question about static members inside non-static classes and garbage collection

我的一位同事聲稱在C#中使用非靜態類中的靜態成員可以防止這些類的實例被垃圾收集,並且這是C#內存泄漏的常見來源。 因此,他總是將靜態成員包裝在靜態類中,並通過該靜態類上的靜態屬性或方法從那里獲取對它們的訪問權限。 我一直認為靜態是在堆棧上,而不是堆,因此與垃圾收集沒有任何關系。 這對我來說似乎不對。

這有什么道理?

他不知道他在說什么。 非靜態類中的靜態成員不會阻止對類的實例進行垃圾回收。

也就是說,靜態可以在堆棧或堆上。 垃圾收集無關緊要。 重要的是類型的靜態部分不與該類型的實例一起存儲。

靜態成員是GC的根。 從靜態引用的任何內容都將保持活動狀態。 靜態引用是在靜態類中還是在非靜態類中是無關緊要的。

如果你有一個具有靜態字段的非靜態類,並且你有該類的實例,那么靜態字段沒有很多實例 - 這是static定義的一部分 - 它不是每個實例字段。 因此,班級本身是否是靜態的,沒有任何區別。

所以,是的,靜態引用通常是內存泄漏的原因,尤其是在適當的時候沒有取消訂閱的靜態事件。 將類更改為靜態不會解決內存泄漏問題 - 您需要在其引用的實例的生命周期結束時刪除靜態引用。 通常這是通過Dispose()對象並讓Dispose清理引用/事件訂閱來完成的。

是一個了解GC如何工作,如何識別垃圾以及它如何處理垃圾的好地方。 除了終結者等等......

你的朋友不對。

靜態方法的想法是沒有該類的實例。 所以垃圾收集什么也沒有。

嘗試將this放在非靜態類中的靜態方法中,看看會發生什么。

暫無
暫無

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

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