垃圾回收问题

垃圾回收问题

问题描述:

Iv'e编码了一个带有.obj文件的ObjectLoader,它给了我我想要的东西。 我的问题是,当处理大文件(甚至不是那么大,大约80kb),我最终 最终没有得到所有的信息,因为它会在一段时间后停止阅读。垃圾回收问题

我在logcat中获取该即时通讯做之前和debuger简单地移动到下一个方法:

DEBUG/dalvikvm(25743):GC_FOR_MALLOC释放2076名对象/在50ms的
DEBUG/dalvikvm 124280字节( 25743):GC_FOR_MALLOC释放4名对象/在52ms
DEBUG 232字节/ dalvikvm(25743):GC_FOR_MALLOC释放142个的对象/在49ms
DEBUG 46728字节/ dalvikvm(25743):GC_FOR_MALLOC释放0对象/ 0字节在53ms DEBUG/dalvikvm(25743):GC_FOR_MALLOC在39ms中释放了533个对象/ 63504个字节
DEBUG/dalvikvm(25743):GC_FOR_MALLOC释放4名对象/在50ms的
DEBUG 216字节/ dalvikvm(25743):GC_EXTERNAL_ALLOC释放132个的对象/ 26768字节在40ms内

换句话说,很多垃圾收集的我猜。仅仅是因为我在代码中分配了很多内存?如果是这样,是否有我需要阅读的基本知识,或者您有任何其他建议?我使用了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

这听起来不像大量的内存除了那些矢量之外还有其他问题 – 2011-05-05 06:43:46

+0

我不认为任何人都可以在不查看代码或至少数据结构的情况下提供有用的答案。 – 2011-05-05 06:48:15

+0

好吧,我会从课堂上发布一些代码。也许我真的很愚蠢。从来没有真正关心内存分配。 – Henrik 2011-05-05 06:48:28

那么我现在得到了答案,这很尴尬......正如你所说的那样,这不是垃圾收集器的错。这是LogCat的错。而不是打印出关于垃圾收集的排行的事实,这是因为它没有打印出我在循环完成时使用的Log.i(标记,字符串)。 (在循环过程中,我使用了Log.v(),所以它确实没有给我提供不完整的结果,我只是无法看到完整的结果或者它完成了。好吧,无论如何,很抱歉拿起你的'时间这一点,我想感谢,对thoose的你,试图帮助。

如果任何主持人看到这一点,你可以关闭的问题。否则,我会尽快将其删除。

我可以看到你在做一个系统性的错误,虽然我不知道这是否是你的问题的原因。

例如:

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

在Java中,数组索引从0开始,上升到array.length - 1。你的代码似乎在跳过第零个标记,在这里和其他地方。在processFLine中,您使用tokens[1]来选择不同的格式,因此可能会得到ArrayIndexOutOfBoundsException

+0

那是因为我不喜欢第一个(索引0),只是因为iv'e在我的文件中有这样几行建立:v 0.000 1.000 0.000(例如)所以我想跳过'v “ – Henrik 2011-05-05 07:19:34