android Jni AttachCurrentThread 記憶體泄露

來源:互聯網
上載者:User

說起這個問題來就牛逼大了,俺弄了差不多兩天才定位到。

 

jni記憶體泄露定位起來真特麼麻煩,受不鳥

 

現象

先說一下結果吧,我是做線上視頻應用的,資料得由C往Java層拋。俺在測試的時候發現拿一台機器跑幾個小時候就木有記憶體了,報如下錯誤:

07-10 19:31:46.871: E/dalvikvm-heap(3756): Out of memory on a 126-byte allocation.
07-10 19:31:46.871: I/dalvikvm(3756): Can't dump thread 5041: threadObj not set
07-10 19:31:46.871: E/dalvikvm(3756): Out of memory: Heap Size=32775KB, Allocated=29914KB, Bitmap Size=0KB, Limit=32768KB
07-10 19:31:46.871: E/dalvikvm(3756): Extra info: Footprint=32711KB, Allowed Footprint=32775KB, Trimmed=468KB
07-10 19:31:46.871: W/dalvikvm(3756): Could not allocate message string "(null)" while throwing internal exception (Ljava/lang/OutOfMemoryError;)

 

然後哥就各種定位啊,你想啊,肯定不是視頻資料的記憶體泄露,一來我使用了複用的記憶體塊,二來如果是視頻資料泄露,每一幀資料都有640*480這麼大,跑一會兒就掛了,根本跑不了幾小時。然後哥哥就各種查啊,吐槽一下MAT真特麼難用,怎麼就不學學人家Xcode上的instruments呢,反正我是分析半天沒結果,後來各種注釋代碼之後,發現是jni層的問題。好了,最後發現居然是AttachCurrentThread這貨的問題,尼瑪,坑爹啊,這分明是Bug嘛。

 

按理來說,每次從C往Java拋資料都得這麼幹(我就寫個大概意思就好了)

void paoshuju(char* buf, int size)

{

     AttachCurrentThread

     //在這兒copy記憶體啊之類的

     //DetachCurrentThread

}

哥哥真的是這麼乾的呀,然後記憶體就華麗麗的泄露了,擦,真的是Bug

 

解決辦法

好吧,我就搞個全域變數嘛,每個線程只AttachCurrentThread一次,儲存env作為全域變數,然後線程結束的時候回來DetachCurrentThread

這樣這個問題就解決了。

但是這樣解決的後遺症就是必須得對每個介面調用的線程非常清楚,否則程式就會crash

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.