Gdzie sie podziala moja pamiec? (JTable pozeraczem RAMu???)

0

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).

0

ja ci powiem ze tez mialem cos podobnego
<ort>ciagnolem </ort>z bazy danych w cholere tego bylo i w ogole (z neta ort!)
i sie wkurzylem
najpierw sprawdzalem ile wierszy do <ort>sciagniecai </ort>
i dawalem mu limity w combo tylko sobie wybierasz ktore wiersze chcesz zobaczyc i wtedy sie sciagaja
i do tego <ort>scaigniecie </ort>100 wierszy bedzie krocej trwalo niz <ort>sciagneicie </ort>10000 wierszy czy wiecej :)
a <ort>poza tym </ort>co ty sie spodziewasz jak trzymasz tablice 50000 wierszy typu Object - cos za cos

0

no dobra... ale jak chcesz to sobie posortowac to musisz wczytac wszystko do pamieci! (mozna tez posrednio tworzac tablice zawierajaca kolumne wg ktorej ma byc sorotwane, a druga z "adresami" do odpowiednich wierszy). Jest tez sposob na kazdorazowe wykonywanie zapytania SQL z "ORDER BY XXX", tyle ze wtedy za kazdym razem musisz laczyc sie z baza dancyh aby wykonac kwerende. Zreszta sa sytuacje gdzie nie zawsze to rozwiazanie sie sprawdza, np gdy utrzymywanie polaczenia jest niewskazane (bo jest wielu uzytkownikow), a jesli nie utrzymujesz polaczenia to musisz czesto sie laczyc (a to tez moze byc niewskazane :/). Trzeba wiec w takim przypadku wczytywac do pamieci calosc.
Zreszta nie o sposoby wczytywania tu chodzi, a o zwolnienie pamieci... niech to sobie nawet 300MB zajmuje, byle by zwracalo pamiec!!!

0

jPanelek.removeAll();

..... :] tylko ze potem trzeba dodac od nowa wszystkie komponenty

1 użytkowników online, w tym zalogowanych: 0, gości: 1