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
Serverbject
Client
Vanuit de server en de client moet er een reference worden gemaakt naar System.Runtime.Remoting en naar het ServerObject.
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.