Se non ricordo male, ad ogni invio di messaggio dovresti chiudere la socket in maniera esplicita, (socket.close()).... stai lavorando con socket Datagram , non stabilisci una connessione tra le due shell coinvolte nella chat, quindi ogni volta ricrei la socket senza liberare le risorse che la precedente aveva occupato! Con la chiusura esplicita liberi le risorse e non dovresti avere problemi nella memoria!