P
PeterK!
Gast
Hi Leute,
ich hab ein Problem, dass meinem Applet (in HTML Seite integriert) beim XML erstellen bzw beim XML parsen der Speicher ausgeht. Besonderheit: ich erstelle xml im RAM und verschicke es dann dann übers Netz (deswegen die Umwandlung zum InputStream) bzw lade die XML Datei übers Netz und parse sie in der Anwendung.
Das geht bis zu einer bestimmten Größe problemlos, danach kommt der Java heap space Fehler.
Ich habe schon angefangen alle Variablen, die mehr als nur einen String / Int oder Float enthalten auf Null zu setzen und regelmäßig den GarbageCollector aufzurufen... das hat aber nicht sehr viel gebracht!
hier ein Codeauschnitt zum XML erstellen:
hier ein Codeauschnitt vom Lesen:
Habt ihr ne bessere Idee, wie ich mit dem XML umgehen kann, oder wie ich den erlaubten Arbeitsspeicher erhöhen kann?
Vielen Dank für eure Lösungsvorschläge.
Grüße, Peter
ich hab ein Problem, dass meinem Applet (in HTML Seite integriert) beim XML erstellen bzw beim XML parsen der Speicher ausgeht. Besonderheit: ich erstelle xml im RAM und verschicke es dann dann übers Netz (deswegen die Umwandlung zum InputStream) bzw lade die XML Datei übers Netz und parse sie in der Anwendung.
Das geht bis zu einer bestimmten Größe problemlos, danach kommt der Java heap space Fehler.
Ich habe schon angefangen alle Variablen, die mehr als nur einen String / Int oder Float enthalten auf Null zu setzen und regelmäßig den GarbageCollector aufzurufen... das hat aber nicht sehr viel gebracht!
hier ein Codeauschnitt zum XML erstellen:
Code:
(...)
InputStream instream = null;
try {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = factory.newDocumentBuilder();
Document doc = docBuilder.newDocument();
// die Wurzel des XML Files
Element root = doc.createElement("capture");
doc.appendChild(root);
/* hier wird einiges eingehängt */
TransformerFactory tranFactory = TransformerFactory.newInstance();
Transformer aTransformer = tranFactory.newTransformer();
aTransformer.setOutputProperty(OutputKeys.INDENT, "yes");
Source src = new DOMSource(doc);
ByteArrayOutputStream bout = new ByteArrayOutputStream();
Result result = new StreamResult(bout);
aTransformer.transform(src, result);
instream = new ByteArrayInputStream(bout.toByteArray());
tranFactory = null;
aTransformer = null;
src = null;
doc = null;
bout = null;
result = null;
System.gc();
} catch (Exception e) {
System.out.println(e.getMessage());
}
return instream;
(...)
hier ein Codeauschnitt vom Lesen:
Code:
(...)
try {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = factory.newDocumentBuilder();
Document doc = docBuilder.parse(instream);
instream = null;
System.gc();
/* hier wird zwischendurch noch so manches andere gelesen */
// Frames
NodeList XML_frames = doc.getElementsByTagName("frames").item(0).getChildNodes();
int anzahl_unsortiert = XML_frames.getLength();
int k = 0;
for(int i = 0; i < anzahl_unsortiert; i++){
Node XML_frame = XML_frames.item(i);
if(istleererNode(XML_frame)){
continue;
}
int id = Integer.valueOf(XML_frame.getAttributes().getNamedItem("id").getNodeValue());
if(werte[id].leseXML(XML_frame)){
k++;
}
XML_frame = null;
}
if(k != frames_anzahl){
isOK = false;
//System.out.println("Probleme bei den Frames!");
}
doc = null;
XML_frames = null;
docBuilder = null;
factory = null;
System.gc();
} catch (NumberFormatException e){
//System.out.println("Umwandlungsproblem");
isOK = false;
} catch (Exception e) {
//System.out.println(e.getMessage());
isOK = false;
}
(...)
/* Unterklasse */
public boolean leseXML(Node frame){
boolean isOK = true;
try{
NodeList XML_markers = frame.getChildNodes();
int unsort = XML_markers.getLength();
for(int i = 0; i < unsort; i++){
Node XML_marker = XML_markers.item(i);
if(istleererNode(XML_marker)){
continue;
}
String name = XML_marker.getAttributes().getNamedItem("name").getNodeValue();
Float x = Float.valueOf(XML_marker.getAttributes().getNamedItem("x").getNodeValue());
Float y = Float.valueOf(XML_marker.getAttributes().getNamedItem("y").getNodeValue());
Float z = Float.valueOf(XML_marker.getAttributes().getNamedItem("z").getNodeValue());
werte.put(name, new Point3f(x, y, z));
XML_marker = null;
//System.out.println("Marker " + name + ": x: " + x + ", y: " + y + ", z: " + z);
}
XML_markers = null;
//System.gc();
}catch(Exception e){
isOK = false;
}
return isOK;
}
Habt ihr ne bessere Idee, wie ich mit dem XML umgehen kann, oder wie ich den erlaubten Arbeitsspeicher erhöhen kann?
Vielen Dank für eure Lösungsvorschläge.
Grüße, Peter