2014-02-05 68 views
2

我是android編程的新手。 may android應用程序的內存消耗會隨着時間顯着增加。當通過MAT分析時,它顯示堆積的對象的GC根是Native Stack。這些對象在本地代碼中被引用爲全局引用,但隨着時間的推移我會將其正確地釋放,我還將日誌記錄以確保計數匹配。 文檔約native stack不多清楚,因爲它只是指出:瞭解MAT的內存泄漏

在或在本機代碼輸出參數,如用戶定義的JNI代碼或JVM內部代碼。這通常是這種情況,因爲許多方法具有本地部分,並且作爲方法參數處理的對象成爲GC根。例如,用於文件/網絡I/O方法或反射的參數。

我不太確定它說什麼,問題在哪裏,我該如何解決。任何提示都非常感謝。提前致謝。

+0

以下是一些可能有用的鏈接:http://yourkit.com/docs/75/help/performance_problems/memory_leaks/gc_roots.jsp,http://www.youtube.com/watch?v= _CruQY55HOk – Submersed

+0

JNI中有用的本地引用和全局引用:http://developer.android.com/training/articles/perf-jni.html#local_and_global_references。 – fadden

回答

1

這個答案不會給你一個明確的解決方案,不是因爲我不願意,而是因爲這是不可能的(甚至更難,不只是查看你的代碼,但非常瞭解你的代碼)。但根據我的經驗,我可以告訴你,那些內存泄漏不僅僅是由於直接引用的對象 - 你聲明的對象(並且繼續引用另一個類/對象)依賴於許多其他類等等,而且可能您看到內存泄漏是由於您的任何實例的錯誤處理,這些實例同時引用其他實例。

調試內存泄漏通常是一項非常艱苦的工作,不僅因爲如上所述,它有時不直接依賴於您聲明的內容,而且因爲找到解決方案可能不是微不足道的。你可以做的最好的事情就是你已經做的事情:DDMS + HPROF。我不知道你有多少知識,但儘管這不是一種通用方法,但this link幫助我在代碼中發現內存泄漏。

雖然看起來微不足道,但調試這些類型的最好方法是逐步刪除部分代碼(總體來說,暗示與其他類的實例一起工作)並查看HPROF報告如何更改。

上SO ---- ---- EDIT

question是一個很好的例子來說明GC根。

+0

+1鏈接。但是,您能否幫我理解GC根作爲Native Stack的含義?這是什麼意思? – Aarkan

+0

據我所知,有些情況下(主要是可控的),當你正在處理的某個對象變得可以從堆外部訪問時。這基本上意味着你正在鎖定被分配的層次結構的一部分,並且不能被釋放,但有時並不意味着你直接引用它們。你引用的兩個例子,JVM和JNI分別引用了虛擬機和與其他語言的交互 - 在某些情況下使用這些例子可能導致GC根源併成爲巨大的內存泄漏生產者,因爲它們可能不會被釋放。 – nKn

+0

在我的答案中增加了一個有用的鏈接。 – nKn