Runtime.getRuntime().exec 導致的記憶體溢出

來源:互聯網
上載者:User

公司的項目有個奇怪現象,運行在android 3.0以上的程式,會出現記憶體泄露問題。於是,開始解決問題。

首先,按照過去的經驗,查看 用戶端請求伺服器 的代碼,看是否有未關閉的請求串連,但最終排除。

其次,定位返回結果後的對象是否引用過多,系統無無法回收,但也沒有問題。

最後,定位到字串替換位置,就是一堆replace(str1,str2)的地方,按照理論,這裡會導致N多字串常量,但是想了想,也不至於導致記憶體泄露問題吧,否則的過去經驗就白積累了。就在輾轉只是,發現了幾個方法,都是獲得裝置資訊的。於是趕緊定位,發現了這個語句 Runtime.getRuntime().exec("cat /proc/cpuinfo")。這個就是網路流出來獲得cpu資訊的代碼。

這個時候,突然想起來一個現象,就是沒啟動一個線程後,線程的資源不會釋放,但是退出應用後,線程的ppid竟然變成了系統層級的。很奇特的現象,理論上,應用進程退出,屬於他的線程會釋放掉,但是這些線程不但沒有釋放,反而變成系統層級了。 通過以上現象,加上這個 Runtime.getRuntime().exec("cat /proc/cpuinfo")語句,感覺應該有點關係,於是網上查資料,發現這語句相當於控制台獲得裝置資訊,也就是忘記關閉了控制台的串連。果斷修改代碼,在釋放資源處,加入

if (pp != null) {pp.exitValue();pp.destroy();}

再次運行,ok,資源釋放掉了。問題解決。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.