使用FreeMarker传输大量列表,内存不足异常

时间:2019-05-07 07:56:30

标签: java out-of-memory freemarker

说明

有一个庞大的玩家数据库200.000,下面是.ftl model

<header> ... <header>
<main>
!Here is the problem
<#list items as vo>
  <name> $vo.name} </name>
  <surname> ${vo.surname} </surname>
  <abilities> ${vo.abilities} </abilites>
</#list>
</main>
<footer>  ... </footer>

那怎么了?

当我的玩家人数很少时,例如5.000,上述方法效果很好。

我要做什么?

我需要立即为所有玩家创建此文档,这意味着我必须传递100.000或更多玩家的列表。这将导致Java OutOfMemoryException

所以我每次都提取1.000个玩家并创建列表,但问题是....如何像以前那样通过所有玩家?我有一个.ftl模型,而FreeMarker不支持这样的模型...

我希望所有200.000播放器都在同一文档中。

我应该使用哪种技术:)?

Java类如下:

public FinalXMLVo extends HashMap<String,Object>{

 ...
 private List<Player> players;

 public FinalXMLVo(....,List<Player> players){

  ...
  this.put("items",players);

 }

...

}

1 个答案:

答案 0 :(得分:1)

您将Writer传递给FreeMarker缓冲所有输出吗?也许看看OutOfMemoryException通常在哪里出现,有助于弄清楚这一点。

除此之外,我不知道为什么更长的列表会在FreeMarker中消耗更多的内存。至少在您展示的这种基本用例中,它甚至应能够保持渲染无限列表。

此外,如果您使用的是List而不是Iterator,那么只要数据源(例如ResultSet)足够聪明,它也可以释放内存。不能全部缓冲。