FOPでは、ページのフッタに「Page 1 of 10」のような表記をすることができる。この「10」という数字は「総ページ数」を表しているので、全部のページをレンダリングし終えてみなければ得ることができない。こういう「総ページ数」のようなものを挿入するためのしくみは、「前方参照(forward reference)」と呼ばれている。
未解決の前方参照を抱えている場合には、レンダリング中の内容はずっとメモリ上に置かれたままになる。そのため、参照の行われたページ位置と参照内容の決定がなされるページ位置の間が離れている場合には、どこかでOutOfMemoryException を吐いてしまう可能性に備えなければならない。感覚的には、レンダリングするページ数8ページあたり256MB程度のヒープ設定が必要といった感じ。実際、SQS SourceEditorでは、ヒープサイズを32MBにしたままでは、わずか数ページのレンダリングでもOutOfMemoryExceptionになってしまう。
さて。Re: Caching of pages with forward referencesには、AreaTreeHandlerのサブクラスを作り、そのコンストラクタの中で、org.apache.fop.area.CachedRenderPagesModel というクラスをインスタンス化して、通常のRenderPagesModelの代わりにsetModelするというコードが示されている。こうすることで、前方参照があっても、OutOfMemoryExceptionになってしまう状況を避けることができるようになるらしい!ただし、これは、ページシーケンスが一定以下のサイズの文書をレンダリングするときにのみ有効。ページシーケンスに大きなものがある文書では依然としてOutOfMemoryExceptionとなる場合を避けられないとのことである。