Проблема с сборкой мусора - PullRequest
1 голос
/ 05 мая 2011

Я закодировал ObjectLoader, который принимает файл .obj, и он дает мне то, что я хочу. Моя проблема в том, что при обработке больших файлов (даже не таких больших, около 80 КБ) я в конечном итоге в конечном итоге не получает всю информацию, потому что он перестает читать через некоторое время.

Я получаю это в своем LogCat до того, как я закончу, и отладчик просто переходит к следующему методу:

DEBUG / dalvikvm (25743): GC_FOR_MALLOC освободил 2076 объектов / 124280 байт за 50 мс
DEBUG / dalvikvm (25743): GC_FOR_MALLOC освободил 4 объекта / 232 байта за 52 мс
DEBUG / dalvikvm (25743): GC_FOR_MALLOC освободил 142 объекта / 46728 байт за 49 мс
DEBUG / dalvikvm (25743): GC_FOR_MALLOC освободил 0 объектов / 0 байт за 53 мс DEBUG / dalvikvm (25743): GC_FOR_MALLOC освободил 533 объекта / 63504 байта за 39 мс
DEBUG / dalvikvm (25743): GC_FOR_MALLOC освободил 4 объекта / 216 байт за 50 мс
DEBUG / dalvikvm (25743): GC_EXTERNAL_ALLOC освободил 132 объекта / 26768 байт за 40 мс

Другими словами, много сборщика мусора, я думаю. Это просто потому, что я выделяю много памяти в своем коде? И если да, есть ли какие-то основы, которые мне нужно прочитать, или у вас есть другие предложения? Я использую 4 вектора, каждый из которых содержит около 2K-3K объектов. Изменить: На самом деле есть 7 векторов, 3 дополнительных для переноса индексов, но все же я не думаю, что это так много.

    private void readObj(InputStreamReader in) throws IOException
{
    BufferedReader reader = null;
    String line = null;

    reader = new BufferedReader(in);

    while ((line = reader.readLine()) != null)
    {
        Log.v(TAG, line);
        if (line.startsWith("f"))
        {
            faces++;
            processFLine(line);
        } else if (line.startsWith("vn"))
        {
            normals++;
            processVNLine(line);
        } else if (line.startsWith("vt"))
        {
            UVCoords++;
            processVTLine(line);
        } else if (line.startsWith("v"))
        {
            vertices++;
            processVLine(line);
        }
    }

}

private void processVNLine(String line)
{
    String[] tokens = line.split("[ ]+");
    int c = tokens.length;
    for (int i = 1; i < c; i++)
    {
        _vn.add(Float.valueOf(tokens[i]));
    }
}

private void processFLine(String line)
{
    String[] tokens = line.split("[ ]+");
    int c = tokens.length;

    if (tokens[1].matches("[0-9]+"))
    {
        caseFEqOne(tokens, c);
    }
    if (tokens[1].matches("[0-9]+/[0-9]+"))
    {
        caseFEqTwo(tokens, c);
    }
    if (tokens[1].matches("[0-9]+//[0-9]+"))
    {
        caseFEqOneAndThree(tokens, c);
    }
    if (tokens[1].matches("[0-9]+/[0-9]+/[0-9]+"))
    {
        caseFEqThree(tokens, c);
    }

}

private void caseFEqThree(String[] tokens, int c)
{
    for (int i = 1; i < c; i++)
    {
        Short s = Short.valueOf(tokens[i].split("/")[0]);
        s--;
        _vPointer.add(s);

        s = Short.valueOf(tokens[i].split("/")[1]);
        s--;
        _vtPointer.add(s);

        s = Short.valueOf(tokens[i].split("/")[2]);
        s--;
        _vnPointer.add(s);
    }
}

Ответы [ 2 ]

1 голос
/ 05 мая 2011

Ну, я получил ответ сейчас, и это смущает ... Как вы все сказали, это не вина сборщиков мусора.Это была ошибка LogCat.И не факт, что он распечатал огромную строку о сборе мусора, а о том, что он не распечатал мой Log.i (тег, строка), который я использовал, когда цикл был завершен.(Во время цикла я использовал Log.v (). Так что это действительно не дало мне неполного результата, я просто не смог увидеть полный результат или что он фактически закончен. Ну, в любом случае, я извиняюсь за то, что занялся your'eвремя с этим, и я хотел бы поблагодарить вас, кто пытался помочь.

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

0 голосов
/ 05 мая 2011

Я вижу одну систематическую ошибку, которую вы делаете, хотя я не знаю, является ли она причиной ваших проблем.

Например:

String[] tokens = line.split("[ ]+");
int c = tokens.length;
for (int i = 1; i < c; i++)
{
    _vn.add(Float.valueOf(tokens[i]));
}

В Java,индексы массива начинаются с нуля и доходят до array.length - 1.Ваш код, кажется, пропускает нулевой токен, здесь и в других местах.А в processFLine, где вы используете tokens[1] для выбора между различными форматами, вы можете получить ArrayIndexOutOfBoundsException в результате.

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