5

我正在使用 XSLT 转换的 java 应用程序下工作。我有很多 document() 调用,所以可能有 java.lang.OutOfMemory 异常(我实际上有),因为在每次调用 document() 函数后,文档都会被缓存。

http://xml.apache.org/xalan-j/faq.html#faq-N102F9我读到可以增加堆内存大小,这不是我的解决方案。我还尝试使用似乎不受支持的增量转换。

那么,在使用 document() 函数时,是否有可能在 jaxp 中关闭文档缓存?

4

3 回答 3

2

像user1066037的回答一样,希望你可以切换到撒克逊。Saxon 有一个扩展名为saxon:discard-document. 它可用于 PE 或 EE 版本或 Saxon-B。在此处搜索“Saxon-B”:http: //saxon.sourceforge.net/

从撒克逊文档:

撒克逊:丢弃文档()

saxon:discard-document($doc as document-node()) ==> document-node()

此函数从 Saxon 的内部文档池中删除文档。文档暂时保留在内存中,但当对文档树中节点的所有引用都超出范围时,Java 垃圾收集器将从内存中释放。这有释放内存的好处,但缺点是如果在相同的转换过程中再次加载相同的文档,则会从源文本中重新解析,并分配不同的节点标识符。该函数返回作为参数提供的文档节点,允许在诸如 select="saxon:discard-document(document('a.xml'))" 之类的调用中使用它。

如果您需要一个如何使用的示例saxon:discard-document,请告诉我,我可以发布一个。

于 2011-11-25T17:52:51.747 回答
1

您提供的链接包含一个使用自定义处理指令禁用缓存的示例。您是否尝试过那里建议的解决方法?

于 2011-06-15T12:49:26.063 回答
1

如果你有选择。

只需将 Xalan 与 Saxon 交换,一切都会快得多,并且可以显着减少内存消耗。

据我所知,Xalan会将文档加载到内存中,除非在最新版本中有所更改。

Saxon 有流媒体模式: http: //www.saxonica.com/documentation/sourcedocs/streaming/streaming-templates.xml

希望有帮助。

于 2011-11-25T17:26:46.513 回答