Try to do
private static class Read extends Thread { private static Socket socket; private static String address;
and
private static class Write extends Thread { private static Socket socket;
for non-static.
Also, I donβt know how you check the memory, but remember that Java collected the garbage and you will see an increase in memory usage initially until the garbage collector (GC) collects it and increases until the next start of the GC. Thus, it constantly increases without any fall for a long time, only then there is a memory leak, otherwise you will go well.
I ran the above code as is and worked for about 1-2 hours, and this is about 54 MB of constant memory usage on a Mac using JDK 6. I do not use the JConsole that comes with jdk to view memory usage. I did not find any problems.
Below is a graph, as I mentioned in mine as well, you have a peak and dipping. In the end, when I stopped the client, it is flat. 
source share