Toon posts:

[.Net] Remoting; memory leak?!

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik ben ff wezen stoeien met Remoting. En nu heb ik het gevoel dat er wat geheugen wegsijpelt tijdens het gebruik van een remoting applicatie.

Het gaat om de volgende situatie:
Ik heb
-een Remoting Server
-een Remoting object
-een Remoting Client

De server wordt gestart, en met de task-manager kijk ik hoeveel geheugen hij inneemt. Dit ligt zo rond de 10500K. Vervolgens start ik een aantal keer een Client, die gebruik maakt van de reeds gestarte server, en het geheugengebruik van de server neemt toe, met iedere Client die opgestart wordt. Gelukkig is dat wel minimaal; misschien nog niet eens 1K per client die wordt gestart, maar dit impliceert wel, mijns inziens, dat ik geen 24/7 beschikbaarheid kan garanderen, omdat uiteindelijk het geheugen van de server volloopt, en hij dus herstart moet worden.
Overigens ben ik op de hoogte van de Garbage Collector in .Net. Daarom heb ik de server ook een nacht aan laten staan zonder dat er een client geconnect was. Het geheugengebruik van de server nam echter niet af.

Dus, doe ik iets fout? Maak ik me zorgen om niets? Of is er echt iets aan de hand waar wel degelijk rekening gehouden mee moet worden.

Voor de geinteresseerden nog even de simpele code, zodat iedereen het kan proberen:


Server
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;

namespace CodeGuru.Remoting
{
    /// <remarks>
    /// Sample server to demonstrate the use of .NET Remoting.
    /// </remarks>
    public class SampleServer
    {
        public static int Main(string [] args) 
        {
            // Create an instance of a channel
            TcpChannel channel = new TcpChannel(8080);
            ChannelServices.RegisterChannel(channel);
   
            // Register as an available service with the name HelloWorld
            RemotingConfiguration.RegisterWellKnownServiceType( 
                typeof(SampleObject), 
                "HelloWorld", 
                WellKnownObjectMode.SingleCall );

            System.Console.WriteLine("Press the enter key to exit...");
            System.Console.ReadLine();
            return 0;
        }

    }
}



Serverbject
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;

namespace CodeGuru.Remoting
{
    /// <remarks>
    /// Sample object to demonstrate the use of .NET Remoting.
    /// </remarks>
    public class SampleObject : MarshalByRefObject 
    {
        /// <summary>
        /// Constructor
        /// </summary> 
        public SampleObject()
        {
        }

        /// <summary>
        /// Return a hello message
        /// </summary>
        /// <returns>Hello world message</returns>
        public string HelloWorld()
        {
            return "Hello World!";
        }
    }
}



Client
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;

namespace CodeGuru.Remoting
{
    /// <remarks>
    /// Sample client to demonstrate the use of .NET Remoting.
    /// </remarks>
    public class SampleClient
    {
        public static int Main(string [] args)
        {
            // Create a channel for communicating w/ the remote object
            // Notice no port is specified on the client
            TcpChannel chan = new TcpChannel();
            ChannelServices.RegisterChannel(chan);

            // Create an instance of the remote object
            SampleObject obj = (SampleObject) Activator.GetObject( 
                typeof(CodeGuru.Remoting.SampleObject),
                "tcp://localhost:8080/HelloWorld" );

            // Use the object
            if( obj.Equals(null) )
            {
                System.Console.WriteLine("Error: unable to locate server");
            }
            else
            {
                Console.WriteLine(obj.HelloWorld());
            }
            return 0;
        } 
    }
}



Vanuit de server en de client moet er een reference worden gemaakt naar System.Runtime.Remoting en naar het ServerObject.

  • Orphix
  • Registratie: Februari 2000
  • Niet online
Het is mij niet helemaal duidelijk of je je applicatie echt al gestresstest hebt?
De garbage collector zal pas in werking treden wanneer het zelf vindt dat het geheugen buiten proporties is vergeleken met het systeem. Dit kan best pas bij een geheugen verbruik van 20 MB zijn, of later.
Wat gebeurt er als je een paar honderd (of duizend) keer achter elkaar je client opstart?

  • EfBe
  • Registratie: Januari 2000
  • Niet online
En als je boven 'return 0;' in de client zet: obj.Dispose(); en daaronder: obj = null; ?

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


Verwijderd

Topicstarter
Goede opmerkingen!

Enkele honderde keren is de client wel opgestart, maar het gehuegengebruik is bij lange na nog niet tot kritieke hoogtes gestegen. Ik zal binnenkort eens kijken wat er gebeurt dan.

En die 2 regels code komen er ook nog in. Ik ben benieuwd wat voor effect ze hebben.