OVH Cloud OVH Cloud

Pb de mémoire

15 réponses
Avatar
Faure-vincent Pascal
Bonjours j'ai un petit souci d'utilisation de la mémoire sous .net.

J'ai un service NT qui expose des service métiers ( sans état) . ces objets
métiers sont des singletons dans le service NT. Lorsque j'utilise ces objets
sur un client par remoting . La mémoire du service NT augmente a chaque
appelle de méthode. j'ai beau faire une méthode avec un garbage collector
dedans çà ne fait rien. Et au bout d'un certain nombre d'appelle de méthode
par remoting la mémoire est saturée. si quelqu'un pouvait m'indiquer une
piste à suivre pour résoudre ce prblème çà serait avec plaisir.
Pascal

10 réponses

1 2
Avatar
Eric Mittelette[MS\)
Salut,

Plusieurs pistes à explorer:
Quel sont les objets utilisé dans ton singleton, y aurait il des phase
d'interop, d'appel a des objets COM ? auquel cas il faut vérifier les
dispose...
Le singleton est en client activated ou server activated, si c'est le
premier cas, comment ezst il libéré ?

ERic
"Faure-vincent Pascal" wrote in message
news:%
Bonjours j'ai un petit souci d'utilisation de la mémoire sous .net.

J'ai un service NT qui expose des service métiers ( sans état) . ces


objets
métiers sont des singletons dans le service NT. Lorsque j'utilise ces


objets
sur un client par remoting . La mémoire du service NT augmente a chaque
appelle de méthode. j'ai beau faire une méthode avec un garbage collector
dedans çà ne fait rien. Et au bout d'un certain nombre d'appelle de


méthode
par remoting la mémoire est saturée. si quelqu'un pouvait m'indiquer une
piste à suivre pour résoudre ce prblème çà serait avec plaisir.
Pascal





Avatar
Faure-vincent Pascal
Non il n'y a pas d'interop. C'est uniquement du code managé. Le singleton
est activé dans la service NT ( donc server activated).
Ces objets dans le service NT appellent une couche d'accès aux données->
sqlserveur 2000. Cette couche DAL est hébergée dans le même service.
pascal



"Eric Mittelette[MS)" a écrit dans le message de
news:eYweZ$
Salut,

Plusieurs pistes à explorer:
Quel sont les objets utilisé dans ton singleton, y aurait il des phase
d'interop, d'appel a des objets COM ? auquel cas il faut vérifier les
dispose...
Le singleton est en client activated ou server activated, si c'est le
premier cas, comment ezst il libéré ?

ERic
"Faure-vincent Pascal" wrote in


message
news:%
> Bonjours j'ai un petit souci d'utilisation de la mémoire sous .net.
>
> J'ai un service NT qui expose des service métiers ( sans état) . ces
objets
> métiers sont des singletons dans le service NT. Lorsque j'utilise ces
objets
> sur un client par remoting . La mémoire du service NT augmente a chaque
> appelle de méthode. j'ai beau faire une méthode avec un garbage


collector
> dedans çà ne fait rien. Et au bout d'un certain nombre d'appelle de
méthode
> par remoting la mémoire est saturée. si quelqu'un pouvait m'indiquer une
> piste à suivre pour résoudre ce prblème çà serait avec plaisir.
> Pascal
>
>
>




Avatar
Faure-vincent Pascal
J'ai l'impression de le garbage ne ce fait pas quand il y a du remoting .
C'est bizzard

"Faure-vincent Pascal" a écrit dans le
message de news:
Non il n'y a pas d'interop. C'est uniquement du code managé. Le singleton
est activé dans la service NT ( donc server activated).
Ces objets dans le service NT appellent une couche d'accès aux données->
sqlserveur 2000. Cette couche DAL est hébergée dans le même service.
pascal



"Eric Mittelette[MS)" a écrit dans le message de
news:eYweZ$
> Salut,
>
> Plusieurs pistes à explorer:
> Quel sont les objets utilisé dans ton singleton, y aurait il des


phase
> d'interop, d'appel a des objets COM ? auquel cas il faut vérifier les
> dispose...
> Le singleton est en client activated ou server activated, si c'est


le
> premier cas, comment ezst il libéré ?
>
> ERic
> "Faure-vincent Pascal" wrote in
message
> news:%
> > Bonjours j'ai un petit souci d'utilisation de la mémoire sous .net.
> >
> > J'ai un service NT qui expose des service métiers ( sans état) . ces
> objets
> > métiers sont des singletons dans le service NT. Lorsque j'utilise ces
> objets
> > sur un client par remoting . La mémoire du service NT augmente a


chaque
> > appelle de méthode. j'ai beau faire une méthode avec un garbage
collector
> > dedans çà ne fait rien. Et au bout d'un certain nombre d'appelle de
> méthode
> > par remoting la mémoire est saturée. si quelqu'un pouvait m'indiquer


une
> > piste à suivre pour résoudre ce prblème çà serait avec plaisir.
> > Pascal
> >
> >
> >
>
>




Avatar
Frederic Melantois
Bonjour,

Vous dites "ces objets" mais si vous êtes en mode singleton, un seul objet
est intancié.

En mode singleton, il faut gérer les accès concurrents.

Pouvez-vous nous donner plus de détails sur votre code ?

Frédéric Mélantois


"Faure-vincent Pascal" a écrit dans le
message de news:u$
J'ai l'impression de le garbage ne ce fait pas quand il y a du remoting .
C'est bizzard

"Faure-vincent Pascal" a écrit dans


le
message de news:
> Non il n'y a pas d'interop. C'est uniquement du code managé. Le


singleton
> est activé dans la service NT ( donc server activated).
> Ces objets dans le service NT appellent une couche d'accès aux données->
> sqlserveur 2000. Cette couche DAL est hébergée dans le même service.
> pascal
>
>
>
> "Eric Mittelette[MS)" a écrit dans le message


de
> news:eYweZ$
> > Salut,
> >
> > Plusieurs pistes à explorer:
> > Quel sont les objets utilisé dans ton singleton, y aurait il des
phase
> > d'interop, d'appel a des objets COM ? auquel cas il faut vérifier les
> > dispose...
> > Le singleton est en client activated ou server activated, si c'est
le
> > premier cas, comment ezst il libéré ?
> >
> > ERic
> > "Faure-vincent Pascal" wrote in
> message
> > news:%
> > > Bonjours j'ai un petit souci d'utilisation de la mémoire sous .net.
> > >
> > > J'ai un service NT qui expose des service métiers ( sans état) . ces
> > objets
> > > métiers sont des singletons dans le service NT. Lorsque j'utilise


ces
> > objets
> > > sur un client par remoting . La mémoire du service NT augmente a
chaque
> > > appelle de méthode. j'ai beau faire une méthode avec un garbage
> collector
> > > dedans çà ne fait rien. Et au bout d'un certain nombre d'appelle de
> > méthode
> > > par remoting la mémoire est saturée. si quelqu'un pouvait m'indiquer
une
> > > piste à suivre pour résoudre ce prblème çà serait avec plaisir.
> > > Pascal
> > >
> > >
> > >
> >
> >
>
>




Avatar
Faure-vincent Pascal
Je dit :"Ces objets" car j'ai plusieurs classes qui sont en remoting sur mon
service NT ( c'est tout)
J'ai fait un petit exemple et c'est pareil.
un server.exe et un client.exe.
Le serveur a une méthode :Essai qui instancie une classe:Model ( un nombre
important de fois) qui a un destructeur (Finalize) pour afficher sur la
console un message.
Le serveur a également une méthode GC qui fait GC.collect.

le client appelle essai sur le serveur et GC.

la mémoire du processus du serveur augmente considérablement a chaque
appelle de la méthode essai et le finalize de MODEL n'est jamais effectué.
on fait le même programme sans le remoting et le finalize se fait alors je
comprends rien.
======================================== le serveur:
========================================= using System;
using System.Threading;
using System.Runtime.Remoting;
namespace Serveur
{
/// <summary>
/// Description résumée de Class1.
/// </summary>
class Serveur:ServeurInterface
{
/// <summary>
/// Point d'entrée principal de l'application.
/// </summary>
[STAThread]
static void Main(string[] args)
{
Serveur s=new Serveur();
RemotingConfiguration.Configure("Serveur.exe.config");
RemotingServices.Marshal(s, "serveur_uri");
Console.WriteLine("Pause");
Console.ReadLine();
}
public override void Essai()
{
Model e;
int i=0;
while (i<100000)
{
e=new Model();
i++;
}
}
public override void Gc()
{
GC.Collect();
}
}
}

======================================== le client:
========================================= using System;
using Serveur;
using System.Runtime.Remoting;
namespace Client
{
/// <summary>
/// Description résumée de Class1.
/// </summary>
class Client
{
/// <summary>
/// Point d'entrée principal de l'application.
/// </summary>
[STAThread]
static void Main(string[] args)
{
RemotingConfiguration.Configure("Client.exe.config");
ServeurInterface s=new ServeurInterface();
s.Essai();
Console.WriteLine("Pause");
Console.ReadLine();
Console.WriteLine("GC");
s.Gc();
Console.ReadLine();
Console.WriteLine("Pause");
Console.ReadLine();
//
// TODO : ajoutez ici le code pour démarrer l'application
//
}
}
}
======================================== le model:DATA
=========================================
using System;
namespace Serveur
{
/// <summary>
/// Description résumée de Class1.
/// </summary>
public class Model
{
public Model()
{
//
// TODO : ajoutez ici la logique du constructeur
//
}

~Model()
{
Console.WriteLine("Finalise");
}
}
}
Avatar
Faure-vincent Pascal
J'ai l'impression qu'en remoting comme il y a plusieurs thread le GC ne se
déclenche pas. Et je ne sais pas comment faire
pascal


"Frederic Melantois" a écrit dans le message
de news:cbek29$abe$
Bonjour,

Vous dites "ces objets" mais si vous êtes en mode singleton, un seul objet
est intancié.

En mode singleton, il faut gérer les accès concurrents.

Pouvez-vous nous donner plus de détails sur votre code ?

Frédéric Mélantois


"Faure-vincent Pascal" a écrit dans


le
message de news:u$
> J'ai l'impression de le garbage ne ce fait pas quand il y a du remoting


.
> C'est bizzard
>
> "Faure-vincent Pascal" a écrit dans
le
> message de news:
> > Non il n'y a pas d'interop. C'est uniquement du code managé. Le
singleton
> > est activé dans la service NT ( donc server activated).
> > Ces objets dans le service NT appellent une couche d'accès aux


données->
> > sqlserveur 2000. Cette couche DAL est hébergée dans le même service.
> > pascal
> >
> >
> >
> > "Eric Mittelette[MS)" a écrit dans le message
de
> > news:eYweZ$
> > > Salut,
> > >
> > > Plusieurs pistes à explorer:
> > > Quel sont les objets utilisé dans ton singleton, y aurait il des
> phase
> > > d'interop, d'appel a des objets COM ? auquel cas il faut vérifier


les
> > > dispose...
> > > Le singleton est en client activated ou server activated, si


c'est
> le
> > > premier cas, comment ezst il libéré ?
> > >
> > > ERic
> > > "Faure-vincent Pascal" wrote in
> > message
> > > news:%
> > > > Bonjours j'ai un petit souci d'utilisation de la mémoire sous


.net.
> > > >
> > > > J'ai un service NT qui expose des service métiers ( sans état) .


ces
> > > objets
> > > > métiers sont des singletons dans le service NT. Lorsque j'utilise
ces
> > > objets
> > > > sur un client par remoting . La mémoire du service NT augmente a
> chaque
> > > > appelle de méthode. j'ai beau faire une méthode avec un garbage
> > collector
> > > > dedans çà ne fait rien. Et au bout d'un certain nombre d'appelle


de
> > > méthode
> > > > par remoting la mémoire est saturée. si quelqu'un pouvait


m'indiquer
> une
> > > > piste à suivre pour résoudre ce prblème çà serait avec plaisir.
> > > > Pascal
> > > >
> > > >
> > > >
> > >
> > >
> >
> >
>
>




Avatar
VANNESTE Xavier
ca viens du baille qui est trop la gestion se fait par baille en remoting
afin d'eviter des temps d'activation trop long sur des appel rapproche
regarde dans l'aide l'interface ilease et
MarshalByRefObject.InitializeLifetimeService ca pourra t'aider je pense
"Faure-vincent Pascal" a écrit dans le
message de news:%
Bonjours j'ai un petit souci d'utilisation de la mémoire sous .net.

J'ai un service NT qui expose des service métiers ( sans état) . ces


objets
métiers sont des singletons dans le service NT. Lorsque j'utilise ces


objets
sur un client par remoting . La mémoire du service NT augmente a chaque
appelle de méthode. j'ai beau faire une méthode avec un garbage collector
dedans çà ne fait rien. Et au bout d'un certain nombre d'appelle de


méthode
par remoting la mémoire est saturée. si quelqu'un pouvait m'indiquer une
piste à suivre pour résoudre ce prblème çà serait avec plaisir.
Pascal





Avatar
news.microsoft;com
Mais ce n'est pas les objets que j'expose en remoting qui pose problème mais
des objets locals aux méthodes des ces objets qui ne sont pas libéré en fin
d'appels de méthodes --> Par le GC
pascal




"VANNESTE Xavier" a écrit dans le message de
news:
ca viens du baille qui est trop la gestion se fait par baille en remoting
afin d'eviter des temps d'activation trop long sur des appel rapproche
regarde dans l'aide l'interface ilease et
MarshalByRefObject.InitializeLifetimeService ca pourra t'aider je pense
"Faure-vincent Pascal" a écrit dans


le
message de news:%
> Bonjours j'ai un petit souci d'utilisation de la mémoire sous .net.
>
> J'ai un service NT qui expose des service métiers ( sans état) . ces
objets
> métiers sont des singletons dans le service NT. Lorsque j'utilise ces
objets
> sur un client par remoting . La mémoire du service NT augmente a chaque
> appelle de méthode. j'ai beau faire une méthode avec un garbage


collector
> dedans çà ne fait rien. Et au bout d'un certain nombre d'appelle de
méthode
> par remoting la mémoire est saturée. si quelqu'un pouvait m'indiquer une
> piste à suivre pour résoudre ce prblème çà serait avec plaisir.
> Pascal
>
>
>




Avatar
Frederic Melantois
Le problème n'est pas lié au remoting

Ajouter un GC.SupressFinalize dans votre boucle.

<code>
public class Model
{
private Bitmap bitm;
public Model()
{
bitm = new Bitmap(500,500);
}
~Model()
{
bitm.Dispose();
}
}
...

public override void Essai()
{
int i=0;
while (i<1000)
{
Model e=new Model();
GC.SuppressFinalize(e);
i++;
}
GC.Collect();
}

</code>

Frédéric Mélantois

ps : J'ai mis un peu de temps pour trouver ;-) surtout que j'étais parti sur
de fausses pistes. Le garbage a ses limites. Il faut bien le comprendre.
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnpag/html/scalenetchapt05.asp
un guide bien utile.

"Faure-vincent Pascal" a écrit dans le
message de news:%
J'ai l'impression qu'en remoting comme il y a plusieurs thread le GC ne se
déclenche pas. Et je ne sais pas comment faire
pascal


"Frederic Melantois" a écrit dans le message
de news:cbek29$abe$
> Bonjour,
>
> Vous dites "ces objets" mais si vous êtes en mode singleton, un seul


objet
> est intancié.
>
> En mode singleton, il faut gérer les accès concurrents.
>
> Pouvez-vous nous donner plus de détails sur votre code ?
>
> Frédéric Mélantois
>
>
> "Faure-vincent Pascal" a écrit dans
le
> message de news:u$
> > J'ai l'impression de le garbage ne ce fait pas quand il y a du


remoting
.
> > C'est bizzard
> >
> > "Faure-vincent Pascal" a écrit


dans
> le
> > message de news:
> > > Non il n'y a pas d'interop. C'est uniquement du code managé. Le
> singleton
> > > est activé dans la service NT ( donc server activated).
> > > Ces objets dans le service NT appellent une couche d'accès aux
données->
> > > sqlserveur 2000. Cette couche DAL est hébergée dans le même service.
> > > pascal
> > >
> > >
> > >
> > > "Eric Mittelette[MS)" a écrit dans le


message
> de
> > > news:eYweZ$
> > > > Salut,
> > > >
> > > > Plusieurs pistes à explorer:
> > > > Quel sont les objets utilisé dans ton singleton, y aurait il


des
> > phase
> > > > d'interop, d'appel a des objets COM ? auquel cas il faut vérifier
les
> > > > dispose...
> > > > Le singleton est en client activated ou server activated, si
c'est
> > le
> > > > premier cas, comment ezst il libéré ?
> > > >
> > > > ERic
> > > > "Faure-vincent Pascal" wrote


in
> > > message
> > > > news:%
> > > > > Bonjours j'ai un petit souci d'utilisation de la mémoire sous
.net.
> > > > >
> > > > > J'ai un service NT qui expose des service métiers ( sans état) .
ces
> > > > objets
> > > > > métiers sont des singletons dans le service NT. Lorsque


j'utilise
> ces
> > > > objets
> > > > > sur un client par remoting . La mémoire du service NT augmente a
> > chaque
> > > > > appelle de méthode. j'ai beau faire une méthode avec un garbage
> > > collector
> > > > > dedans çà ne fait rien. Et au bout d'un certain nombre d'appelle
de
> > > > méthode
> > > > > par remoting la mémoire est saturée. si quelqu'un pouvait
m'indiquer
> > une
> > > > > piste à suivre pour résoudre ce prblème çà serait avec plaisir.
> > > > > Pascal
> > > > >
> > > > >
> > > > >
> > > >
> > > >
> > >
> > >
> >
> >
>
>




Avatar
Faure-vincent Pascal
C'est sympa d'y avoir passé du temps.
En effet quand je mets le GC.SuppressFinalize(e) la mémoire n'augmente
plus.
Mais le finalize des objets ne sera pas éxécuté c'est çà ?
c'est pas bon çà quand penses-tu ?
PS
je vais lire le lien que tu m'as donné.


"Frederic Melantois" a écrit dans le message
de news:cbgjfk$v72$
Le problème n'est pas lié au remoting

Ajouter un GC.SupressFinalize dans votre boucle.

<code>
public class Model
{
private Bitmap bitm;
public Model()
{
bitm = new Bitmap(500,500);
}
~Model()
{
bitm.Dispose();
}
}
...

public override void Essai()
{
int i=0;
while (i<1000)
{
Model e=new Model();
GC.SuppressFinalize(e);
i++;
}
GC.Collect();
}

</code>

Frédéric Mélantois

ps : J'ai mis un peu de temps pour trouver ;-) surtout que j'étais parti


sur
de fausses pistes. Le garbage a ses limites. Il faut bien le comprendre.



http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnpag/html/scalenetchapt05.asp
un guide bien utile.

"Faure-vincent Pascal" a écrit dans


le
message de news:%
> J'ai l'impression qu'en remoting comme il y a plusieurs thread le GC ne


se
> déclenche pas. Et je ne sais pas comment faire
> pascal
>
>
> "Frederic Melantois" a écrit dans le


message
> de news:cbek29$abe$
> > Bonjour,
> >
> > Vous dites "ces objets" mais si vous êtes en mode singleton, un seul
objet
> > est intancié.
> >
> > En mode singleton, il faut gérer les accès concurrents.
> >
> > Pouvez-vous nous donner plus de détails sur votre code ?
> >
> > Frédéric Mélantois
> >
> >
> > "Faure-vincent Pascal" a écrit


dans
> le
> > message de news:u$
> > > J'ai l'impression de le garbage ne ce fait pas quand il y a du
remoting
> .
> > > C'est bizzard
> > >
> > > "Faure-vincent Pascal" a écrit
dans
> > le
> > > message de news:
> > > > Non il n'y a pas d'interop. C'est uniquement du code managé. Le
> > singleton
> > > > est activé dans la service NT ( donc server activated).
> > > > Ces objets dans le service NT appellent une couche d'accès aux
> données->
> > > > sqlserveur 2000. Cette couche DAL est hébergée dans le même


service.
> > > > pascal
> > > >
> > > >
> > > >
> > > > "Eric Mittelette[MS)" a écrit dans le
message
> > de
> > > > news:eYweZ$
> > > > > Salut,
> > > > >
> > > > > Plusieurs pistes à explorer:
> > > > > Quel sont les objets utilisé dans ton singleton, y aurait il
des
> > > phase
> > > > > d'interop, d'appel a des objets COM ? auquel cas il faut


vérifier
> les
> > > > > dispose...
> > > > > Le singleton est en client activated ou server activated, si
> c'est
> > > le
> > > > > premier cas, comment ezst il libéré ?
> > > > >
> > > > > ERic
> > > > > "Faure-vincent Pascal"


wrote
in
> > > > message
> > > > > news:%
> > > > > > Bonjours j'ai un petit souci d'utilisation de la mémoire sous
> .net.
> > > > > >
> > > > > > J'ai un service NT qui expose des service métiers ( sans état)


.
> ces
> > > > > objets
> > > > > > métiers sont des singletons dans le service NT. Lorsque
j'utilise
> > ces
> > > > > objets
> > > > > > sur un client par remoting . La mémoire du service NT augmente


a
> > > chaque
> > > > > > appelle de méthode. j'ai beau faire une méthode avec un


garbage
> > > > collector
> > > > > > dedans çà ne fait rien. Et au bout d'un certain nombre


d'appelle
> de
> > > > > méthode
> > > > > > par remoting la mémoire est saturée. si quelqu'un pouvait
> m'indiquer
> > > une
> > > > > > piste à suivre pour résoudre ce prblème çà serait avec


plaisir.
> > > > > > Pascal
> > > > > >
> > > > > >
> > > > > >
> > > > >
> > > > >
> > > >
> > > >
> > >
> > >
> >
> >
>
>




1 2