Re: GC and active sockets, and Pinned Memory

Tech-Archive recommends: Repair Windows Errors & Optimize Windows Performance



That was exactly my point; once an object goes out of scope and effectively
is unreachable through any means available to developer, the only reference
point to that object is a blocking IOCP thread.

I agree that from pure system's point of view everything works properly,
reference A goes away but reference B is still there. From development stand
point of view, however, once i place something into IOCP pool there is no way
for me to signal interrupt therefore, there is a logical assumption that if i
remove all references to the object and the only one remains is IOCP
reference, it should get garbage collected. Granted, leaving objects out of
scope without clean up is bad programming habbit as is, but isn't garbage
collection supposed to protect against those type of mistakes?

I think:
( no refernce = garbage) equally (no reference = there is no way for a
developer to access an object) and therefore (no way for a developer to
access an object = garbage)

Whether it is an adjustment to GC or adjustment to IOCP implementation (give
me an ability to get BeginXXX operation out of wait state) is question
someone in Microsoft (in my opinion) needs to ask and answer.




"Willy Denoyette [MVP]" wrote:

>
> "Arthur M." <ArthurM@xxxxxxxxxxxxxxxxxxxxxxxxx> wrote in message
> news:58AAC4AA-ED30-4F5C-B341-84F95120F024@xxxxxxxxxxxxxxxx
> > In my specific case there is a socket server listenting on port 1111, you
> > can
> > use anything that accepts a connection.
> >
> > Note that function openConnections() never really closes a tcp client, but
> > instead lets them go out of scope.
> >
> > Granted in true production environment this should never happen, however,
> > garbage collection should prevent exactly that - memory/resource leak.
> >
> > My original code involves working directly with sockets, to ensure it is
> > not
> > my mistake, I have reproduced it with .NETs internal TCPClient hence no
> > try/catch no watches for shutdowns and buffers that are thrown away
> >
> > Garbage collection timer is there to ensure garbage collection is forced
> > to
> > run.
> >
> > Code Below:
> >
> >
> > static void openConnections()
> > {
> > for ( int op_counter = 0; op_counter < 30; op_counter++ )
> > {
> > System.Net.Sockets.TcpClient pt = new
> > System.Net.Sockets.TcpClient();
> > Singularity.Communication.Client(System.Net.IPAddress.Any, 0,
> > System.Net.IPAddress.Loopback, 1111);
> > pt.Connect(new
> > System.Net.IPEndPoint(System.Net.IPAddress.Loopback, 1111));
> > System.Net.Sockets.NetworkStream ns = pt.GetStream();
> > ns.BeginRead(new byte[100], 1, 0, rcvd, ns);
> >
> > }
> > }
> >
> > static void rcvd(IAsyncResult ar)
> > {
> > ((System.Net.Sockets.NetworkStream)
> > (ar.AsyncState)).EndRead(ar);
> > ( (System.Net.Sockets.NetworkStream) ( ar.AsyncState )
> > ).BeginRead(new byte[100], 1, 0, rcvd, (
> > (System.Net.Sockets.NetworkStream) (
> > ar.AsyncState ) ));
> > }
> >
> > static Timer tmr = new Timer();
> >
> > static void Main()
> > {
> > tmr.Interval = 1000;
> > tmr.Enabled = true;
> > tmr.Start();
> > tmr.Tick += new EventHandler(tmr_Tick);
> > //f.Show();
> > //f.FormClosed += new FormClosedEventHandler(f_FormClosed);
> > //f = null;
> > openConnections();
> > Application.Run();
> > }
> >
> > static void tmr_Tick(object sender, EventArgs e)
> > {
> > Console.WriteLine("Collecting");
> > tmr.Stop();
> > GC.Collect();
> > GC.WaitForPendingFinalizers();
> > tmr.Start();
> > }
> >
> >
>
>
> While ns goes out of scope in openConnections it is passed to BeginRead :
> ....
> ns.BeginRead(new byte[100], 1, 0, rcvd, ns);
>
> as argument and used in rcvd, so you keep a reference to your NetworkStream
> (ns) the wrapped TcpClient (tp) and his underlying socket.
> What would you expect from the GC to free here?
>
> Willy.
>
>
>
>
>
>
.



Relevant Pages

  • Re: general performance question
    ... (It seems to me that the JVM should be free to null out the reference once it goes out of scope, or even if it's in scope but flow analysis makes it clear that it can't be used any more, but that was a minority opinion.) ... If you create an Object in a loop and then reassign another Object to the same reference in the loop, the first Object is eligible for garbage collection. ...
    (comp.lang.java.programmer)
  • Re: argument returning
    ... because there is still a live reference to it. ... long as the variable is in scope, ... The object will only be eligible for garbage collection ... Matt Humphrey matth@xxxxxxxxxxxxxx http://www.iviz.com/ ...
    (comp.lang.java.programmer)
  • Re: GC and active sockets, and Pinned Memory
    ... Objects don't go out of scope, references do go out of scope. ... Your local references go out of scope, but as YOU passed a NetworkStream ... thread pool which stores the NetworkStream reference for later use, ... >>> Garbage collection timer is there to ensure garbage collection is ...
    (microsoft.public.dotnet.framework)
  • Re: Garbage Collection - dim x as y versus dim x as new y
    ... thank you michel. ... > Well if the object goes out of scope it will automaticly be released ... >> with respect to garbage collection. ... >> it isn't so much HOW an object reference ) ...
    (microsoft.public.dotnet.languages.vb)
  • Re: vbs output to txt file
    ... the reference count to that object will be decremented. ... As does going out of scope:) ... You are religiously setting objects to nothing and not ... and so am seriously lacking in both scripting expertise ...
    (microsoft.public.scripting.wsh)