2017-02-27 84 views
3

我们已经创建了下面的代码GroupByVisitor: -释放内存后GetFeatures Geotools

GroupByVisitor visitor = new GroupByVisitorBuilder().withAggregateAttribute(CQL.toExpression(strColumn)) 
       .withAggregateVisitor("Count").withGroupByAttribute(CQL.toExpression(strColumn)).build(); 

此时所使用的内存是150-180Mb。 并用下面的代码应用此之后: - 这点存储器之后

sfc.getFeatures().accepts(visitor, null); 
visitor.getResult() 

跨越1800Mb。但在此之后不会发布。 如何在获取所有值后释放内存?

甚至System.gc();还没有释放所有的内存。

+0

什么样的对象是sfc? –

+0

'SimpleFeatureSource' –

+0

@iant我们如何在'SimpleFeatureSource'上调用'GetFeatures()'之后释放内存请建议。 –

回答

2

通过快速阅读GroupByVisitor,结果类GroupByResult可能持有对GroupByVisitor成员的引用。

从代码的工作方式来看,只要你的代码持有对'getResult'返回的对象的引用,那么就有对Visitor(及其数据结构)的引用。

如果您能够将数据从返回对象中复制出来,然后在结果和访问者具有引用的情况下结束,则JVM可能会收集内存。

+0

我明白你的观点,但在我的场景中没有任何引用,我只是使用'visitor.getResult()。toArray();'之后,我有我的结果数组上的循环。我的问题不是关于'GroupByVisitor'关于'GetFeatures()'的问题。简单地说,在SimpleFeatureSource调用'GetFeatures'之后,我如何释放内存? –

+0

JVM中的内存管理是一个复杂的主题。 作为一个非常非常快速的建议,您可以提取创建访问者的代码,调用它,并将结果循环到函数中。 从该函数返回后,对System.gc()的调用可能更有可能收集内存。 作为另一个警告,垃圾收集器可以决定不收集内存,如果没有足够的内存空间,它是免费的。) – GeoMesaJim

+0

thx但那不是帮助我。我已经调用了'System.gc()',但没有释放任何内存。 –