我们经常出现内存错误,因此应用程序崩溃了。我们的要求就像app获取位置变化的gps位置并添加到arraylist中。使用此gps数据,使用一种算法压缩gps数据压缩。 它每1分钟运行一次并在线程中执行。但是,有时候内存很高,而且我已经发布了一些代码块,我已经将内存增加了。
问题是以下循环无法执行最多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 .........................................................................");
答案 0 :(得分:0)
您可以在清单文件中使用 android:largeHeap =“true”来请求更大的堆大小,但这不适用于任何预装的Honeycomb设备。在2.3之前的设备上,您可以使用VMRuntime类,但这不适用于Gingerbread及更高版本。
答案 1 :(得分:0)
你应该寻找记忆韭菜。这是一项艰苦的工作,但您可以先在Android Studio中完成:
- 打开DDMS,
- 点击您的包裹名称,
- 开始分配跟踪,在您的应用中进行一些活动
- 在生成的文件中,您可以看到有多少对象引用了其他对象或哪些对象可以访问。
在活动暂停/恢复或屏幕旋转后(某些任务保留活动参考来自异步任务等)可能会导致内存泄漏,或者只是使用过多的大位图(应按比例缩小,如http://developer.android.com/training/displaying-bitmaps/load-bitmap.html )