Java.lang.OutOfMemoryError em ArrayList

4 respostas
Nader_Daher

TEnho uma aplicação que faz a busca no banco de dados com mais de 18 mil registros, e guarda a busca em um ArrayList, e um metodo refreshTable() que joga o ArrayList em uma jTable, em uma consulta simples ao banco select * from consegui mostra na table, mas qnd fiz uma busca envolvendo 3 tabelas do bd acontece o erro, o q sera?

package Acesso_dados;

import Apresentacao.ConsultaLocalizacao;
import Negocio.Amostra;
import Negocio.ConsultaNumCampo;
import java.util.ArrayList;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.swing.JOptionPane;

/**
 *
 * 
 */
public class AmostrasDAO {

    private Connection connection;

 
     public AmostrasDAO() throws SQLException{
   this.connection = ConnectionFactory.getConnection();

    }



// Mostra as localizações a partir dos projetos.
public ArrayList<ConsultaNumCampo> getprojeto(String n) throws SQLException{

    ArrayList<ConsultaNumCampo> res = new ArrayList<ConsultaNumCampo>();


       // ConsultaNumCampo cn = new ConsultaNumCampo();
 
        PreparedStatement stmt = connection.prepareStatement("SELECT  L.DESCRICAO, A.NUM_PECAS, A.OBS, M.NUMERO_CAMPO" +
                                                              " FROM LOCALIZACOES L, AMOSTRAS_LOCALIZACAO A, AMOSTRAS M " +
                                                             "WHERE M.NUMERO_CAMPO LIKE  '%"+n+"%'");

            ResultSet rs = stmt.executeQuery();
            //vai no banco executa a query e joga no resultset
            
            while(rs.next()){
            ConsultaNumCampo numCampo = new ConsultaNumCampo();

             numCampo.setnCampo(rs.getString("NUMERO_CAMPO"));
             numCampo.setNomeLocalizacao(rs.getString("DESCRICAO"));
             numCampo.setNumPecas(rs.getString("NUM_PECAS"));
             numCampo.setObs(rs.getString("OBS"));


               

             res.add(numCampo);

            }
               rs.close();
               stmt.close();
               connection.close();

        return res;

    }







}
package Apresentacao;

import Acesso_dados.AmostrasDAO;
import Negocio.Amostra;
import Negocio.ConsultaNumCampo;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.table.DefaultTableModel;

/**
 *
 * @author 
 */
public class ConsultaLocalizacao extends javax.swing.JInternalFrame {
 
 private AmostrasDAO dao;
 ArrayList<ConsultaNumCampo> res = new ArrayList<ConsultaNumCampo>();
    /** Creates new form ConsultaLocalizacao */
    public ConsultaLocalizacao() throws SQLException {

        dao = new AmostrasDAO();
        initComponents();
     
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        jLabel1 = new javax.swing.JLabel();
        jtNumeroCampo = new javax.swing.JTextField();
        jbPesquisarNum = new javax.swing.JButton();
        jLabel2 = new javax.swing.JLabel();
        jtNatureza = new javax.swing.JTextField();
        jButton2 = new javax.swing.JButton();
        jScrollPane1 = new javax.swing.JScrollPane();
        jtbResultado = new javax.swing.JTable();

        setVisible(true);

        jLabel1.setText("Nº de Campo:");

        jbPesquisarNum.setText("Pesquisar");
        jbPesquisarNum.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jbPesquisarNumActionPerformed(evt);
            }
        });

        jLabel2.setText("Natureza:");

        jButton2.setText("Pesquisar");
        jButton2.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton2ActionPerformed(evt);
            }
        });

        jtbResultado.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {

            },
            new String [] {
                "N° Campo", "Loacalização", "N° de peças", "Observação"
            }
        ) {
            boolean[] canEdit = new boolean [] {
                false, false, true, true
            };

            public boolean isCellEditable(int rowIndex, int columnIndex) {
                return canEdit [columnIndex];
            }
        });
        jScrollPane1.setViewportView(jtbResultado);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addGap(62, 62, 62)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                            .addComponent(jLabel2)
                            .addComponent(jLabel1))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(jtNumeroCampo, javax.swing.GroupLayout.PREFERRED_SIZE, 163, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(jtNatureza, javax.swing.GroupLayout.PREFERRED_SIZE, 163, javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addGap(31, 31, 31)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(jButton2)
                            .addComponent(jbPesquisarNum)))
                    .addGroup(layout.createSequentialGroup()
                        .addGap(23, 23, 23)
                        .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addContainerGap(26, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel1)
                    .addComponent(jtNumeroCampo, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jbPesquisarNum))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel2)
                    .addComponent(jtNatureza, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jButton2))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 49, Short.MAX_VALUE)
                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 210, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(20, 20, 20))
        );

        pack();
    }// </editor-fold>                        
private void refreshTable() throws SQLException {
        DefaultTableModel model = (DefaultTableModel) jtbResultado.getModel();
        model.setNumRows(0);

        res = dao.getprojeto(jtNumeroCampo.getText());
        for (ConsultaNumCampo elem : res) {
            Object[] dados = {elem.getnCampo(),elem.getNomeLocalizacao(),elem.getNumPecas(),elem.getObs()
            };
            model.addRow(dados);
        }
    }

    private void jbPesquisarNumActionPerformed(java.awt.event.ActionEvent evt) {                                               
        try {
            refreshTable();
        } catch (SQLException ex) {
            Logger.getLogger(ConsultaLocalizacao.class.getName()).log(Level.SEVERE, null, ex);
        }

    }                                              

    private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        // TODO add your handling code here:
    }                                        


    // Variables declaration - do not modify                     
    private javax.swing.JButton jButton2;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JButton jbPesquisarNum;
    private javax.swing.JTextField jtNatureza;
    private javax.swing.JTextField jtNumeroCampo;
    private javax.swing.JTable jtbResultado;
    // End of variables declaration                   

    /**
     * @return the num_campo
     */
}

Se Alugem poder me ajudar ficarei grato!

4 Respostas

argentinaluiz

bom você pode estar fazendo um select com complexidade exponencial
dá um conferida no where (“chaves primária e estrangeira”) para nao gerar esta complexidade exponencial

e caso esteja certo voce vai ter que dar um comando na hora de rodar seu programa

java -Xmx500m -jar seuprograma.jar

acho que a sintaxe é assim

ele fala para o s.o que o programa pode usar ate 500mb da memoria

ctosin

E outra questão é: você precisa carregar os 14000 registros num ArrayList? Imagine a quantidade de memória que sua aplicação vai precisar. E hoje são 14000, mas e depois? Sugiro que você pense nisso.

E mais… Esta query que você está fazendo está incompleta. Você está querendo fazer um JOIN entre 3 tabelas mas não está especificando as colunas da tabela que referenciam as chaves estrangeiras e primárias. Pode ter certeza que, se você tem 14000 registros em uma das suas tabelas, a sua query está retornando MUITO mais do que isso. É como nosso amigo falou no outro post: complexidade exponencial.

Abraço

argentinaluiz

é isso ai ctosin!!!

Nader_Daher

Muito obrigado pela ajuda, o problema estava na consulta sql mesmo. :smiley:

Criado 17 de dezembro de 2009
Ultima resposta 18 de dez. de 2009
Respostas 4
Participantes 3