Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java集合迭代器和垃圾(android)_Java_Android_Iterator - Fatal编程技术网

java集合迭代器和垃圾(android)

java集合迭代器和垃圾(android),java,android,iterator,Java,Android,Iterator,我一直在使用复杂的hashmap结构在android上运行一些测试 我的结构如下:Map>mymap

我一直在使用复杂的hashmap结构在android上运行一些测试

我的结构如下:
Map>mymap迭代器迭代器
该结构一次可容纳约1000个对象。现在我需要能够非常快地迭代这些对象

我通常返回一个对象集合,手动转换它们并迭代该集合。这就是我的问题所在

我不收集
Collectionreturnedobjects=get all mymap.get(class).getvalues。然后我做
iterator=returnedobjects.iterator然后我会

while(iterator.hasNext())
{
  Box b = (Box)iterator.next();
  do box operations;
}
或者我试着这样做

for(Object o : returnedObjects)
{ 
  Box b : (Box) o;
  do box operations;
}
现在,通过此设置,垃圾收集器可以像疯了一样运行示例输出:

10-26 13:56:17.793: D/dalvikvm(5518): GC_CONCURRENT freed 3639K, 57% free 3543K/8195K, paused 15ms+18ms, total 135ms
10-26 13:56:21.013: D/dalvikvm(5518): GC_CONCURRENT freed 1753K, 57% free 3526K/8195K, paused 13ms+21ms, total 92ms
10-26 13:56:24.363: D/dalvikvm(5518): GC_CONCURRENT freed 1743K, 57% free 3525K/8195K, paused 24ms+17ms, total 116ms
10-26 13:56:27.653: D/dalvikvm(5518): GC_CONCURRENT freed 1738K, 57% free 3527K/8195K, paused 13ms+16ms, total 102ms
10-26 13:56:30.913: D/dalvikvm(5518): GC_CONCURRENT freed 1739K, 57% free 3526K/8195K, paused 14ms+18ms, total 95ms
10-26 13:56:34.153: D/dalvikvm(5518): GC_CONCURRENT freed 1737K, 57% free 3528K/8195K, paused 15ms+18ms, total 97ms
只要我的应用程序还在运行,它就会以这种速度继续运行


有没有什么方法可以在gc没有以如此疯狂的速度运行的情况下管理我的所有对象?

它大约每3秒运行一次。取决于你在做什么,这不是一个“疯狂的步伐”。您在生成垃圾的“do box操作”中做什么?从您发布的代码中,不清楚是否生成了任何垃圾。do box操作目前只是将一些随机数相乘,以模拟实际计算。真正的问题是每个循环迭代器=returnedobjects.iterator();这个电话产生了大量的垃圾,加上80-160毫秒的暂停,这真的给我带来了麻烦。我建议你使用它来跟踪应用程序的内存使用情况。再看看这篇文章。或者,您可以隔离可疑代码并在Sun的Java下运行它,并使用一个很好的Java评测工具,如JProfiler。分析可以帮助确定问题的真正所在。此设置的问题是hashmap的迭代器。我在每个循环中创建了很多迭代器,这些迭代器在返回值的所有值上循环。我已经查看了ddms输出,这就是所有问题的来源。我想知道是否还有另一种数据结构可以代替hashmap,因为紧循环中的hashmap迭代器效率很低,并且会产生大量垃圾。