Duvidas sobre sistema desenvolvido em Java

Ola a todos.

Sou estudante de Engenharia em Informatica (2do ano), e tenho 19 anos. Sou novo aqui, e tenho uma serie de duvidas a respeito de Java! Desde ja agradeco a quem se dispor a ler todo o topico.

Atualmente estou finalizando meu sistema de vendas completo (ou quase) em java.
Meu sistema esta dividido resumidamente em tres partes:

1- Classes de Variaveis: Contem a declaracao de variaveis e de getters e setters para armazenar informacoes que serao compartilhadas entre os formularios e as classes de funcoes que se comunicam com as tabelas da base de dados.

2- Classes de Funcoes: Contem todas as funcoes mediante metodos para realizar as diversas funcoes na base de dados… Insertar, Modificar, Eliminar, Alem de diversos tipos de Selects. (Apenas chamo procedimentos armazenados que defini anteriormente na base de dados).

3- Classes de Apresentacao: Contem todos os formularios que entrarao em contato com o cliente.

Obviamente, tambem tenho uma base de dados com todas as tabelas correspondentes e os dados.

O sistema eh um sistema de vendas normal, onde seleciono os produtos, o cliente, e emito a nota fiscal e o comprovante de pago, alem de conter uma serie de funcoes, como vendas a prazo, relatorio, cadastro de produtos, cadastro de clientes, gerador estadistico de vendas por mes, registro de vendas por data, quantidade vendida, e todos os detalhes de cada venda.

O problema vem agora: Quanto mais vou aprofundando as funcoes do sistema, mais vou me complicando. Nos primeiros testes, percebi que o sistema estava lento e tambem consumindo muita memoria RAM… (125mbs aproximadamente ao executar, esse numero vai subindo de acordo ao aumento de vendas).
Pesquisei sobre Memory Leaks, Heap, etc. e percebi que estava criando muitos objetos, entao comecei a transformar varios metodos e classes com atributos estaticos e comecei a usa-los diretamente desde suas classes sem ter que “Criar” novos objetos, mas isso fez com que no final das contas eu mudasse todas as Classes de Variaveis e metodos a variaveis e metodos totalmente estaticos, e percebi que no final das contas meu sistema praticamente nao usa mais a Orientacao a Objetos. Cada vez estou me complicando mais, e cada vez que eu implemento uma nova parte em meu sistema, fico com uma serie de duvidas…

“Sera que devo fazer esse metodo estatico ou nao?”
“Sera que essas variaveis vao ser estaticas? Acho que sim, porque ai o sistema nao vai ter que “sofrer” tanto para instanciar um novo objeto”
"Sera que as variaveis e objetos que sao criados dentro de um metodo estatico sao excluidos da memoria RAM apos o sistema executar esse metodo? Se sim, acontece o mesmo com metodos que nao sao estaticos?
“Qual a melhor medida a se utilizar em termos de programacao em Java para um sistema fazer o uso mais eficiente possivel da memoria RAM?”

Em resumo, meu sistema tem muitas funcoes, mas internamente esta baguncado, e gostaria muito da ajuda de voces com dicas, conselhos, e respostas a essas minhas questoes, e tambem se eh um bom caminho comecar a vida de programador desenvolvendo um sistema completo (na tentativa e improviso).

Desculpem pela falta de acentuacao, teclado com configuracoes de outro pais. Grato por qualquer resposta. Um abraco!

Cara, pelo que estou vendo, o que faltou foi organização no projeto. Se você tem apenas três classes, não estava usando, por exemplo, herança.

Cria umas classes modelo, onde você, ao invés de instanciar vários objetos, vai precisar criar apenas a classe modelo e usá-la. E sim, instanciar vários objetos pode dar uma treta forte no teu sistema. Não use muito static, não faz sentido.

Atualmente, dependendo do projeto, não uso mais Java, estou usando FreePascal (Delphi), no CodeTyphon. Mas algumas aplicações mais direcionadas, mais específicas, eu uso Java.

No mais, organiza melhor tuas classes, coloca teu projeto no papel antes de seguir para a programação. Se tiver tabelas, modela direitinho, sem exagerar no espaço, pra não exagerar na programação. Usa os tipos primitivos corretos, etc.

Esse tipo de coisa faz a diferença em Java.

(respostas abandonadas pelo autor, serão removidas automaticamente em 24 horas a exceto se forem sinalizadas)

Chaybelucas,

Muito obrigado pela sua resposta!
Gostaria de ter mais detalhes sobre o que voce escreveu.
Na verdade, meu sistema esta dividido em tres categorias, cada categoria possui varias classes.
Por exemplo, na categoria “Classes de Variaveis”, tenho as classes:
vcliente, vvenda, vproduto, vfatura e assim por diante! cada classe corresponde a uma tabela da base de dados e faz as operacoes exclusivamente com elas.
na categoria “Classes de Funcoes” possuo as classes:
fcliente, fvenda, fproduto, ffatura, etc.
Cada classe tem as funcoes exclusivas para interagir com as tabelas da base de dados, pelo que ter uma classe modelo poderia ser uma opcao, porem, como aplica-la ao meu projeto?
Teria como dar um exemplo? Grato!!!

Bom, não tenho como dar um exemplo no momento
Mas basicamente, é criar uma classe Pai, que vai ter todos os métodos que serão necessários na classe filho. Exemplo, pegar todos os TextField de um Panel e inserir no banco de dados. Pra fazer isso, o nome do TextField poderia ser, por exemplo, o mesmo nome da coluna da table. Aí voce só precisaria pegar os TextField do teu Panel (ou contentPane, seja lá onde esteja colocando as caixas de texto) e botar em um loop.

while (contador != quantidadeTextFieldNoPanel) {
  insert into suaTabela(nomecoluna) values(seuTextField.getName());
}

Enquanto o contador for diferente da quantidade de TextField no Panel, ce vai inserir registros lá no banco. Claro, não só inserir, tem que adaptar isso aí. Se não me engano, é o Hibernate que pode te ajudar nisso.

Enfim
Fora isso, verifica também se algumas coisas dá pra fazer no banco ao invés de fazer no código. Filtros, contas (soma, divisão, etc), vê se dá pra otimizar o código

Verifica threads, se não estão fazendo alguma coisa pesada, diminui código.
Tem um monte de coisa que dá pra verificar :wink:

Infelizmente não tenho prática com esse seu tipo de sistema, do contrário, eu poderia ajudar mais

Tenta usar suas telas com singleton. Dessa forma você usa a mesma instâcia das telas.

você define um atributo do tipo tela, depois cria um metodo que irá verificar se aquela tela já contém uma instância. Assim você evita criar várias instâncias desnecessárias para a mesma tela.

private static Tela tela;

public static Tela getInstance() {
    if (tela == null) {
        tela = new Tela();
    }
     return tela;
}

Abraço!

Lucas_Hoffmann manda teu e-mail, eu tenho um projeto pequeno em swing que pode te ajudar. Eu posso enviar pra você!

Muito obrigado flp_felipe! Eu agradeco muito a ajuda! aqui vai meu e-mail: lucashoffmann9@gmail.com

Muito obrigado flp_felipe! Eu agradeco muito a ajuda! aqui vai meu e-mail: lucashoffmann9@gmail.com

Ola Lucas

Com certeza seu arquitetura não esta boa. Uma solução bem arquitetura não gasta tudo isso não…ainda mais desktop que gasta 1 RAM por instalação. Com certeza faltou organização, patterns e boas praticas…tando de OO quanto de bando de dados. Inclusive essa separação que vc citou, pelo que parece não é organização OOP.

Segue ai um exemplo para vc poder ter um comparativo: Tenho uma solução Java web, 8/8, 10 mil usuários, 1 mil usuários por minuto, 1 linux, com 2GB RAM de JVM rodando tranquilo!

Se interessar, eu ensino boa parte de arquitetura nesse curso. Estou a disposição…
https://for-j.myedools.com/aqt-m1-introducao-a-arquitetura-de-software-com-java