2017-03-20 82 views
0

我知道有很多關於內存泄漏/處理android應用程序中的內存泄漏的討論,但它可以動態處理。動態處理內存泄漏

我剛剛在我的一次採訪中得到了這個問題。問題是

如何檢測應用程序在用戶設備上運行並在崩潰前保存數據時發生內存泄漏(OutOfMemoryError)。

我可以猜測,直到一個BaseActivity,就像爲所有活動做一個BaseActivity,並將數據保存在onStop()。

我也猜可以在BaseActivity中擴展Error類,但不幸的是java不支持多繼承,並且Error類中也沒有特別的方法來動態地檢測任何錯誤AFAIK。

我可能在上述情況下出錯。

有沒有其他方法可以做到這一點?

回答

1

我可能會使用與Leakcanary相同的方法。你可以閱讀關於它here

簡而言之,它們在對象之間創建弱引用。在GC之後,他們正在檢查參考是否被清除。如果不是,他們傾倒堆,並分析轉儲。 Analyzer計算GC根的最短強參考路徑以確定是否存在泄漏,然後構建導致泄漏的參考鏈。在那一刻如果有泄漏,你可以保存所有你需要的數據。

問題是,如果你想保存所有數據,你需要在主線程上完成所有這些。否則,應用程序可能會關閉,數據可能會丟失等。

+0

它確實是一種很好的技術。但是你能否清楚我,這些弱引用是如何幫助確定泄漏的? – Ranjit

+1

這不會幫助您發現泄漏,它幫助您不要創建新的泄漏。如果您對某個對象的引用較弱,則該對象將被GC刪除。所以這是跟蹤對象的唯一安全方式,並且不會干擾這些對象的垃圾回收。 要查看某個對象是否泄露,您需要跟蹤其生命週期。例如,如果在Activity中調用了onDestroy(),那麼沒有理由將該活動保存在內存中。因此,如果在某個對象中對該活動有強烈的引用,那麼該對象正在泄漏內存。 –

+1

感謝您的解釋。 :) – Ranjit