High memory consumption Java Swing application

Asked

Viewed 580 times

4

I am developing a Java application but when performing some tests and noticed that when running the application, my memory consumption increases. And as the use, it always allocates more and more memory. It does not happen to drop the memory used between the interval of one application with another.

And as I use the application, it works until there is a burst of memory on the part of the machine.

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

I would like to know where I can start to check to improve the performance of my application.

I will post the code of the product registration process below so 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>

Conexaojpa.java

public class ConexaoJPA {

    public static EntityManager getEntityManager(){

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

Productodao.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();
            }
        }
    }
}

Productocontrol.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 where I mapped the database fields that have my getters and setters and the visual, where I capture the data typed by the user.

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;   
    }
}

Are you using the EntityManagerFactory and the EntityManager in somewhat inadequate ways. The EntityManager until there is not much problem, because you close it properly, just fail to reuse it when possible. But that shouldn’t cause you any more trouble.

The biggest problem is EntityManagerFactory. You shouldn’t create multiple instances of EntityManagerFactory. Only one living 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: /a/45784/132

Browser other questions tagged

You are not signed in. Login or sign up in order to post.