Johannes7146
Goldschnabel
In folgendem Code läuft mit jedesmal der Heap Space voll, egal ob ich mit 64,128 oder 256mb die VM starte.
Auch ist der Punkt an dem das ganze Auftritt nicht immer genau an der selben Stelle.
Ich habe keinerlei Streams offen. Ich vermute Hibernate ist schuld daran.
habe an vielen Stellen auch schon die Session gecleart, leider ohne Erfolg.
Evtl kann jemand von euch mal einen Blick drauf werden.
Danke
Auch ist der Punkt an dem das ganze Auftritt nicht immer genau an der selben Stelle.
Ich habe keinerlei Streams offen. Ich vermute Hibernate ist schuld daran.
habe an vielen Stellen auch schon die Session gecleart, leider ohne Erfolg.
Evtl kann jemand von euch mal einen Blick drauf werden.
Danke
Java:
for (int aktMaschine = startMaschine; aktMaschine < maschinen.size(); aktMaschine++) {
log.info("Datenarchivierung_archiviere--> " + "Maschine " + (aktMaschine + 1)
+ " von " + maschinen.size() + " -->"
+ maschinen.get(aktMaschine).getSeriennummer());
/* Durchschnittzeiten und Durchläufe neu anlegen */
if (timeAverage == null) {
timeAverage = new HashMap<String, Double>();
for (String typ : messungstypen) {
timeAverage.put(typ, 0.0);
}
}
if (durchlaeufe == null) {
durchlaeufe = new HashMap<String, Integer>();
for (String typ : messungstypen) {
durchlaeufe.put(typ, 0);
}
}
//-----------------------------------------------------------
List<String> locales = getLocalesVonMaschine(maschinen.get(aktMaschine));
//-----------------------------------------------------------
/* Schleife über alle Messungtypen */
for (int aktMessungsTyp = startMessungstyp; aktMessungsTyp < messungstypen
.size(); aktMessungsTyp++) {
if (messungstypen.get(aktMessungsTyp)
.equals(Messungstyp.SCHLAGMONITORING)) {
//Aufgrund der Komprimierung kann dieses Profil übersprungen werden
continue;
}
/*
* Erntetage holen
*/
List<Date> erntetage = ErntetagService.getErntetage(maschinen
.get(aktMaschine).getMaschineId(), new String[] { messungstypen
.get(aktMessungsTyp) }, von.getTime(), bis.getTime(), null);
long profilstart = System.currentTimeMillis();
/*
* Schleife über alle Erntetage
*/
for (int aktTag = startTag; aktTag < erntetage.size(); aktTag++) {
collection = new ArrayList<Maschine>();
collection.add(maschinen.get(aktMaschine));
GregorianCalendar vonMitStdAngabe = new GregorianCalendar();
vonMitStdAngabe.setTime(erntetage.get(aktTag));
vonMitStdAngabe.set(GregorianCalendar.HOUR_OF_DAY,
Kalender.ERNTETAG_BEGINN);
GregorianCalendar bismitStdAngabe = (GregorianCalendar) vonMitStdAngabe
.clone();
bismitStdAngabe.add(GregorianCalendar.DAY_OF_MONTH, 1);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy\\MM\\dd");
long start = System.currentTimeMillis();
for (String land : locales) {
Locale loc = new Locale(land);
String save_path = rootDatenarchivierung + "\\csv" + "\\"
+ maschinen.get(aktMaschine).getSeriennummer() + "\\"
+ sdf.format(vonMitStdAngabe.getTime()) + "\\"
+ land.toLowerCase() + "\\";
if (messungstypen.get(aktMessungsTyp)
.equalsIgnoreCase(Messungstyp.ALARMMELDUNG)) {
CSVAlarmExporter export = new CSVAlarmExporter(maschinen
.get(aktMaschine),
vonMitStdAngabe
.getTime(),
bismitStdAngabe
.getTime(),
save_path,
"Alarm-CSV.csv",
loc);
/* CVS-File erstellen */
log.info("ArchivierenThread_archiviere-->Erstelle CSV für: "
+ maschinen.get(aktMaschine).getSeriennummer() + " "
+ messungstypen.get(aktMessungsTyp) + " "
+ erntetage.get(aktTag));
export.createCSVExport();
} else {
CSVExportNew export = new CSVExportNew(collection,
vonMitStdAngabe
.getTime(),
bismitStdAngabe
.getTime(),
messungstypen
.get(aktMessungsTyp),
loc,
true,
save_path);
/* CVS-File erstellen */
log.info("ArchivierenThread_archiviere-->Erstelle CSV für: "
+ maschinen.get(aktMaschine).getSeriennummer() + " "
+ messungstypen.get(aktMessungsTyp) + " "
+ erntetage.get(aktTag));
export.buildCSVFile();
}
//ENDE schleife über Locales
HibernateSessionFactory.clearSession();
}
long stop = System.currentTimeMillis();
/* Durchläufe hochzählen */
durchlaeufe.put(messungstypen.get(aktMessungsTyp), durchlaeufe
.get(messungstypen.get(aktMessungsTyp)) + 1);
/* Neuen Durchschnittswert(Dauer) speichern */
timeAverage.put(messungstypen.get(aktMessungsTyp),
zeitberechnung(start,
stop,
timeAverage.get(messungstypen
.get(aktMessungsTyp)),
durchlaeufe.get(messungstypen
.get(aktMessungsTyp))));
if (log.isEnabledFor(org.apache.log4j.Level.DEBUG)) {
StringBuffer sb = new StringBuffer();
sb.append("Von : " + vonMitStdAngabe.getTime() + "\n");
sb.append("Bis : " + bismitStdAngabe.getTime() + "\n");
sb.append("Maschine : "
+ maschinen.get(aktMaschine).getSeriennummer() + "\n");
sb.append("Messungstyp : " + messungstypen.get(aktMessungsTyp)
+ "\n");
sb.append("Dauer : " + ((stop - start) / 1000) + " sec"
+ "\n");
sb.append("Durschlauf : "
+ durchlaeufe.get(messungstypen.get(aktMessungsTyp))
+ " von " + erntetage.size() + "\n");
sb.append("Durschnitt : "
+ timeAverage.get(messungstypen.get(aktMessungsTyp))
+ " sec\n" + "\n");
log.debug("Datenarchivierung_archiviere-->\n" + sb.toString());
sb = null;
}
/*
* Prüfen ob heruntergefahren werden soll.
*/
if (!isRunning()) {
log
.info("ArchivierenThread_archiviere-->Archivierung wird unterbrochen und zwischengespeichert");
// aktuellen Tag hochzählen damit nicht der letzte
// nochmal durchaufen wird
aktTag++;
/*
* Wenn aktTag == erntetage.size() dann sind alle Tage durchlaufen und
* der aktuelle Tag muss auf 0 gesetzt werden. Außerdem muss der
* nächstem Durchlauf mit dem nächsten Profil fortgesetzt werden
*/
if (aktTag == erntetage.size()) {
aktTag = 0;
aktMessungsTyp++;
/*
* Wenn aktMessungsTyp == messungstypen.size() dann sind alle
* Profile für diese Maschine durchlaufen. Das beudetet der nächste
* Durchlauf mit dem erstem Profil und der nächsten Maschine
* fortgesetzt werden muss
*/
if (aktMessungsTyp == messungstypen.size()) {
aktMessungsTyp = 0;
aktMaschine++;
durchlaeufe = null;
timeAverage = null;
}
}
/*
* Alle notwendigen Parameter werden in einer
* DatenarchivierungUnterbrechnung gespeichert
*/
DatenarchivierungUnterbrechnung dau = new DatenarchivierungUnterbrechnung();
dau.setThread("archivieren");
dau.setAktTag(aktTag);
dau.setAktMaschine(aktMaschine);
dau.setAktMessungsTyp(aktMessungsTyp);
dau.setBis(bis);
dau.setVon(von);
dau.setErntetage(erntetage);
dau.setMaschinen(maschinen);
dau.setMessungstypen(messungstypen);
dau.setDurchlaeufe(durchlaeufe);
dau.setTimeAverage(timeAverage);
/* Objekt< serialisieren */
dam.objektSpeichern(dau);
bereitsGespeichert = true;
log
.info("ArchivierenThread_archiviere-->Archivierung wurde unterbrochen und zwischengespeichert");
HibernateSessionFactory.clearSession();
return false;
}
HibernateSessionFactory.clearSession();
}// ENDE: Schleife über Erntetage
if (erntetage.size() > 0) {
long profiende = System.currentTimeMillis();
long dauer = profiende - profilstart;
dauer /= 1000;
long sec = dauer % 60;
dauer -= sec;
long min = dauer / 60;
if (log.isEnabledFor(org.apache.log4j.Level.DEBUG)) {
log.debug("Datenarchivierung_archiviere-->" + "Für das Profil "
+ messungstypen.get(aktMessungsTyp)
+ " wurde folgende Zeit benötigt: " + min + " Minuten "
+ sec + " Sekunden");
}
} else {
if (log.isEnabledFor(org.apache.log4j.Level.DEBUG)) {
log.debug("Datenarchivierung_archiviere-->\n" + "Für das Profil "
+ messungstypen.get(aktMessungsTyp)
+ " wurden keine Messungen gefunden");
}
}
HibernateSessionFactory.clearSession();
}// ENDE: Schleife über Messungstypen
/*
* Anzahl der Durchläufe und Durchschnitte wieder auf 0 setzen
*/
timeAverage = null;
durchlaeufe = null;
//
timeAverage = new HashMap<String, Double>();
for (String typ : messungstypen) {
timeAverage.put(typ, 0.0);
}
durchlaeufe = new HashMap<String, Integer>();
for (String typ : messungstypen) {
durchlaeufe.put(typ, 0);
}
//
}// ENDE: Schleife über alle Maschinen