2017-08-18 2 views
2

Ich kenne dort viele Fragen auf java.lang.OutOfMemoryError: Java heap space.So lösen Sie java.lang.OutOfMemoryError: Java-Heap-Speicher ohne Erhöhung der Heap-Speichergröße

wie question 1

Aber keiner der Links sind nicht die richtige Antwort auf meine Frage.

Wir erstellen Berichte im Tabellenkalkulationsformat, in denen riesige Daten von der Datenbankseite kommen. Wir haben die Größe des Heapspeichers von 2 GB auf 4 GB erhöht.

wegen einer zusätzlichen Platz in Datenbankspalte sein kann, so dass ich getrimmt alle getters und setterstrim() Methode verwendet, ist dies auch kein Gebrauch.

Beispiel:

String s = "Hai  "; 
s.trim(); 

Wenn jemand mit, wie dieses Problem von Java lösen Seite Codierung, ohne die Größe des Heap-Speichers zu erhöhen. Da der Client gesagt hat, wird der Heap-Speicherplatz nicht mehr erhöht.

Beim Aufruf dieser Methode Ausnahme bekommen

private CrossTabResult mergeAllListsSameNdc(CrossTabResult crt, CrossTabResult res) { 

     crt.setFormularyTier(crt.getFormularyTier()==null ? "":((crt.getFormularyTier().contains(crt.getListId())? crt.getFormularyTier(): crt.getListId()+crt.getFormularyTier()) +"~"+res.getListId()+res.getFormularyTier())); 
     crt.setFormularyTierDesc(crt.getFormularyTierDesc()==null ? "":((crt.getFormularyTierDesc().contains(crt.getListId())? crt.getFormularyTierDesc(): crt.getListId()+crt.getFormularyTierDesc()) +"~"+res.getListId()+res.getFormularyTierDesc()));} 

kann nicht mehr Code teilen, aufgrund vertraulich. Wenn Sie eine andere Lösung suchen, informieren Sie mich bitte. Wir verschmelzen zwei String basierend auf der gleichen id.

+1

Konnten Sie etwas mehr Code zur Verfügung stellen? – notanormie

+2

Versuchen Sie, die Daten in Stapeln zu bringen. Ich nehme an, um dieses Problem zu erfahren, müssen Sie alle Daten in einer Aufnahme von der Datenbank zu Ihrem Anwendungsserver erhalten. – alexd

+0

@notanormie Ich habe die Frage mit Beispielcode bearbeitet. –

Antwort

2

We are generating reports in spreadsheet format, where huge data is coming from database side.

In dieser Art von Anwendungsfällen, Sie haben mindestens zwei Dinge, die zur Untersuchung der verbrauchte Speicher verbessern können, aber zuerst müssen Sie die Täter identifizieren. allgemein

Hauptsächlich durch Monitoring-Tools in diesem Anwendungsfall identifizierten Ursachen sind:

1) Wenn von der DB geladene Daten als ein großer Verbraucher von Speicher identifiziert werden, sollten Sie vielleicht nicht alle Daten in einem Schuss laden.
Wenn Sie all diese Objekte im Speicher behalten und gleichzeitig die Tabellenkalkulation aus diesen Daten erstellen, kann dies eine Menge Speicher belegen.
Insgesamt, wenn die Anwendung parallel für andere Anwendungsfälle verwendet wird. Sie sollten die Suche in mehrere Abfragen teilen.
Rufen Sie dann einen auf, um einige Objekte abzurufen, füllen Sie die Sprakesheath und geben Sie diese Objekte frei, wenn sie nicht mehr benötigt werden. Und so weiter ...

2) Wenn während der Tabellenerstellung die mit der Bibliothek erstellte Objekttabelle als großer Speicherverbraucher erkannt wurde, sollten Sie die Streaming-API oder Ereignis-API zum Schreiben der Tabelle über die geladene API bevorzugen die gesamte Tabelle im Speicher.
Zum Beispiel bietet POI eine DOM-ähnliche API: XSSF und eine Streaming-API: SXSSF.
Sie geben nicht die Bibliothek an, die zum Erstellen der Tabelle verwendet wird, aber es spielt keine Rolle, da die zu verwendende Logik für alle gleich sein sollte.

+0

Ich stimme dem ersten Punkt zu. Aber jetzt ist der Code in die Produktionsebene gewechselt, jetzt können wir die Datenstruktur nicht richtig ändern. –

+2

@ArvindKatte, nun, wenn du nichts änderst, wird nichts repariert. –

+0

Heute haben wir Anrufe mit Kunden, mal sehen, welchen Ansatz sie bringen werden. –

Verwandte Themen