gpt4 book ai didi

java - 垃圾回收问题

转载 作者:行者123 更新时间:2023-11-30 04:41:34 25 4
gpt4 key购买 nike

我编写了一个 ObjectLoader,它接受一个 .obj 文件,它给了我我想要的东西。我的问题是,当处理大文件(甚至不是那么大,大约 80kb)时,我最终最终没有获得所有信息,因为它会在一段时间后停止读取。

我在完成之前在我的 LogCat 中得到了这个,调试器简单地转到下一个方法:

DEBUG/dalvikvm(25743): GC_FOR_MALLOC freed 2076 objects / 124280 bytes in 50ms
DEBUG/dalvikvm(25743): GC_FOR_MALLOC freed 4 objects / 232 bytes in 52ms
DEBUG/dalvikvm(25743): GC_FOR_MALLOC freed 142 objects / 46728 bytes in 49ms
DEBUG/dalvikvm(25743): GC_FOR_MALLOC freed 0 objects / 0 bytes in 53ms DEBUG/dalvikvm(25743): GC_FOR_MALLOC freed 533 objects / 63504 bytes in 39ms
DEBUG/dalvikvm(25743): GC_FOR_MALLOC freed 4 objects / 216 bytes in 50ms
DEBUG/dalvikvm(25743): GC_EXTERNAL_ALLOC freed 132 objects / 26768 bytes in 40ms

换句话说,我猜有很多垃圾回收。仅仅是因为我在代码中分配了很多内存吗?如果是这样,是否有任何我需要阅读的基础知识,或者您有任何其他建议吗?我使用了 4 个 vector ,每个 vector 最终包含大约 2K-3K 个对象。编辑:实际上有 7 个 vector ,另外 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);
}
}

最佳答案

好吧,我现在得到了答案,这很尴尬......正如你们所说,这不是垃圾收集器的错。这是 LogCat 的错。并不是它打印出关于垃圾收集的那一行,而是它没有打印出我在循环结束时使用的 Log.i(tag, string)。 (在循环中我使用了 Log.v()。所以它实际上并没有给我不完整的结果,我只是无法看到完整的结果或者它实际上已经完成了。无论如何,我很抱歉占用了你的时间花点时间,我要感谢那些试图提供帮助的人。

如果任何版主看到这个,您可以关闭问题。否则我会尽快删除它。

关于java - 垃圾回收问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5893591/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com