fehlermeldung java.lang.OutOfMemoryError

  • Themenstarter Themenstarter schorsch.2
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
S

schorsch.2

Gast
hallo Leute ,

ich kriege immer folgende fehlermeldung;

ich weiss, dass dies bedeutet, dass der speicher überläuft;

ich schriebe daten aus einer datenbank nach excel,
es funktioniert auch größtenteils;

jedoch bei größeren datnebankabfragen kriege ich diesen Fehler????
naja ich denke, weil das resultset entsprechend oft durchlaufen wird;

gibt es da möglichkeiten dies zu verhindern;

ich dachte mit zuerst: das resultset z.b. nur 5000 mal zu durchlaufen und dann auf zuhören;
dannach wieder diese methode aufrufen an der zuvor aufgehörten stelle, damit die variablen etc.. in der methode erstmal wieder freigegeben werden(der speicherplatz dazu meine ich) ;
-> aber genutzt hat es auch nichts;

-> bin für alleerlei hilfen dankbar !!!

euer schorsch
 
zeig mal bitte ein bischen code, denn ohne diesen, können wir dir nur schwer helfen... 😉

es besteht die möglichkeit, den zugesicherten speicher für java zu erhöhen. aber vielleicht liegt es doch am code...
 
Jep, liegt so ziemlich sicher am Code..
Sonst kannst du die heap size der vm erhöhen mit -Xmx<size> (e.g. -Xmx512M)...
 
public class Excelausgabe {

private HSSFWorkbook workbook;
private HSSFSheet sheet;
private HSSFRow row;
//private HSSFCell cell;
private String ausgabepfad;
private ResultSet rs;
private ResultSetMetaData rsmd;
private int numcols;
private int[] spaltentypen;
private int ueberlaufzaehler=1;
private int j=1;


//ResultSet sollte ersetzt werden, da ansonsten keine Trennung zur Persistenzschicht
public Excelausgabe(ResultSet rs,String ausgabepfad){
try{
this.rs = rs;
this.rsmd = rs.getMetaData();
this.ausgabepfad = ausgabepfad;
//Ermitteln der Anzahl der Spalten
numcols = rsmd.getColumnCount();
//Erzeugen eines neuen Exceldokuments
workbook = new HSSFWorkbook();
sheet = workbook.createSheet("Sheet1");
}
catch(Exception ex){
Dialog.Fehlermeldung(ex,"Fehler");
Dialog.fehler=true;
}
}



public void ausgebenSpaltenueberschriften(){
try{
row=sheet.createRow((short) 0);
for(int i=1;i<=numcols;i++){
row.createCell((short)(i-1)).setCellValue(rsmd.getColumnName(i));
}
}
catch(Exception ex){
Dialog.Fehlermeldung(ex,"Fehler");
Dialog.fehler=true;
}
}


public void ermittelnSpaltentypen(){
try{
spaltentypen = new int[numcols+1];
for(int i=1;i<=numcols;i++){
//numeric: rs "2" -> poi "0"
//string: rs "12" -> poi "1"
if(rsmd.getColumnType(i)==2){spaltentypen=0;}
else {spaltentypen=1;}
}
}
catch(Exception ex){
Dialog.Fehlermeldung(ex,"Fehler");
Dialog.fehler=true;
}
}




//das ist das problem: ich denke, dass die innere schleife hier dauernd durchlaufen wird

public void ausgebenZelleninhalte(){
try{
HSSFRow reihe;
HSSFCell zelle;
while(rs.next())
{
reihe = sheet.createRow((short)j);
j++;
if(ueberlaufzaehler >= 8000){
ueberlaufzaehler = 1;
return;
}
ueberlaufzaehler++;
//innere Schleife zur Ausgabe der Werte eines Datensatzes
for(int i=1;i<=numcols;i++){
zelle = reihe.createCell((short)(i-1));

if(spaltentypen==0){
zelle.setCellType(spaltentypen);
zelle.setCellValue(rs.getInt(i));
}
else{
zelle.setCellType(spaltentypen);
zelle.setCellValue(rs.getString(i));
//String t = rs.getString(i);
//zelle.setCellValue(t);
//System.out.println(t);
}
}
}
}
catch(Exception ex){
Dialog.Fehlermeldung(ex,"Fehler");
Dialog.fehler=true;
}
}
 
wenn ich die vm ändere mit Xmx oder so für java,

wo mache ich diese einstellung bei eclipse,
weil ich normalerweise ja nicht von konsole aus starte
 
Bei Eclipse wählst du die Klasse mit der mainMethode aus, gehts auf [Run] [Run...] Dann erscheint ein Fenster "Create, manage, and run configurations"
Links erscheint eine Liste mit allen Klassen, dort wählst du die main Klasse deiner Applikation aus, dann klickst du rechts auf den Arguments-Tab und dann siehst du unten VM arguments, dort kannst du dann die entsprechenden Parameter angeben...
Aber das bringt natürlich nichts, wenn du einen Fehler im Code hast!!

Ps: code tags nicht vergessen:
Code:
//mein code
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben