Mam utworzone nastepujace klasy:
public class dDialog extends JDialog
{
BorderLayout borderLayout1 = new BorderLayout();
JButton buttonWykonaj = new JButton();
JPanel jPanelek = new JPanel();
JPanel panel1 = new JPanel();
MojaTabela nowa;
public dDialog(Frame owner, String title, boolean modal) {
super(owner, title, modal);
buttonWykonaj.addActionListener(new dDialog_buttonWykonaj_actionAdapter(this));
panel1.setLayout(borderLayout1);
panel1.add(jPanelek, java.awt.BorderLayout.NORTH);
panel1.add(buttonWykonaj);
}
public void buttonWykonaj_actionPerformed(ActionEvent e)
{
//tutaj rozne sposoby na zwolnienie pamieci, ale odwolanie do zmiennej "nowa" daje
//wyjatki:java.lang.NullPointerException o ile za pierwszym razem jest to logiczne
//to za kazdym nastepnym razem powinien pozwolic juz na operacje
jPanelek.remove(nowa);
nowa.remove(nowa.table);
nowa.table=null;
nowa=null;
MojaTabela nowa=new MojaTabela();
//wyciete -> czytanie z bazy danych ile bedzie do wyswietlenia wierszy i kolumn
Object oDane[][] = new Object[iLiczbaWierszy][iLiczbaKolumn];
//wyciete -> fragment czytajacy obiekty z bazy i wpisujacy je do tablicy
nowa.CreateTable(oDane);
}
}
//=========tutaj listener wiec standard i nic ciekawego
class dDialog_buttonWykonaj_actionAdapter implements ActionListener
{
private dDialog adaptee;
dDialog_buttonWykonaj_actionAdapter(dPanelAdministratora adaptee)
{
this.adaptee = adaptee;
}
public void actionPerformed(ActionEvent e)
{
adaptee.buttonWykonaj_actionPerformed(e);
}
}
//=============tutaj moja klasa
public class MojaTabela extends JPanel
{
JTable table;
String strNazwyKolumn[] = {"A", "B", "C"};//Tutaj jakies nazwy kolumn, w programie czytane z bazy
MojaTabela ()
{
table=null;
JScrollPane scrollPane = new JScrollPane(table);
this.add(scrollPane,BorderLayout.CENTER);
}
public void CreateTable_v(Object oDane[][])
{
table = new JTable (oDane, strNazwyKolumn);
this.add(table, BorderLayout.CENTER);
}
}
Kiedy klikam na przycisk, to wyswietlaja sie w tabelce dane, kiedy rekordow jest niewiele to nie ma problemu, wyciek pamieci jest niewielki, ale gdy mam do wyswietlenie 50000-60000 rekordow to zuzycie pamieci wynosci 40MB, kolejne klikniecie to znow 40MB, a po chwli na konsoli mam oczywisty komunikat:
Exception occurred during event dispatching:
java.lang.OutOfMemoryError: Java heap space
Wyciek pamieci znajduje sie na pewno przy tabelce (spedzilem sporo czasu aby to znalezc, na poczatku podejrzewalem bufor bazy danych). Czy ktos wie jak zwolnic ta zajmowana pamiec lub w ktorym miejscu usuwac dane "nowa"? Probowalem cos kombinowac z kolejnoscia usuwania (bo wywolania sa kolejno: Frame (glowne okno) -> Dialog -> Panel -> ScrollPanel -> tabelka).