我是在使用XSLT转换的java应用程序下工作的。我在其中有很多document()调用,所以有可能有java.lang.OutOfMemory异常(实际上有),因为在每次调用document()函数之后,文档都会被缓存。
在http://xml.apache.org/xalan-j/faq.html#faq-N102F9上,我看到增加堆内存大小是可能的,而在我的情况下,这不是解决方案。我还尝试使用似乎不受支持的增量转换。
那么,在使用()函数时,是否有可能关闭jaxp中的文档缓存?
发布于 2011-11-25 17:52:51
就像answer 1066037的答案一样,希望您可以切换到Saxon。撒克逊有一个名为saxon:discard-document的扩展。它可以在PE版、EE版或Saxon版中获得。搜索“撒克逊-B”在这里:http://saxon.sourceforge.net/
来自撒克逊的文档:
saxon:discard-document()
撒克逊:废弃文档($doc作为文档节点()) ==>文档-节点()
此函数从Saxon的内部文档池中删除文档。文档暂时保留在内存中,但是当所有对文档树中节点的引用超出范围时,Java垃圾收集器将从内存中释放。这具有释放内存的好处,但缺点是,如果同一个文档在相同的转换过程中再次加载,则将从源文本对其进行重新分析,并分配不同的节点标识符。函数返回作为参数提供的文档节点,允许在调用(如select="saxon:discard-document(document('a.xml'))". )中使用该节点。
如果您需要一个如何使用saxon:discard-document的示例,请让我知道,我可以发布一个。
发布于 2011-06-15 12:49:26
您提供的链接包含一个使用自定义处理指令禁用缓存的示例。你试过建议的解决办法了吗?
发布于 2011-11-25 17:26:46
如果你有选择的话。
只要用Saxon交换Xalan,一切都会快得多,您可能会显著减少内存消耗。
据我所知,Xalan将把文档加载到内存中,除非在最新的版本中做了一些更改。
撒克逊有流模式:http://www.saxonica.com/documentation/sourcedocs/streaming/streaming-templates.xml
希望这能有所帮助。
https://stackoverflow.com/questions/6357091
复制相似问题