2016-07-17 23 views
1

Ich habe eine 1.5G XML-Datei, und ich benutze einen DOM Java-Parser (nach werfen dieses Problem Ich weiß DOM ist kein gutes Werkzeug für große Datenmengen, während ich immer noch neugierig bin über das Problem unten). Mein Problem ist "OutOfMemoryError: Java-Heap-Space", basierend auf den bereits vorhandenen Antworten, ändere ich die Größe von eclipse.ini -xms und -xmx auf 8096m und zeige den Heap-Status im eclispe-Fenster an, um zu überwachen, wie viel Heap-Größe hat benutzt. Während ich diesen Code benutze, habe ich nur "80m/8096m" benutzt und dann den "out memory" Bug rausgeworfen, ich frage mich, warum da eindeutig nicht viel Platz ist, also "8096m - 80m", aber immer noch zu wenig Speicher .Eclipse aus dem Speicher mit zugeordneten 8G Heap Größe

+3

"Fehler"? Nein, Ihr Code tut es. Versuchen Sie, den Code mit etwas wie Visual VM zu profilieren, um zu sehen, wo Speicher verbraucht wird. – duffymo

+3

Wenn es Ihr Programm ist, das den gesamten Speicher und nicht Eclipse verwendet, müssen Sie die VM-Argumente ändern, die Eclipse verwendet, um * Ihr Programm * auszuführen, nicht die VM args für ecliipse selbst. Siehe http://stackoverflow.com/questions/4175188/setting-memory-of-java-programs-that-runs-from-eclipse für die Vorgehensweise – wakjah

+0

Für 1,5 GB xml und -Xmx8096m, wenn der Code immer noch OOME wirft dann bin ich mir fast sicher, dass es etwas im Code gibt, das verbessert werden muss. Normalerweise ist das SAX-Parsing für große Datentypen besser. Wie spezifiziert man Xmx? kannst du uns zeigen? – SomeDude

Antwort

0

I wonder why there is clearly huge space not used, i.e. "8096m - 80m ", but still get to out of memory.

Sie sind falsch interpretiert etwas . Und (IMO) die wahrscheinlichste ist, dass Sie den Speicher Ihrer IDE (Eclipse) mit dem Speicher verwechseln, der für die Ausführung Ihrer Anwendung verwendet wird.

Sofern Sie nicht etwas Seltsames tun (und nicht ratsam), wird Ihre Anwendung in einer separaten JVM ausgeführt, deren Heap-Parameter unabhängig von den IDE-Heap-Parametern sind. Es überrascht nicht (für mich), dass die Speicherauslastung Ihres Eclipse-IDE-Prozesses klein ist ... weil Ihre Anwendung dort nicht ausgeführt wurde.

Die Optimierung der Heap-Parameter für Eclipse macht keinen Unterschied zu den JVM-Heap-Parametern der Anwendung! Was Sie tatsächlich tun müssen, ist, die Heap-Parameter in der Eclipse-Launcher-Konfiguration für Ihre Anwendung festzulegen. Innerhalb von Eclipse. Alternativ starten Sie die Anwendung von Hand an der Eingabeaufforderung.


Aber in diesem Fall bezweifle ich, dass es funktioniert. Ich wäre sehr überrascht, wenn Sie eine 1,5 GB XML-Datei als DOM in einem 8 GB Java-Heap darstellen könnte. Die Gemeinkosten dieser Darstellungsform sind zu groß.


1 - Wenn der Eclipse-IDE selbst wurde der Speicher ausgeht, wäre es schrecklich langsam, und dann abstürzen. War dort. Das gesehen. Es passiert normalerweise, wenn Sie eine sehr große Codebasis entwickeln oder untersuchen.

+0

Danke für Ihre Lösung, die Sinn macht! Ich habe immer noch zwei verwirrte Dinge: 1. Wie man den JVM-Speicher in Eclipse setzt, könnten Sie genauer sein 2. Was ist der Unterschied für JVM- und Eclipse-Speicher, die im JVM-Speicher gespeicherten Variablen, für welchen Eclipse-Speicher? – michael

+0

1) http://stackoverflow.com/questions/15313393/how-to-increase-application-heap-size-in-eclipse. 2) Es ist wie du zwei Autos hast. Sie haben zwei Benzintanks. Sie setzen Benzin in den Benzintank eines Autos, und es ist nicht im Benzintank des anderen Autos. Die JVM, auf der Eclipse ausgeführt wird, unterscheidet sich von der JVM, auf der Ihre Anwendung ausgeführt wird. –

+0

Danke Steven. zwei schnelle Fragen 1. Da ich die Eclipse-Speicher-Nutzung in Eclipse überwachen könnte, gibt es eine Möglichkeit, die jvm-Speicher-Nutzung zu überwachen. Nachdem ich den jvm Speicher zu 4G geändert habe, funktioniert es auch aus dem Speicher, wie Sie sagen, Dom kann nicht mit großen Daten umgehen. 2. Ich bekomme auch keine klare Idee für die Unterschiede zwischen JVM- und Eclipse-Speicher, könntest du mir einen Link geben oder mehr erklären, dein Analogon ist irgendwie verwirrt. – michael