Problema com lista muito grande

Olá! tenho uma aplicação em desenvolvimento usando netbeans+toplink+postgres, sendo que separei a estrutura em controle modelo e visao. Tenho uma listagem enorme com 28.000 registros puxados de um bean, jogo a listagem completa pra dentro de um jtable por intermédio de uma tablemodel e Decorators implementadas, mas porém como é uma lista muito grande ela nao fumega na jtable, no netbeans roda tranqulio, mas rodando independente acontece isso. Nao sei se é heap ou outra coisa, ja tive este problema no inicio e aparentemente tinha solucionado com os decorators. Segue abaixo os codigos.

[code]/*
package Controller.Dao;

import Controller.Formatter.FormataData;
import Modelo.Bean.Tbunimedlages;
import Modelo.Decorator.UnimedDecorator;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.Query;

public class UnimedDAO extends GenericDAO{

public UnimedDAO() {
}
FormataData data = new FormataData();

public List<UnimedDecorator> getAllUnimedDecorators() {

    Query query = getEntityManager().createQuery("SELECT t FROM Tbunimedlages t ORDER BY t.idproduni");
    List<Tbunimedlages> lo = query.getResultList();

    List<UnimedDecorator> listDecorators = new ArrayList<UnimedDecorator>();
     for(Tbunimedlages t:lo){
        
        UnimedDecorator dc= new UnimedDecorator();
        dc.setCodproduni(lo.get(i).getCodproduni());
        dc.setIdproduni(lo.get(i).getIdproduni());
        dc.setNomeapresuni(lo.get(i).getNomeapresuni());
        dc.setNomecomeruni(lo.get(i).getNomecomeruni());
        dc.setNomelabuni(lo.get(i).getNomelabuni());
        dc.setQtdfrauni(String.valueOf(lo.get(i).getQtdfrauni()));
        dc.setUnidadeuni(lo.get(i).getUnidadeuni());
        dc.setVlrbraspfuni(lo.get(i).getVlrbraspfuni());
        dc.setVlrbraspmcuni(lo.get(i).getVlrbraspmcuni());
        dc.setVlrsimprouni(lo.get(i).getVlrsimprouni());
        dc.setTipoproduni(lo.get(i).getTipoproduni());

        listDecorators.add(dc);

    }
    return listDecorators;
}

}
[/code]


package Controller.TableModel;

import Modelo.Decorator.UnimedDecorator;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.List;
import javax.swing.table.AbstractTableModel;

public class UnimedTableModel extends AbstractTableModel{

    private static final long serialVersionUID = 1L;

	
	private List<UnimedDecorator> unimed;

	public UnimedTableModel() {
		// no construtor, instanciamos o List
		unimed = new ArrayList<UnimedDecorator>();
	}

	
	public UnimedTableModel(List<UnimedDecorator> lista) {
		this();
		unimed.addAll(lista);
	}

        public void zeraUnimed(){
            unimed = new ArrayList<UnimedDecorator>();
        }


	@Override
	public Class<?> getColumnClass(int coluna) {
		// todas as colunas representam uma String
		return String.class;
	}

	@Override
	public int getColumnCount() {
		// esse método deve retornar o número de colunas. No caso, 3 (uma para o
		// nome, uma para o sobrenome e uma para o apelido).
		return 11;
	}

	@Override
	public String getColumnName(int coluna) {
		
		switch (coluna) {
		case 0:
			return "Código"; // o nome da primeira coluna
		case 1:
			return "Cód.Produto"; // o nome da segunda
		case 2:
			return "Descrição Comercial"; // e o da terceira
                case 3:
			return "Descrição Apresentação"; // e o da terceira
                case 4:
			return "Laboratório"; // e o da terceira
                case 5:
			return "Unidade"; // e o da terceira
                case 6:
			return "Qtd.Frac."; // e o da terceira
                case 7:
			return "Valor Simpro";
                case 8:
			 return "Valor BrasÍndice PF";
                case 9:
			return "Valor BrasIndice PMC";
                case 10:
                        return "Tipo de Produto";
		default:
			return ""; 		}
	}

	@Override
	public int getRowCount() {
		
		return unimed.size();
	}

	@Override
	public Object getValueAt(int linha, int coluna) {
		
		UnimedDecorator c = unimed.get(linha);
		
		switch (coluna) {
		case 0:
			return c.getIdproduni();
		case 1:
			return c.getCodproduni();
		case 2:
			return c.getNomecomeruni();
                case 3:
			return c.getNomeapresuni();
                case 4:
			return c.getNomelabuni();
                case 5:
			return c.getUnidadeuni();
                case 6:
			return c.getQtdfrauni();
                case 7:
			return c.getVlrsimprouni();
                case 8:
			return c.getVlrbraspfuni();
                case 9:
			return c.getVlrbraspmcuni();
                case 10:
			return c.getTipoproduni();
		default:
			return null; 
		}
	}

	@Override
	public boolean isCellEditable(int rowIndex, int columnIndex) {
		
		return false;
	}

	@Override
	public void setValueAt(Object valor, int linha, int coluna) {
		
		UnimedDecorator c = unimed.get(linha);
		
		switch (coluna) {
		case 0:
			c.setIdproduni(Long.parseLong(valor.toString())); // mudamos o nome
			break;
		case 1:
			c.setCodproduni(valor.toString()); // mudamos o sobrenome
			break;
		case 2:
			c.setNomecomeruni(valor.toString()); // e o apelido
			break;
                case 3:
			c.setNomeapresuni(valor.toString()); // e o apelido
			break;
                case 4:
			c.setNomelabuni(valor.toString()); // e o apelido
			break;
                case 5:
			c.setUnidadeuni(valor.toString()); // e o apelido
			break;
                case 6:
			c.setQtdfrauni(valor.toString()); // e o apelido
			break;
                case 7:
			c.setVlrsimprouni(BigDecimal.valueOf(Double.parseDouble(valor.toString()))); 
			break;
                case 8:
			c.setVlrbraspfuni(BigDecimal.valueOf(Double.parseDouble(valor.toString()))); 
			break;
                case 9:
			c.setVlrbraspmcuni(BigDecimal.valueOf(Double.parseDouble(valor.toString()))); 
			break;
                case 10:
			c.setTipoproduni(valor.toString());
			break;
		}
		
		fireTableDataChanged();
	}

	
	
	public void adiciona(UnimedDecorator c) {
		unimed.add(c);
		
		fireTableRowsInserted(unimed.size() - 1, unimed.size() - 1);
	}

	
	public void remove(int indice) {
		unimed.remove(indice);
		fireTableRowsDeleted(indice, indice);
	}

	
	public int getIndice(UnimedDecorator c) {
		return unimed.indexOf(c);
	}

	
	public void adicionaLista(List<UnimedDecorator> lista) {
                this.zeraUnimed();
		int i = unimed.size();
		unimed.addAll(lista);
		fireTableRowsInserted(i, i + lista.size());
	}

	
	public void limpaLista() {
		int i = unimed.size();
		unimed.clear();
		fireTableRowsDeleted(0, i - 1);

                unimed = new ArrayList<UnimedDecorator>();
	}
}

Este pedaço popula a jtable, alias esta vindo em branco.

//******************************************************************************
//******************************************************************************
    /*monta os dados no grid*/
    private void setMontaTbUnimed(){

        JTableUnimedLages.removeAll();
        unitm.removeTableModelListener(JTableUnimedLages);
        // aqui está a grande jogada!
		//ctm.addTableModelListener(this);
        unitm.adicionaLista(getUnimedControl().getAllUnimedControl());

        JTableUnimedLages.getColumnModel().getColumn(0).setPreferredWidth(80);
        JTableUnimedLages.getColumnModel().getColumn(1).setPreferredWidth(80);
        JTableUnimedLages.getColumnModel().getColumn(2).setPreferredWidth(500);
        JTableUnimedLages.getColumnModel().getColumn(3).setPreferredWidth(500);
        JTableUnimedLages.getColumnModel().getColumn(4).setPreferredWidth(300);
        JTableUnimedLages.getColumnModel().getColumn(5).setPreferredWidth(80);
        JTableUnimedLages.getColumnModel().getColumn(6).setPreferredWidth(80);
        JTableUnimedLages.getColumnModel().getColumn(7).setPreferredWidth(120);
        JTableUnimedLages.getColumnModel().getColumn(8).setPreferredWidth(120);
        JTableUnimedLages.getColumnModel().getColumn(9).setPreferredWidth(120);
        JTableUnimedLages.getColumnModel().getColumn(10).setPreferredWidth(120);
      //desabilitar auto resizeE
        this.JTableUnimedLages.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
        this.JTableUnimedLages.setRowHeight(25);

      //tipo zero = seleção única
      this.JTableUnimedLages.setSelectionMode(0);

    }