High memory consumption Swing Java application

4

I'm developing a Java application, but when I run some tests, I noticed that when I run the application, my memory consumption increases. And according to usage, it always allocates more and more memory. It does not happen to drop the memory used between the interval of an application with another.

And as I'm using the application, it works until a machine overflow occurs.

When running the project using the Netbeans Profile tool, I noticed that with each request to the database, it opens a pool-thread and it gets stuck. Apparently this seems to be increasing my consumption.

I'd like to know where I can start checking to improve the performance of my application.

I'll post the product registration process code below so that you can analyze more accurately:

persistence.xml

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" 
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
         xsi:schemaLocation="http://java.sun.com/xml/ns/persistence  
                            http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
    <persistence-unit name="SisPU" transaction-type="RESOURCE_LOCAL">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <class>br.com.Sis.modelo.Funcionario</class>
    <class>br.com.Sis.modelo.Pessoa</class>
    <class>br.com.Sis.modelo.Grupo</class>
    <class>br.com.Sis.modelo.Subgrupo</class>
    <class>br.com.Sis.modelo.Produto</class>
    <class>br.com.Sis.modelo.Ncm</class>
    <class>br.com.Sis.modelo.Tributacao</class>
    <class>br.com.Sis.modelo.Fornecedor</class>
    <properties>
      <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/Sis?zeroDateTimeBehavior=convertToNull"/>
      <property name="javax.persistence.jdbc.password" value="root"/>
      <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
      <property name="javax.persistence.jdbc.user" value="1234"/>
      <property name="hibernate.cache.provider_class" value="org.hibernate.cache.NoCacheProvider"/>
      <property name="hibernate.hbm2ddl.auto" value="update"/>
    </properties>
  </persistence-unit>
</persistence>

ConnectionJPA.java

public class ConexaoJPA {

    public static EntityManager getEntityManager(){

        EntityManagerFactory emf = Persistence.createEntityManagerFactory("SisPU");
        EntityManager em = emf.createEntityManager();
        return em;   
    }
}

ProductDAO.java

public class ProdutoDAO implements Serializable {

    public EntityManager getEntityManager() {
        return ConexaoJPA.getEntityManager();
    }

    public void create(Produto produto) {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            em.persist(produto);
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }
}

Product Control.java

public class ProdutoControle {

    public void inserir(int codgrupo, int codsubgrupo, int codtribut, String codbarras, int codfornecedor, String nomeproduto, String descproduto,
                     String unicomproduto, String univendproduto,  String nomFornecedor, double qtdproduto, double qtdextproduto, double qtdemaxproduto,
                     double qtdeminproduto, double custoproduto, double valvendaproduto, double margproduto, String localproduto,
                     String tipoproduto, String finproduto, int dia_validproduto, String obsproduto, double codibptnac, double codibptimp) throws Exception {


        Produto produto = new Produto();

        produto.setCodgrupo(codgrupo);
        produto.setCodsubgrupo(codsubgrupo);
        produto.setCodtributacao(codtribut);
        produto.setCodBarproduto(codbarras);
        produto.setCodfornecedor(codfornecedor);
        produto.setNomproduto(nomeproduto);
        produto.setNomIdeproduto(descproduto);
        produto.setUniComproduto(unicomproduto);
        produto.setUniVenproduto(univendproduto);
        produto.setNomfornecedor(nomFornecedor);
        produto.setQtdproduto(BigDecimal.valueOf(qtdproduto));
        produto.setQtdExtproduto(BigDecimal.valueOf(qtdextproduto));
        produto.setQtdMaxproduto(BigDecimal.valueOf(qtdemaxproduto));
        produto.setQtdMinproduto(BigDecimal.valueOf(qtdeminproduto));
        produto.setValCusproduto(BigDecimal.valueOf(custoproduto));
        produto.setValVenproduto(BigDecimal.valueOf(valvendaproduto));
        produto.setMarLucproduto(BigDecimal.valueOf(margproduto));
        produto.setLocproduto(localproduto);
        produto.setTipproduto(tipoproduto);
        produto.setFinproduto(finproduto);
        produto.setDiaValproduto(dia_validproduto);
        produto.setObsproduto(obsproduto);
        produto.setCodibptnac(BigDecimal.valueOf(codibptnac));
        produto.setCodibptimp(BigDecimal.valueOf(codibptimp));


        new ProdutoDAO().create(produto);



    }
}

I also have the class in which I mapped the database fields that have my getters and setters and the visual, where I capture the data entered by the user.

    
asked by anonymous 14.04.2015 / 21:08

1 answer

5

Your main problem seems to be in ConexaoJPA :

public class ConexaoJPA {

    public static EntityManager getEntityManager(){

        EntityManagerFactory emf = Persistence.createEntityManagerFactory("SisPU");
        EntityManager em = emf.createEntityManager();
        return em;   
    }
}

You are using EntityManagerFactory and EntityManager in somewhat inadequate ways. The EntityManager even does not have much problem, because you close it properly, only fails to reuse it when possible. But that should not cause you any major problems.

The biggest problem is EntityManagerFactory . You should not create multiple instances of EntityManagerFactory . Only one that lives throughout the scope of the application should be required.

The simplest solution would be this:

public class ConexaoJPA {

    private static final EntityManagerFactory EMF = Persistence.createEntityManagerFactory("SisPU");

    public static EntityManager getEntityManager() {
        EntityManager em = EMF.createEntityManager();
        return em;   
    }
}

Related: link

    
14.04.2015 / 21:24