Ошибка Android: I / dalvikvm-heap: Увеличение кучи (фрагмент) до 16,159 МБ для 1490086 байт - PullRequest
0 голосов
/ 09 января 2019

Я сочиняю файл JSON с объектами в цикле for
Когда количество данных, передаваемых в файл JSON, увеличивается, я вижу следующую ошибку в Logcat:

I / dalvikvm-heap: увеличение кучи (в случае фрагмента) до 16,159 МБ для 1490086 байт распределение

Что здесь не так? Я подтвердил некоторые другие сообщения на Grow heap (frag case), но безрезультатно!
Что увеличивает размер кучи, что приводит к такой ошибке?

Код петли:

JSON_Functions_PRD mJSONF_Test = new JSON_Functions_PRD();
JSONObject obj = new JSONObject();
String Temp;
Temp = obj.toString();
mJSONF_Test.setJSONobj_PRD(Temp);
mJSONF_Test.CreateMenu_SMS_Naked();

A_DataClass m_DataClass = new A_DataClass();
int count = 10000;
for (int i = 0; i < count; i++)
{
    mDataClass.setA("A1");
    mDataClass.setB("B1");
    mJSONF_Test.setItem_M0(mDataClass);
}

Функции JSON:

public class JSON_Functions_PRD {

String mJSONString_Result;
JSONObject obj = new JSONObject();

public void setJSONobj_PRD(String mJSONString) {
    try {
        mJSONString_Result = mJSONString;
        obj = new JSONObject(mJSONString_Result);
    } catch (JSONException e) {
        e.printStackTrace();
    }
}

public String getJSON_PRD() {

    mJSONString_Result = obj.toString();
    return mJSONString_Result;
}

public void CreateMenu_SMS_Naked() {
    JSONArray jA1 = new JSONArray();
    try {
        obj.put("M0", jA1);
    } catch (JSONException e) {
        e.printStackTrace();
    }
}


public void setItem_M0(A_DataClass Item) {
    JSONArray jA1 = new JSONArray();
    JSONObject jO1 = new JSONObject();
    JSONObject jO2 = new JSONObject();
    try {
        jA1 = obj.getJSONArray("M0");

        jO1.put("a", Item.getA());
        jO2.put("a", Item.getB());
        jO1.put("b", jO2);
        jA1.put(jO1);
    } catch (JSONException e) {
        e.printStackTrace();
    }
}

Класс данных:

public class A_DataClass {
    String A;
    String B;

    public A_DataClass()
    {
    }

    public String getA() {
        return A;
    }
    public void setA(String name) {
        thisA = name;
    }

    public String getB() {
        return B;
    }
    public void setB(String name) {
        this.B = name;
    }
}

Edit:
Я должен добавить этот пункт, что я проверил случай на 3 мобильных наборах (2 SAMSUNG, 1 HUAWEI), и проблема видна только в HUAWEI

1 Ответ

0 голосов
/ 13 января 2019

В куче может быть много доступной памяти, но она разбита на небольшие куски. Если виртуальная машина не может найти достаточно большой кусок для выделения, которое вы пытаетесь выполнить, произойдет OOME.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...