如何修复Android中的outofmemory错误?

时间:2015-07-08 04:28:28

标签: java android memory arraylist

我们经常出现内存错误,因此应用程序崩溃了。我们的要求就像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 .........................................................................");

2 个答案:

答案 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