在Android中每個App的內存是有限的,一般來講,在開發的過程中我們要避免無謂的內存占用。實際教學過程中,有一個很簡單但是很多學生經常會犯的錯誤,在此指出。
觀察以下代碼:
學生乍一看,沒有太大的問題。當然,這個也反應出了很多學生的一個不好的習慣。
首先,Drawable雖然是一種抽象的圖像概念,但是它確實是占用不少資源的,使用static關鍵字來修飾,雖然在編寫的過程中比較省事,但是導致的問題是static修飾的sBackground資源不會輕易釋放,更為嚴重的是,這個sBackground的Drawable持有對其Activity的引用。
這樣就導致這個Activity的實例也不會被釋放,導致內存泄露。
這個問題非常嚴重,但是很多學生現在的階段并不是很關注,因此static關鍵字的教學的過程中應該進行再反思。
關于上文的內存泄露,特別是內存溢出,兩者之間的關系來說明一下。
實際上來說,泄露和溢出這兩個形容并不是很好區分。首先這兩前者是一個狀態,后者是一個結果。
內存泄露是應用使用資源后沒有及時釋放(如本文中例子),導致內存中一直持有多余的內存占用,這個狀態的累積會導致可用內存越來越少。舉例:一個人的資產有一100萬,但是他想買一輛50萬的車,雖然有一百萬的資產,但是身上帶著的銀行卡里只有100元,跟老板口舌一下,也能買,但是這個債務會一直存在。如果一直這樣消費,債務會滾雪球,早晚有崩潰的一天。
內存溢出是指堆棧達到大值后,應用內存無法滿足需求了,導致Crash現象,這是一個結果。舉例:還是上文中的那個人,他想買300萬的房子,這樣根本就買不了。
如果說上面的例子還不足以理解其原因,下面再舉一例:
如上例所示,delay的時間過長也可能導致資源無法及時釋放,這也是一種形式的內存泄露。
一次內存泄露可能并不能有實質性的結果,但是不好的編程習慣,多次的內存泄露終會導致內存溢出,引發重大的bug,這是我們應該極力避免的事情。
雖然在Android開發中Java是基礎語法,Java的垃圾回收機制比較智能,很多情況下并不需要編程者去思考很多問題,但是正是因為這種機制可能會導致很多不可預知的小錯誤的累積。
當然,導致內存泄露和溢出的問題有很多,比如在開發中由于圖片資源占用過多。這些問題我會在今后的博文中跟大家繼續分享。我個人也在不斷的學習之中,希望各位讀者能與我也做一些交流探討。
一個優秀的開發者不僅僅應該局限于寫出程序,而是寫好程序。