我编码了一个ObjectLoader,它带有一个.obj文件,它给了我我想要的东西。
我的问题是,当处理大文件(甚至不大,大约80kb)时,我最终
最终没有获得所有信息,因为一段时间后它将停止阅读。
我在完成之前就在LogCat中得到了它,调试器只是简单地转到下一个方法:
DEBUG / dalvikvm(25743):GC_FOR_MALLOC在50毫秒内释放了2076个对象/ 124280字节
DEBUG / dalvikvm(25743):GC_FOR_MALLOC在52ms内释放了4个对象/ 232个字节
DEBUG / dalvikvm(25743):GC_FOR_MALLOC在49ms内释放了142个对象/ 46728个字节
DEBUG / dalvikvm(25743):GC_FOR_MALLOC在53ms内释放了0个对象/ 0个字节
DEBUG / dalvikvm(25743):GC_FOR_MALLOC在39毫秒内释放了533个对象/ 63504字节
DEBUG / dalvikvm(25743):GC_FOR_MALLOC在50ms内释放了4个对象/ 216个字节
DEBUG / dalvikvm(25743):GC_EXTERNAL_ALLOC在40ms内释放了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);
}
}
最佳答案
好吧,我现在得到了答案,这真令人尴尬……就像大家所说的,这不是垃圾收集器的错。这是LogCat的错。它不是打印出有关垃圾收集的字句,而是因为它没有打印出我在循环结束时使用的Log.i(tag,string)。 (在循环过程中,我使用了Log.v()。因此它的确没有给我不完整的结果,我只是看不到完整的结果或按理完成了。好吧,无论如何,对不起占用您的e感谢您的帮助。
如果有主持人看到此内容,则可以关闭问题。否则我会很快将其删除。
关于java - 垃圾收集问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5893591/