[英]How to fix outofmemory error in Android?
我們經常遇到內存不足錯誤,因此應用程序崩潰了。 我們的要求就像應用在位置更改時獲取gps位置並將其添加到arraylist中一樣。 使用此gps數據,已使用一種算法來壓縮gps數據壓縮。 它每1分鍾運行一次並在線程中執行。 但是在有時內存變高並且我發布了一些代碼塊之后,我就將這些代碼抬高了。
問題是下面的for循環無法使用其計算最多執行85次。
請幫我解決這個問題。
有誰知道我們如何解決這個問題?
encodep = new Object[n_point - 1][11];
double sum_thetalen = 0;
double sum_t = 0;
/* initializing sed probability table
* SED_RESOLUTION=10; 0.1
* SED_RESOLUTION=100 0.01
*/
// final double SED_RESOLUTION = 10;
// double sed_value_count = 1 / (double) (tol_GTAround * SED_RESOLUTION);
/* encoding starts */
Log.d(TAG,
"Encoding start .........................................................................");
// ProgressNotification.Create(n_point);
AppPolar ap_new = new AppPolar();
for (int i = 0; i < (n_point - 1); i++) {
// ProgressNotification.Notify(i);
double dxcurr = ap.xapp.get(i + 1) - x_code.get(i);
double dycurr = ap.yapp.get(i + 1) - y_code.get(i);
/*if (param.b_debug == 1) {
System.out.println("ap.tapp.size=" + ap.tapp.size() + " ");
System.out.println("_t_code=" + t_code.size() + " ");
}*/
double tinvcurr = (ap.tapp.get(i + 1) - t_code.get(i));
ap_new.polar(dxcurr, dycurr, tinvcurr, angcurr, tol_GTA, ratio_tol);
angcurr = ap_new.angcurr0;
double app_spd = ap_new.spdapp;
double tol_spd = ap_new.tol_spd;
double app_ang = ap_new.angcurr0;
double app_dang = ap_new.dangapp;
double tol_dang = ap_new.tol_dang;
/* Encoding time */
Log.d(TAG,
"time Encoding start ........................................................................."
+ i);
double dt_codeval = Function.round(tinvcurr / mint_tinterv);
double sum = Function.sum(prob_t);
double add_to_sum = delta_dt / maxtsq;
List<Double> prob_ttmp = new ArrayList<Double>();
int prob_t_size = prob_t.size();
for (int index = 0; index < prob_t_size; index++) {
prob_ttmp.add((prob_t.get(index) / sum) + add_to_sum);
}
sum = 1 / Function.sum(prob_ttmp);
prob_ttmp = Function.multiplyBy(prob_ttmp, sum);
dt_code.add(mint_tinterv * dt_codeval);
t_code.add(t_code.get(i) + dt_code.get(i));
encodep[i][0] = Function.cloneList(prob_ttmp);
encodep[i][1] = dt_codeval;
encodep[i][2] = -Math.log(prob_ttmp.get((int) dt_codeval - 1)) / Math.log(2D);
sum_t = sum_t + (Double) encodep[i][2];
prob_t = Function.multiplyBy(prob_t, gamma_dt);
prob_t.set((int) (dt_codeval - 1), prob_t.get((int) (dt_codeval - 1)) + 1);
prob_ttmp.clear();
prob_ttmp = null;
Log.d(TAG,
"time Encoding stop ........................................................................."
+ i);
/* Encoding speed */
Log.d(TAG,
"speed Encoding start ........................................................................."
+ i);
spd_code.add(app_spd);
double codindtmp = Function.round(app_spd / tol_spd) + 1;
int maxspdind = (int) Math.ceil(maxspd / tol_spd) + 1;
if (i == 0) {
prob_spdtmp = Function.populateList(1D / maxspdind, maxspdind);
}
else {
Double tpre = (double) t_code.get(i);
double dttmp = t_spdmean;
double dtmax = (dt.get(i) * trt_spd);
if (dttmp < dtmax)
dttmp = dtmax;
int sqtmp = 0;
int tappSize = ap.tapp.size();
for (int j = 0; j < tappSize; j++) {
if (ap.tapp.get(j) >= tpre - dttmp) {
sqtmp = j;
break;
}
}
if (sqtmp > (i - t_minseg))
sqtmp = i - (int) t_minseg;
if (sqtmp < 0)
sqtmp = 0;
estimatorSpeedMeanSig(spd_code.subList(sqtmp, i), dt_code.subList(sqtmp, i + 1),
param);
List<Double> spdlist = Function
.populateList1(0, tol_spd, (maxspdind - 1) * tol_spd);
List<Double> gausspdftmp = new ArrayList<Double>();
int spdlistSize = spdlist.size();
for (int index = 0; index < spdlistSize; index++) {
gausspdftmp.add(Math.exp(-0.5 * ((spdlist.get(index) - estspd) / estspdvar)
* (spdlist.get(index) - estspd) / estspdvar)
/ ((Math.sqrt(2 * Math.PI) * estspdvar)));
}
gausspdftmp = Function.multiplyBy(gausspdftmp, 1D / Function.sum(gausspdftmp));
prob_spdtmp = Function.add(gausspdftmp, delta_speed / maxspdind);
prob_spdtmp = Function.multiplyBy(prob_spdtmp, 1D / Function.sum(prob_spdtmp));
spdlist.clear();
spdlist = null;
gausspdftmp.clear();
gausspdftmp = null;
Log.d(TAG,
"speed Encoding stop ........................................................................."
+ i);
}// else
Log.d(TAG,
"Encoding stop .........................................................................");
您可以在清單文件中使用android:largeHeap =“ true”來請求更大的堆大小,但這不適用於任何之前的Honeycomb設備。 在2.3版之前的設備上,您可以使用VMRuntime類,但是在Gingerbread及更高版本上將無法使用。
您應該尋找韭菜。 這是一項艱苦的工作,但是您可以先在Android Studio中進行以下操作:-打開DDMS,
-點擊您的包裹名稱,
-開始分配跟蹤,在您的應用中進行一些活動
-在生成的文件中,您可以看到有多少個對象引用了其他對象,或者可以訪問哪些對象。
可能在活動暫停/恢復或屏幕旋轉后(異步任務等保留的一些活動參考)時內存泄漏,或者您只是使用了太大的位圖(應縮小比例,如http://developer.android)。 com / training / displaying-bitmaps / load-bitmap.html )
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.