GC closes my ServerSocket

Chris Hegarty chris.hegarty at oracle.com
Wed Jun 13 02:08:08 PDT 2012



On 13/06/2012 09:51, Alan Bateman wrote:
> On 13/06/2012 09:38, Weijun Wang wrote:
>> Hi All
>>
>> I have a test that basically looks like:
>>
>> int p = new ServerSocket(0).getLocalPort();
>> //....
>> new Socket("localhost", p);
>>
>> Recently it's failing on solaris-i586, and after some investigation, I
>> realize that the ServerSocket object is GC'ed and auto-closed.
>>
>> (But why only recently?)
>>
>> So I change the first line to
>>
>> ServerSocket ss = new ServerSocket(0);
>> int p = ss.getLocalPort();
>>
>> and it's running fine.
>>
>> I want to know if the ServerSocket object still has a chance to be
>> closed. If yes, I'll add a
>>
>> ss.close();
>>
>> at the end to be safer.
>>
>> Thanks
>> Max
> HotSpot changes I assume, perhaps changes to the reference processing or
> default heap settings.

Right, I assume there was some VM change that started this test to fail 
recently, but clearly this is a test issue. It was just passing all this 
time by accident, and there is an inherent race between the test and the 
GC/finalizer thread.

You should fix the test as you suggested. Also close the serversocket in 
a finally block ( or equivalent ). You should not rely on the finalizer 
to close it out.

-Chris.

>
> -Alan



More information about the net-dev mailing list