【发布时间】:2011-05-05 06:35:55
【问题描述】:
我编写了一个 ObjectLoader,它接受一个 .obj 文件,它给了我我想要的东西。 我的问题是,在处理大文件(甚至不是那么大,大约 80kb)时,我最终 最终无法获得所有信息,因为它会在一段时间后停止阅读。
我在完成之前在我的 LogCat 中得到了这个,调试器只是转到下一个方法:
DEBUG/dalvikvm(25743):GC_FOR_MALLOC 在 50 毫秒内释放了 2076 个对象/124280 个字节
调试/dalvikvm(25743):GC_FOR_MALLOC 在 52 毫秒内释放了 4 个对象/232 个字节
调试/dalvikvm(25743):GC_FOR_MALLOC 在 49 毫秒内释放了 142 个对象/46728 个字节
调试/dalvikvm(25743):GC_FOR_MALLOC 在 53 毫秒内释放了 0 个对象/0 个字节 调试/dalvikvm(25743):GC_FOR_MALLOC 在 39 毫秒内释放了 533 个对象/63504 个字节
调试/dalvikvm(25743):GC_FOR_MALLOC 在 50 毫秒内释放了 4 个对象/216 个字节
DEBUG/dalvikvm(25743):GC_EXTERNAL_ALLOC 在 40 毫秒内释放了 132 个对象 / 26768 个字节
换句话说,我猜有很多垃圾收集。仅仅是因为我在代码中分配了很多内存吗?如果是这样,我是否需要阅读任何基础知识,或者您还有其他建议吗?我正在使用 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);
}
}
【问题讨论】:
-
这听起来不像是很多内存。除了这些向量之外,其他地方也存在问题。
-
我认为没有人可以在不查看代码...或至少查看数据结构的情况下提供有用的答案。
-
好吧,我会贴一些课堂上的代码。也许我做了一些非常愚蠢的事情。从来没有真正关心过内存分配。
-
99.9% 垃圾回收不是你的问题,因为它根本不会导致那种问题。它只会减慢你的程序,但不会导致它发生故障(除非你用尽了所有可用内存,但这会导致进程突然终止,而不是返回不完整的结果)。
-
mmmh,你在使用后关闭流吗?
标签: java android garbage-collection