2017-02-27 68 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()',但沒有釋放任何內存。 –