編輯:關於Android編程
說起這個問題來就牛逼大了,俺弄了差不多兩天才定位到。
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
一、原理分析 package com.njupt.action; import java.io.IOException; import java.io.Pr
目前很多Android app都內置了可以顯示web頁面的界面,會發現這個界面一般都是由一個叫做WebView的組件渲染出來的,學習該組件可以為你的app開發提升擴展性。
研究生期間就沒寫過Java代碼了,這幾天由於想做一個統計網頁詞頻的工具,但是使用C++不是很方便,於是又用Java做了一個小工具。翻開電腦中以前的文件,發現之前還做過一個
前言在上一篇Android網絡編程(九)Retrofit2前篇[基本使用]中我們了解了Retrofit的最基本的GET方式訪問網絡的寫法以及請求參數的簡單介紹。這一篇我們