大家都知道內存泄漏和內存溢出是不一樣的,內存泄漏所導致的越來越多的內存得不到回收的失手,最終就有可能導致內存溢出,下面說一下使用staitc屬性所導致的內存泄漏的問題。
在dalvik虛擬機中,static變量所指向的內存引用,如果不把它設置為null,GC是永遠不會回收這個對象的,所以就有了以下情況:
- public class SecondActivity extends Activity{
- private Handler mHandler = new Handler(){
- @Override
- public void handleMessage(Message msg) {
- super.handleMessage(msg);
- SecondActivity.this.finish();
- this.removeMessages(0);
- }
- };
- private static Haha haha;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- haha = new Haha();
- mHandler.sendEmptyMessageDelayed(0,2000);
- }
- class Haha{
- }
- }
非靜態內部類的靜態引用。然后在2秒之后我們要finish掉這個activity,會造成什么問題呢?我們知道,內部類和外部類之間是相互持有引用的,SecondActivity實例持有了haha的引用,但這里haha是用static修飾的,上面說了,虛擬機不會回收haha這個對象,從而導致SecondActivity實例也得不到回收,造成內存溢出。
這貨還在這得不到回收。
怎么解決這個問題呢,很簡單,只要在Activity的onDestroy方法里把haha設為null就行啦
- protected void onDestroy() {
- super.onDestroy();
- if(haha!=null){
- haha = null;
- }
- }
那么還有另外一種情況,單例的問題。單例也是用了其static屬性,很多單例,往往需要用到context對象,而又是通過傳值的方式獲得,比如:
先來一個單例
- public class SingleInstanceF {
- private static SingleInstanceF single;
- private Context context;
- private SingleInstanceF(Context context){
- this.context = context;
- }
- public static SingleInstanceF getInstance(Context context){
- if(single==null){
- single = new SingleInstanceF(context);
- }
- return single;
- }
- }
再來一個Activity來用它,context傳入一個this,再2秒之后關閉Activity
- public class ThirdActivity extends Activity{
- private Handler mHandler = new Handler(){
- @Override
- public void handleMessage(Message msg) {
- super.handleMessage(msg);
- ThirdActivity.this.finish();
- this.removeMessages(0);
- }
- };
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- SingleInstanceF instanceF = SingleInstanceF.getInstance(this);
- mHandler.sendEmptyMessageDelayed(0,2000);
- }
- }
后來我們發現這貨還在,又是得不到回收:
怎么辦呢,還是像上面那樣,把靜態對象設置為null,或者我們傳入context的時候,別傳this了,this可是當前Acitvity啊,傳Application Context即可。但是不是都可以傳Application Context呢,明顯不是,有的事是Application Context干不了的,這個得看具體情況而定。