我讀過blog post(抱歉,這是寫在中國)的作者說:由於Java/Android GC,是否可能將整數重置爲零?
這是一個網絡相關的應用程序,我們聲明一些私有變量,當用戶 也做了一些操作,這些變量將被設置爲一些值供以後使用。
通常情況下,應用程序運行良好,但是當我們打開一些網站, 沉重的JavaScript,我們的應用程序啓動時會出錯, 意外(沒有任何活動切換),我們找不到原因。
最後,我們發現,這是一個整數變量引起的已經 設置爲零。但是我們非常確信,我們的代碼將不會重置爲 零,所以只有一個可能的結論:「爲了滿足 通過的WebView所需的資源,垃圾收集器收集我們 變量」。所以最後我們將這個變量設置爲一個靜態變量來避免這個問題。
坦率地說,這個「GC設置爲零」的論點完全違背了我的Java知識。
因爲據我所知:Java的GC的
- 收集單元是對象,原始類型爲int沒有在Java對象。
- 一個實例變量的壽命時間是相同的所有者對象的壽命,並且當該對象已被收集的GC由實例變量的存儲器使用被釋放。
- 即使該變量是一個整數對象,而不是由此可收集原始INT,只要有一個可達參照它,也不會被收集。
- 即使我們使用的WeakReference存儲整數參考作出這樣的Integer對象收藏中,Integer對象已被收集後,我們無法訪問已釋放對象的內存,無論如何。
但我也擔心,如果有什麼我沒有考慮。
所以我在下面的問題很感興趣:
- 我有任何可能的情況int或Integer對象可以重置爲零由於垃圾收集?
- 是否有可能GC只釋放一個對象所需的部分內存空間(如只有一個實例變量),而不是全部對象?
- 是否可以引用已經存在的垃圾收集對象,如果我們對其進行解引用會發生什麼?
- 這種情況下最可能出現的情況是什麼?假設變量隨機地重置爲零,並且不是由它們的代碼引起的。 VM錯誤? GC臭蟲? JIT bug或其他什麼?
原因是(可能)他們在後臺的活動被破壞並重新創建。私有變量將是他們最初的。 – zapl 2012-04-19 15:23:14
@zapl:不,他們說這種現象發生時沒有活動轉換。 – 2012-04-19 15:28:42
然後它就像使用一個對象的錯誤實例或者實際上在隱藏的地方將該變量設置爲0一樣。重命名變量,添加一個打印訪問權的getter/setter,並檢查它的變化。這是一個外部錯誤(內存損壞,本地代碼寫入錯誤的地方,..)的機會非常小 – zapl 2012-04-19 15:36:17