Collection in Verbindung mit String.split speicherlastig

Status
Nicht offen für weitere Antworten.

Cheefrocker

Bekanntes Mitglied
Hallo zusammen!

Ich hab eine Anwendung mit einer Collection. In diese Collection füge ich Objekte ein.

Diese Variante ist nicht speicherlastig.
Code:
Collection neu = new ArrayList<myobject>();

neu.add(new MyObject("irgendetwas als String","noch was als String"));



Diese Variante ist speicherlastig.
Code:
String inhalt = "<Testinhalt>irgendetwas als String";
Collection neu = new ArrayList<myobject>();

neu.add(new MyObject(inhalt.split("<Testinhalt>")[1],"noch was als String"));


Wahrscheinlich versteht niemand so richtig mein Problem, den ich versteh es nicht wenn Java von 15 mb auf 40 mb springt. Habe mein Problem mit einer neuen klasse nachgebildet, und da tritt der Speichersprung nicht auf.


Der Speichersprung passiert immer wenn ich die Collection adde. mach ich es ohne split dann klappt es einwandfrei ohne das des große Speichersprünge gibt. An den Inhalt des String kann ich auch über ein Parser kommen, wollte es jedoch schnell lösen mit split. Adden tu ich bei beiden Varianten(ohne split und mit split).
 
S

SlaterB

Gast
du erzeugst ständig neue Strings und speicherst diese ab,
wenn das millionenfach passiert, dann ist eine hohe Speicheranforderung gerechfertigt,

in der nichtspeicherlastigen Variante verwendest du immer die gleichen String-Konstanten,
da musst du nur Millionen MyObject-Objekte erstellen, keine Strings,
da ist weniger Speicher verständlich,

nun ist nur noch die Frage, warum in einer neuen Klasse beim split weniger Problem sind,
generell kann man immer behaupten, dass Java intern vielleicht doch optimiert und die gleichen Strings erkennt,
aber da du wohl kaum eine andere VM verwendest erscheint mir das unwahrscheinlich,
dann dürfte das Programm einfach nur anders sein,

an Codeschnipseln ist das eh kaum zu erkennen,
vollständige Programme ließen sich testen
 

Cheefrocker

Bekanntes Mitglied
Hier meine erste Variante(detailiert).
Speicherschonend:
Code:
 InputStream str = new ByteArrayInputStream((Anfang+zwischenspeicher+Ende).getBytes());
        //Hier wird das Dokument geparst und dem mainDoc zugewiesen
        try {
            mainDoc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(str);
        } catch (ParserConfigurationException ex) {
            ex.printStackTrace();
        } catch (SAXException ex) {
            ex.printStackTrace();
        } catch (IOException ex) {
            ex.printStackTrace();
            
        }


    mcollect.add(new myobject(mainDoc.getElementsByTagName("idn_2").item(0).getTextContent(),String.valueOf(zaehler)+".xml"));



Nicht Speicherschonend:

Code:
 mcollect.add(new myobject(zwischenspeicher.split("<idn_2>")[1].split("</idn_2>")[0],String.valueOf(zaehler)+".xml"));
 

Cheefrocker

Bekanntes Mitglied
Mache ich dann


Code:
mcollect.add(new myobject("das ist mal egal was für einSTring ",String.valueOf(zaehler)+".xml"));


dann steigt der Speicher nicht an!
 
S

SlaterB

Gast
@maki: anlegen ist ja nicht schlimm, sollte der GarbageCollector wieder wegräumen,
ist höchstens langsam,
einfach nur dass unterschiedliche Strings gespeichert werden ist speicherlastig,

da aber sowieso String.valueOf(zaehler)+".xml" gespeichert wird und keine Auswirkung hat, muss ja der andere String sehr lang sein,
hast du die Länge geprüft? wie viele myobjects werden überhaupt angelegt?
 

Cheefrocker

Bekanntes Mitglied
das heisst bei n-Durchläufen habe ich n-String Objekte??

kann ich das umgehen?

Mein Problem ist ich habe ein String(XML-Struktur) und ich brauche einen Bestimmten Teil draus. Hier in dem Fall den Inhalt von <idn_2>123456789</idn_2>. Der String ist nur paar kilobyte gross.

Ich hab hier zwei Varianten gefunden.
1. XML_Parser benutzen--> Nachteil: muss String darein laden dann untersuchen und idn_2 rausfinden.

2. Ich verwendet ein doppelten split und erhalten den inhalt zwischen beiden splits.


Ist meine Lösung nicht optimal?
 

Cheefrocker

Bekanntes Mitglied
SlaterB hat gesagt.:
@maki: anlegen ist ja nicht schlimm, sollte der Collector wieder wegräumen,
einfach nur dass unterschiedliche Strings gespeichert werden ist schlimm,

da aber sowieso String.valueOf(zaehler)+".xml" gespeichert wird und keine Auswirkung hat, muss ja der andere String sehr lang sein,
hast du die Länge geprüft? wie viele myobjects werden überhaupt angelegt?


Es werden ca 10000 objekte und mehr angelegt. Ich hab es auch Probeweise mit 40000 Objekte und mehr gemacht. das ist aber kein Problem diese Objekte anzulegen. In den Objekten speichere ich momentan nur 2 Strings. der erste String kann mal paar kilobyte gross werden. aber das wars auch schon.
 
S

SlaterB

Gast
am split kann es nicht liegen, wenn der XML-Parser auch letztlich
bb aus aaaaaaaaaabbaaaaaaaa liefern soll, dann muss er auch splitten oder ähnliches,
und mindestens diese bb landen auch da ja in den myobjects?

vielleicht speicherst du aber in der split-Variante die Dateien in deinem 'zwischenspeicher' oder sonst was komisches
 

Cheefrocker

Bekanntes Mitglied
in myObject speichere ich zwei Strings. und wenn ich ein split aufrufe und dahinter [0] oder [1] greife ich doch auf den String des Stringarrays zu! Aber ich versteh es selbst nicht!
 

Cheefrocker

Bekanntes Mitglied
Habe festgestellt das es ein generelles problem ist und nicht am split liegt.

String nZwisch = zwischenspeicher.substring(zwischenspeicher.indexOf("<idn_2>",0)+"<idn_2>".length(),zwischenspeicher.indexOf("</idn_2>",0));

habe das durch split ersetzt und der speicher steigt genauso an!
 
S

SlaterB

Gast
das auf jeden Fall, außerdem solltest nun auch nZwisch komplett weglassen und schauen ob sich einfach nur nebenbei der zwischenspeicher füllt oder sonst was,
vielleicht geöffnete Dateien ohne close()?
 

Cheefrocker

Bekanntes Mitglied
SlaterB hat gesagt.:
das auf jeden Fall, außerdem solltest nun auch nZwisch komplett weglassen und schauen ob sich einfach nur nebenbei der zwischenspeicher füllt oder sonst was,
vielleicht geöffnete Dateien ohne close()?

Was meinste mit close()?????
 
S

SlaterB

Gast
eine Datei schließt man wenn man sie fertig gelesen hat,
schließen heißt auf englisch close, so auch die Operation dafür
 
S

SlaterB

Gast
wenn kein close() durchgeführt wird, dann bleibt die Datei offen, vielleicht ihr ganze Inhalt in irgendeinem Stream im Speicher
 
M

maki

Gast
SlaterB, sollte der GC nicht erst alaufen, wenn der Speicher voll ist?

Wenn er igendwo noch Referenzen auf die Objekte hält (passiert oft mit Collections/etc.), können diese natürlich nicht finalized werden.
 
S

SlaterB

Gast
> aber wie komme im um solche probleme drum herum?

wenn du dich auf das close() beziehst: close() ausführen,

allgemein: als Anfänger kann man nicht alle Probleme lösen,
schreibe einfachere Programme während du noch lernst
oder finde erfahrene Programmierer die dir helfen

-------


@maki:
hmm, auch was dran, so genau kann ich es nicht sagen,

habs mal eben getestet, da wurde standardmäßig 2 MB allokiert,
der Free-Memory sank von 1.7-1.8 MB schrittweise ab, bei maximal 1.2 wurde es dem GC dann zu bunt,

zumindest bevor neuer Speicher allokiert wird, könnte der GC ja lieber unbenutzte Objekte freigeben,
ist aber reichlich Spekulation
 
M

maki

Gast
zumindest bevor neuer Speicher allokiert wird, könnte der GC ja lieber unbenutzte Objekte freigeben,
ist aber reichlich Spekulation
Hab mich lage nicht mit dem GC auseinandergesetzt, und damal nur recch oberflächlich... meine aber, dassw enn der GC anläuft, der der VM erstmal "steht".

In "Effective Java", Kapitel 2, Item 5 wird beschrieben, wie Collections dazu führen können, das man versehentlich Speicherlöcher erzeugt.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
Encera Garbage Collection Java Basics - Anfänger-Themen 9
U Beispiel Methode size() vom "Collection"-interface... Wie kann man sichtbar machen, was die Methode unter der Haube macht? Java Basics - Anfänger-Themen 8
berserkerdq2 Warum soll ich shuffle nutzen, um bei Rückgabewert Collection eine Liste zurückzugeben? Java Basics - Anfänger-Themen 3
M Collection.sort sortiert nicht Java Basics - Anfänger-Themen 7
D public ArrayList(Collection<? extends E> c); Java Basics - Anfänger-Themen 2
O Verwirrt beim Java Collection Framework aufruf! Java Basics - Anfänger-Themen 9
T Collections Geeignete Collection/Liste/Datenbank Java Basics - Anfänger-Themen 17
E Interface List nicht als Collection an erkannt. Java Basics - Anfänger-Themen 14
F Collection Aufgabe mit LinkedList Java Basics - Anfänger-Themen 3
N Collections Werte aus .txt in einer Collection speichern Java Basics - Anfänger-Themen 11
M Collection Aufgabe Java Basics - Anfänger-Themen 22
Arif Collections Unkonstruiertes Objekt einer Collection hinzufügen Java Basics - Anfänger-Themen 2
W Collection-Problem Java Basics - Anfänger-Themen 35
P Klassen In einer Autoklasse das Objekt Auto mittels Collection Speichern Java Basics - Anfänger-Themen 4
N Collection sortieren/ filtern Java Basics - Anfänger-Themen 7
K Collections Zugriff auf ein bestimmtes Element in der Collection Java Basics - Anfänger-Themen 1
J Objekt in Collection speichern Java Basics - Anfänger-Themen 4
A Interface in Collection (Liste) angeben Java Basics - Anfänger-Themen 2
J Collection Objekt Java Basics - Anfänger-Themen 3
T Collections Zusammengehörende Strings in einer Collection Java Basics - Anfänger-Themen 2
S Frage zu Collection-Generics in Subklassen Java Basics - Anfänger-Themen 6
B Collections Collection soll nur einen bestimmten Datentyp aufnehmen Java Basics - Anfänger-Themen 12
B addAll(Collection<? extends E> c) Java Basics - Anfänger-Themen 9
K Collections Collection für 12 mio Strings Java Basics - Anfänger-Themen 7
Y Collection der eigenen Klasse Java Basics - Anfänger-Themen 10
S Collections Welche Collection ist am geeignetsten? Java Basics - Anfänger-Themen 3
R Passende Collection gesucht Java Basics - Anfänger-Themen 11
G Collections Wahl der richtigen Collection Java Basics - Anfänger-Themen 11
O Frage zu Verständnis von Collection Java Basics - Anfänger-Themen 4
D Scala Iterable zu Java Collection konvertieren Java Basics - Anfänger-Themen 3
D Frage zu Collection und deren Anwendung Java Basics - Anfänger-Themen 2
S Welche Collection kann sich selber sortieren? Java Basics - Anfänger-Themen 8
J Collection soll übergeben werden... Java Basics - Anfänger-Themen 7
C Vector - obsolete collection Java Basics - Anfänger-Themen 1
B Iterator und Collection Java Basics - Anfänger-Themen 11
G Java Collection Frameworks Java Basics - Anfänger-Themen 5
D Collection Konvertieren Java Basics - Anfänger-Themen 7
K Datentypen Über Collection iterieren bringt fehler Java Basics - Anfänger-Themen 8
K OOP Aus Collection Objekte bestimmter Subklassen entfernen Java Basics - Anfänger-Themen 7
S Welche Collection? Java Basics - Anfänger-Themen 5
S Collection rückwärts durchsuchen Java Basics - Anfänger-Themen 4
W Wie kann ich auf Object meiner Collection zugreifen Java Basics - Anfänger-Themen 7
J Collection Vector Java Basics - Anfänger-Themen 8
B Collection während Iteration verändern Java Basics - Anfänger-Themen 7
T Collection in collection Java Basics - Anfänger-Themen 6
T Collection von Objekten verschiedener Klassen Java Basics - Anfänger-Themen 4
J Collection ArrayList und mit erweitertem for iterieren Java Basics - Anfänger-Themen 7
J Probleme mit Collection ArrayList Java Basics - Anfänger-Themen 2
C Collection vs. LinkedList, Abstrakt vs. Konkret Java Basics - Anfänger-Themen 9
G Collection<BufImg> in Datei speichern Java Basics - Anfänger-Themen 8
A Collection auslesen ohne Objekttyp zu kennen? Java Basics - Anfänger-Themen 11
G Collection<Strings> - Liste von Strings verwalten Java Basics - Anfänger-Themen 9
A Struts: Über Collection iterieren mir Taglibs? Java Basics - Anfänger-Themen 13
S Collection<Typ> sort Java Basics - Anfänger-Themen 4
0x7F800000 elemente aus einer Collection korrekt löschen Java Basics - Anfänger-Themen 8
T Frage zu Vererbung beim Collection-Framework Java Basics - Anfänger-Themen 4
I Frage zu Collection und List Interfaces Java Basics - Anfänger-Themen 2
M Object [][] ist nicht vom Typ Collection? Java Basics - Anfänger-Themen 3
S Collection wie LinkedHashMap Java Basics - Anfänger-Themen 7
J LinkedList, Collection, ArrayList, List. was denn bitte? Java Basics - Anfänger-Themen 6
S Collection Sort Java Basics - Anfänger-Themen 15
A Welche Collection? Java Basics - Anfänger-Themen 13
S Collection in einer Collection Java Basics - Anfänger-Themen 5
A Welche Collection soll ich nehmen? Java Basics - Anfänger-Themen 4
E welche Datenstruktur (Collection) Java Basics - Anfänger-Themen 4
K Collection und Iterator Java Basics - Anfänger-Themen 7
I Bestimmte Variablen in Collection Classes Java Basics - Anfänger-Themen 2
M Source Code von Collection Framework, etc. Java Basics - Anfänger-Themen 3
vogella Cast from Collection.toArray to String[] Java Basics - Anfänger-Themen 2
K Verständnisfrage Collection, ArrayList und Referenzen Java Basics - Anfänger-Themen 4
S Mit Collection<int[]> umgehen Java Basics - Anfänger-Themen 2
S welche collection ? String und object Java Basics - Anfänger-Themen 5
M gibt es eine collection mit definierter maximaler größe Java Basics - Anfänger-Themen 4
G Collection Framework Java Basics - Anfänger-Themen 8
V Mehrdimensionale Collection? Java Basics - Anfänger-Themen 4
U JSTL: Collection auslesen mit forEach Java Basics - Anfänger-Themen 1
A Interface Collection implementieren? Java Basics - Anfänger-Themen 4
I Collection sortieren, ":" höchste "Priorität& Java Basics - Anfänger-Themen 4
P Äquivalent zu Visual Basic Collection Java Basics - Anfänger-Themen 6
G Collection, aber welche? Java Basics - Anfänger-Themen 6
A Collection<String> Java Basics - Anfänger-Themen 4
D Frage zu Collection.sort bzw. Comparator u. Comparable Java Basics - Anfänger-Themen 2
E Strings in Collection Java Basics - Anfänger-Themen 6
R welche Collection nehmen? Java Basics - Anfänger-Themen 4
P Collection Vector speichern mittels Serialisierung? Java Basics - Anfänger-Themen 2
megachucky Collection Vector: ausgabe klappt nicht richtig Java Basics - Anfänger-Themen 9
T Welche Collection nehmen? HashMap? Java Basics - Anfänger-Themen 4
L-ectron-X Speicher freigeben - Garbage Collection Java Basics - Anfänger-Themen 6
M FTP-Verbindung mit Apache Commons Net Java Basics - Anfänger-Themen 5
T User input in Verbindung mit ChronoUnit anpassen und falls falsche Eingabe getätigtwird Java Basics - Anfänger-Themen 7
D Verbindung zu xampp Java Basics - Anfänger-Themen 4
C SFTP Verbindung nicht möglich Java Basics - Anfänger-Themen 4
G Socket Verbindung aufbauen Java Basics - Anfänger-Themen 11
I Best Practice Saubere Verbindung zwischen API und Business Layer mit DTO's Java Basics - Anfänger-Themen 2
B Quicksort in Verbindung mit einem Projekt Java Basics - Anfänger-Themen 1
S Verbindung von einer Excel Datei zu Java-- Java Basics - Anfänger-Themen 4
R Error, wenn mehrere Clients gleichzeitig die Verbindung beenden Java Basics - Anfänger-Themen 16
R Keine Verbindung mit MariaDB Java Basics - Anfänger-Themen 18
M Datenbank verbindung Java Basics - Anfänger-Themen 19
J Java Verbindung mit mysql Datenbank Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben