[RESOLVIDO]Consumo de memória aumentando durante a comunicação socket e serversocket

Boas pessoal, estou com um problema aqui e já não sei mais o que fazer.
Criei uma aplicação onde há comunicação entre um Raspberry (servidor) e vários ESP12 (clientes) utilizando socket e serversocket. Tudo funciona bem, exceto pelo aumento contínuo do consumo de memória durante a comunicação, e como o Raspberry não tem muito, com pouco tempo a aplicação começa a ficar lenta e inutilizável.
Já não sei mais o que fazer, rodei aquele visualVm mas não consegui detectar o que pode ser. Abaixo meus códigos:
Trecho da classe que inicializa o servidor:

     private class server3000 extends Thread {
            @Override
            public void run() {
                try {
                    ServerSocket serverSocket = new ServerSocket(3000);
                    while (true) {
                        Socket socket = serverSocket.accept();
                        System.out.println("Conectado a porta 3000");
                        new Servidor3000(socket).start();       
                    }
            } catch (IOException ex) {
                System.err.println("Erro: " + ex.getMessage());
            }
        }
    }

Trecho que trata o servidor:

public class Servidor3000 extends Thread {
//inicializo algumas variáveis
private Socket socket;
DataInputStream is;
DataOutputStream os;
JSONObject json;

public Servidor3000(Socket socket) throws IOException {
        this.socket = socket;
    }
    @Override
    public void run() {
        try {
            DataInputStream is;
            is = new DataInputStream(socket.getInputStream());
            DataOutputStream os;
            os = new DataOutputStream(socket.getOutputStream());
            JSONObject json;
            try (BufferedReader in = new BufferedReader(new InputStreamReader(is))) {
                PrintWriter pw = new PrintWriter(os);
                
                //trato algumas coisas

                String string = "{String json que será enviada}";
                pw.println(string);
                pw.flush();
                //Recebe
                json = new JSONObject(in.readLine());
                //Trato os dados recebidos
                pw.close();
            }
            is.close();
            os.close();
            
            json = null; //tentativa desesperada
            System.gc(); //  

        } catch (IOException e) {
            e.printStackTrace();

        } catch (JSONException ex) {
            Logger.getLogger(Servidor3000.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}

Alguém poderia me ajudar?

O problema não parece ser nessas duas classes.
Tem como postar todas as classes envolvidas?

1 curtida

Boas!
o sistema monitora vários equipamentos e eu achei como solução guardar o mac desses em um arquivo de configuração externo, um .txt. quando eu preciso cadastrar um equipamento utilizo o seguinte método:

private void registerDevice(String mac) {
        Dns dns = new Dns();
        try {
            if (dns.trataDns(mac, "B" + boxSelecionado)) {
                JOptionPane.showMessageDialog(null, "VÁLVULA JÁ CADASTRADA NO BOX " + boxCadastrado + "!", "FALHA", 0);
            } else {
                JOptionPane.showMessageDialog(null, "Válvula cadastrada com sucesso!", "Sucesso", 1);
                try {
                    Thread.sleep(100);
                } catch (InterruptedException ex) {
                    Logger.getLogger(Servidor3000.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        } catch (IOException ex) {
            Logger.getLogger(Servidor3000.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

Todas as vezes que eu recebo uma comunicação eu checo neste arquivo quem é o dispositivo.

 public String idBox(String mac) {
        String box = "NaN";
        Properties prop = new Properties();
        try {
            prop.load(new FileInputStream(pathDnsTxt));

            for (int i = 1; i <= 20; i++) {
                if (prop.getProperty("B" + i).equalsIgnoreCase(mac)) {
                    box = "Box" + i;
                    break;
                }
            }
        } catch (FileNotFoundException ex) {
            System.out.println("Arquivo não encontrado");
        } catch (IOException ex) {
            System.out.println("Erro ao gravar o arquivo");
        }
        return box;
    }

e, durante o cadastro, para checar se o dispositivo já está cadastrado eu uso o método abaixo. (dei uma enxugada para não ficar muito extenso)

 public boolean trataDns(String mac, String boxSelecionado) throws IOException {
        boolean macDuplicado = false;
        Properties prop = new Properties();

        String boxes[] = readDNS();

        for (int i = 0; i < boxes.length; i++) {

            if (mac.equals(boxes[i])) {
                macDuplicado = true;
                break;
            }
        }
        if (!macDuplicado) {
           //crio variáveis para tratar os macs

            switch (boxSelecionado) {
                case "B1":
                    //alimento as variáveis
                    break;
            }
            prop.setProperty("B1", b1);
            //Alimenta todas as variáveis
            try {
                prop.store(new FileOutputStream(pathDnsTxt),null);
            } catch (FileNotFoundException ex) {
                System.out.println("Arquivo não encontrado");

            } catch (IOException ex) {
                System.out.println("Erro ao gravar o arquivo");
            }
        }
        return macDuplicado;
    }

public String[] readDNS() throws FileNotFoundException, IOException {
        String boxes[] = new String[21];
        Properties prop = new Properties();
        try {
            prop.load(new FileInputStream(pathDnsTxt));

            if (prop.getProperty("ultimoDispCadastrado").isEmpty()) {
                boxes[20] = "Não há";
            } else {
                boxes[20] = prop.getProperty("ultimoDispCadastrado");
            }

            for (int i = 1; i <= 20; i++) {
                if (prop.getProperty("B" + i).isEmpty()) {
                    boxes[i - 1] = "Vazio";
                } else {
                    boxes[i - 1] = prop.getProperty("B" + i);
                }
            }
        } catch (FileNotFoundException ex) {
            System.out.println("Arquivo não encontrado");
        } catch (IOException ex) {
            System.out.println("Erro ao gravar o arquivo");

        }
        return boxes;
    }

Obrigado, por enquanto!

Boas,
problema resolvido!
eu fazia uma consulta a um arquivo de configuração externo durante a comunicação. Mudei o fluxo, agora eu carrego um array com as informações do arquivo, ou seja, só consulto este arquivo no start da aplicação.

1 curtida