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