瞭解內存泄漏的根源

博客轉移至個人站點:http://www.wangchengmeng.club/

歡迎來吐槽

優化是老生常談的一個問題,也是一個廣泛的概念,談優化必不可少的就是內存優化,從而牽涉到內存泄漏和內存溢出等問題,關於內存泄漏的文章很多,再次複習一下,怎麼去看代碼是否會有內存泄漏,以及要怎麼去解決。

1.什麼是內存泄漏?

簡單來說就是內存不在GC的掌控之內了,比如某個頁面被銷燬但是其中對象還持有該引用不能被回收仍然佔有內存空間。

2.Gc回收機制:

某對象不再持有任何引用的時候纔會進行回收

3.怎麼去判斷一個對象是否可回收?

先看一張圖:

判斷對象是否可回收

一個對象是否可以被回收大家都知道的是看該對象是否還持有引用,究竟是持有誰的引用呢?一般情況吧某對象致爲null的時候該對象是可以被回收,但有些持有引用層次比較多的,就應該根據這張圖仔細分析一下了。沒有被GcRoot引用點引用的對象,即是可以被回收的對象,反之被GcRoot引用點引用的對象不可以被回收。

可以作爲GCroot的引用點:

        1.JavaStack中的引用對象
        2.方法區中的靜態引用指向的對象
        3.方法區中常量引用指向的對象
        4.Native方法中JNI引用的對象
        5.Thread---“活着的”線程
根據這個流程去查看某對象是否可以被回收,去了解項目組容易內存泄漏的原因。

常見的內存泄漏情況:

1.內部類持有外部類的引用(建議使用靜態內部類)
2.Context的泄漏(生命週期過長的情況建議使用ApplicationContext)
3.單例模式使用Context
4.Handler的使用
5.線程的不合理利用(建議使用線程池)
6.資源使用完畢沒有close
等等,開發中還有很多不經意的內存泄漏,仔細分析
關於解決內存泄漏的方法很多 比如heap(http://blog.csdn.net/xiaohuanqi/article/details/52001580[使用heap],以及各種開源工具,例如LeakCanary。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章