летающая тарелка (xhtmlrenderer) из памяти - PullRequest
0 голосов
/ 30 июля 2010

Я пытаюсь использовать летающую тарелку для создания очень большого PDF-файла, и, похоже, ему не хватает памяти.

ниже приведены несколько стековых следов, которые показывают мне, что летающая тарелка не полностьюмасштабируемый ... или я делаю что-то не так?

java.lang.OutOfMemoryError: Java heap space
        at com.sun.org.apache.xerces.internal.util.XMLStringBuffer.append(XMLStringBuffer.java:205)
        at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.refresh(XMLDocumentScannerImpl.java:1520)
        at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.invokeListeners(XMLEntityScanner.java:2070)
        at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.scanLiteral(XMLEntityScanner.java:1063)
        at com.sun.org.apache.xerces.internal.impl.XMLScanner.scanAttributeValue(XMLScanner.java:974)
        at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanAttribute(XMLNSDocumentScannerImpl.java:460)
        at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(XMLNSDocumentScannerImpl.java:277)
        at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2747)
        at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:648)
        at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:140)
        at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:510)
        at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:807)
        at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:737)
        at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:107)
        at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1205)
        at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transformIdentity(TransformerImpl.java:637)
        at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:708)
        at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:313)
        at org.xhtmlrenderer.resource.XMLResource$XMLResourceBuilder.createXMLResource(XMLResource.java:189)
        at org.xhtmlrenderer.resource.XMLResource.load(XMLResource.java:71)

java.lang.OutOfMemoryError: Java heap space
    at java.util.Arrays.copyOf(Arrays.java:2882)
    at java.lang.AbstractStringBuilder.expandCapacity(AbstractStringBuilder.java:100)
    at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:597)
    at java.lang.StringBuffer.append(StringBuffer.java:329)
    at org.xhtmlrenderer.css.newmatch.Matcher$Mapper.mapChild(Matcher.java:385)
    at org.xhtmlrenderer.css.newmatch.Matcher.matchElement(Matcher.java:153)
    at org.xhtmlrenderer.css.newmatch.Matcher.getMapper(Matcher.java:235)
    at org.xhtmlrenderer.css.newmatch.Matcher.getCascadedStyle(Matcher.java:85)
    at org.xhtmlrenderer.context.StyleReference.getCascadedStyle(StyleReference.java:199)
    at org.xhtmlrenderer.layout.SharedContext.getStyle(SharedContext.java:548)
    at org.xhtmlrenderer.layout.SharedContext.getStyle(SharedContext.java:527)
    at org.xhtmlrenderer.layout.BoxBuilder.createChildren(BoxBuilder.java:1069)
    at org.xhtmlrenderer.layout.BoxBuilder.createChildren(BoxBuilder.java:113)
    at org.xhtmlrenderer.render.BlockBox.ensureChildren(BlockBox.java:902)
    at org.xhtmlrenderer.layout.BoxBuilder.createChildren(BoxBuilder.java:1115)
    at org.xhtmlrenderer.layout.BoxBuilder.createChildren(BoxBuilder.java:113)
    at org.xhtmlrenderer.render.BlockBox.ensureChildren(BlockBox.java:902)
    at org.xhtmlrenderer.layout.BoxBuilder.createChildren(BoxBuilder.java:1135)

1 Ответ

2 голосов
/ 30 июля 2010

Возможно, вам просто нужно увеличить размер кучи; например попробуйте добавить -Xmx256m к команде java, которая используется для запуска приложения.

Вы, вероятно, также правы в своем заключении, что летающая тарелка не полностью масштабируема. Я ожидаю, что он создает и использует в памяти представления полного входного XML и полного целевого PDF-файла. (Скорее всего, так будет проще всего.)

Однако «очень большой» файл PDF также не масштабируется, так как он может вызвать проблемы у людей, загружающих и просматривающих его. Поэтому, возможно, вам стоит взглянуть на создание нескольких файлов PDF.

...