Mit iText: java.lang.OutOfMemoryError: Requested array size exceeds VM limit
Ich'vew wurden mit iText 4.2.1 und java 1.6 zum generieren von PDF-Dateien. Meine Aufgabe ist es, fügen Sie zwei Felder mit einigen zufälligen Inhalt einer pdf-Vorlage. Es funktioniert auch mit einem 1 GB großen PDF-Datei. Aber jetzt sind die Umwelt-Anforderungen von java 7 und ich mit diesem Out of memory-problem.
I ' V aktualisiert die iText zu 5.5.3, aber immer noch das gleiche Problem.
Der code ist trivial:
public final class PdfHelper
{
public static void randomizePDFStream(InputStream in, OutputStream out)
{
try
{
PdfReader ReadInputPDF;
ReadInputPDF = new PdfReader(in);
-> crash PdfStamper stamper = new PdfStamper(ReadInputPDF, out);
HashMap<String, String> hMap = ReadInputPDF.getInfo();
hMap.put("Title", "RANDOM PDF TITLE: " + System.nanoTime() + ", " + System.currentTimeMillis());
hMap.put("Subject", "RANDOM PDF SUBJECT: " + System.currentTimeMillis() + ", " + System.nanoTime());
stamper.setMoreInfo(hMap);
stamper.close();
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
Dieser gibt die folgende stack dump wird bei Verwendung einer 1 GB großen pdf-Datei :
Caught: java.util.concurrent.ExecutionException: java.lang.OutOfMemoryError: Requested array size exceeds VM limit
java.util.concurrent.ExecutionException: java.lang.OutOfMemoryError: Requested array size exceeds VM limit
at java_util_concurrent_Future$get.call(Unknown Source)
at Main.awaitCompletion(Main.groovy:222)
at Main$awaitCompletion.callCurrent(Unknown Source)
at Main.run(Main.groovy:113)
Caused by: java.lang.OutOfMemoryError: Requested array size exceeds VM limit
at com.itextpdf.text.io.StreamUtil.inputStreamToArray(StreamUtil.java:74)
at com.itextpdf.text.io.RandomAccessSourceFactory.createSource(RandomAccessSourceFactory.java:146)
at com.itextpdf.text.pdf.PdfReader.<init>(PdfReader.java:351)
at com.itextpdf.text.pdf.PdfReader.<init>(PdfReader.java:371)
at PdfHelper.randomizePDFStream(PdfHelper.java:65)
Dieser wird von einem groovy-Skript mit diesem basic-code:
mPDFFiles[i] = new java.io.File(getTempDirectory(), String.format("temp_file_%s_%s.pdf", System.nanoTime(), i));
mPDFFiles[i].createNewFile();
input = new BufferedInputStream(new FileInputStream(mTemplateFiles[i]));
output = new BufferedOutputStream(new FileOutputStream(mPDFFiles[i]));
long start=System.currentTimeMillis();
PdfHelper.randomizePDFStream(input, output);
output.flush();
println "Conversion time: " + (System.currentTimeMillis()-start) + " ms."
Jemand eine Idee, wie man diese zu arbeiten?
haben Sie versucht, erhöhen Sie die JVM-heap-Größe? viralpatel.net/blogs/...
Gut, natürlich habe ich versucht, die Erhöhung Xmx und MaxHeapSize noch ein wenig, aber immer noch das gleiche problem. Ich bin jetzt mit -Xms=8192m -Xmx16g -XX:MaxPermSize=8192m. Und wie ich bereits erwähnt, mit jdk1.6 alles läuft gut.
Die genaue JRE verwenden Sie? Ich fühle mich wie fast an etwas zu denken über einige memory-handling Fehler in einigen JRE update.
Ich habe versucht, sowohl die 1.7.0_40 und 1.7.0_51 mit dem gleichen Ergebnis.
Gut, natürlich habe ich versucht, die Erhöhung Xmx und MaxHeapSize noch ein wenig, aber immer noch das gleiche problem. Ich bin jetzt mit -Xms=8192m -Xmx16g -XX:MaxPermSize=8192m. Und wie ich bereits erwähnt, mit jdk1.6 alles läuft gut.
PdfStamper stamper = new PdfStamper(ReadInputPDF, out, true);
im Anhängen-Modus. Aber ich bezweifle. Scheint ein Daten-Fehler. Versuchen Sie einen anderen PDF-Datei, schreiben Sie die PDF-Datei in eine temp-Datei, und verwenden Sie diese neue temp-PDF.Die genaue JRE verwenden Sie? Ich fühle mich wie fast an etwas zu denken über einige memory-handling Fehler in einigen JRE update.
Ich habe versucht, sowohl die 1.7.0_40 und 1.7.0_51 mit dem gleichen Ergebnis.
InformationsquelleAutor Bo Öberg | 2014-10-08
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie Kommandozeilen-Parameter zu erhöhen die Menge des verfügbaren Speichers für Java. Hier ist ein Beispiel für die Kommandozeilen-Parameter, die ich verwenden - das sollten Sie ändern Sie die zahlen entsprechend Ihrer Bedürfnisse und system-Speicher, Kapazität:
InformationsquelleAutor Nirav Prajapati
Den Fehler sagt, "Requested array size exceeds VM limit" - die maximale Größe eines Arrays ist rund 2 GB (ganze Zahl.MAX_VALUE). Die Frage ist, welche VM verwendest du? 32 GB oder 64 GB? Sie können versuchen, die folgenden Optionen (64 Bit VM):
-XX:+UseCompressedOops
InformationsquelleAutor Lonzak
Einige Optionen, was Sie tun könnten:
-Xmx
etc. Finden Sie in der JVM-Dokumentation).(Ich Frage mich, warum die Umsetzung von iText und seine PdfStamper ist nicht effizient genug, um erfüllen Ihre Aufgabe ohne Verwendung einer großen Menge an Speicher,...)
InformationsquelleAutor Johannes