簡體   English   中英

如何修復Android中的內存不足錯誤?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM