我在使用XSLT转换的java应用程序下工作。我有很多document()调用,所以有可能有java.lang.OutOfMemory异常(我实际上有),因为在每次调用document()函数之后文档都被缓存了。
在http://xml.apache.org/xalan-j/faq.html#faq-N102F9我读到有可能 增加堆内存大小,这不是我的解决方案。我也尝试使用似乎不支持的增量变换。
那么,使用document()函数时是否有可能在jaxp中关闭文档缓存?
答案 0 :(得分:2)
与user1066037的答案一样,希望您可以切换到Saxon。 Saxon有一个名为saxon:discard-document
的扩展名。它可以在PE或EE版本或Saxon-B中使用。在这里搜索“Saxon-B”:http://saxon.sourceforge.net/
来自撒克逊文件:
的撒克逊:丢弃文档()强>
saxon:discard-document($ doc as document-node())==>文档节点()强>
此功能从Saxon的内部文档池中删除文档。 该文件暂时保留在内存中,但将会存在 所有引用时由Java垃圾收集器从内存中释放 到文档树中的节点已超出范围。这有 释放内存的好处,但缺点是,如果相同 文档在同一转换期间再次加载,它将是 从源文本中重新分析,并且将使用不同的节点标识符 分配。该函数返回提供的文档节点 一个参数,允许它在诸如的调用中使用 选择= “撒克逊:丢弃文档(文档( 'A.XML'))”。
如果您需要一个如何使用saxon:discard-document
的示例,请告诉我,我可以发布一个。
答案 1 :(得分:1)
您提供的链接包含使用自定义处理指令禁用缓存的示例。您是否尝试过那里建议的解决方法?
答案 2 :(得分:1)
如果您有选择。
只需将Xalan与Saxon交换,一切都会快得多,你可以大幅减少内存消耗。
据我所知,Xalan 将将文档加载到内存中,除非在最新版本中更改了某些内容。
撒克逊人有流媒体模式:http://www.saxonica.com/documentation/sourcedocs/streaming/streaming-templates.xml
希望有所帮助。