2017-02-14 2 views
-2

nous avons une application Delphi assez complexe, qui utilise des assemblages .NET. Nous utilisons FastMM comme gestionnaire de mémoire.Delphi Windows Desktop App -> 513 Mo d'utilisation de la mémoire au lancement -> 32,1 Mo après 50 minutes d'état inactif

Nous avons rencontré des exceptions EOutOfMemory. J'ai donc enquêté sur ça pendant un moment maintenant. Nous soupçonnions que nous avions des références circulaires entre les objets Delphi. Ou peut-être certains objets .NET contenant des références à des objets Delphi, empêchant leur publication. Jusqu'à présent, je n'ai rien trouvé que nous pourrions changer de notre côté, ce qui est vraiment frustrant parce que, évidemment, nous avons un problème quelque part.

Mais aujourd'hui, par pur hasard, j'ai découvert quelque chose. Lorsque notre application démarre, le gestionnaire des tâches rapporte ca. 513 Mo de mémoire utilisée. Je viens de le lancer mais j'ai dû partir pour le déjeuner. Quand j'étais de retour, par hasard, j'ai remarqué que l'application utilisait maintenant seulement 75 Mo. Étrange je pensais, doit avoir écrasé ou quelque chose que je supposais. Non, pas du tout, App fonctionnait parfaitement. Qu'avais-je fait -> Rien. Laissez-le simplement tourner au ralenti. Notre application est une application de bureau Windows. Il ne se passe pas grand-chose tant que c'est dans un état inactif.

Alors j'ai alors commencé à regarder plus loin dans cela. Il est reproductible. La consommation de mémoire commence à diminuer en gros sauts au fil du temps. Après ca. 50 minutes, il avait atteint 32,1 Mo !!!

J'ai surveillé les compteurs de performance .NET Garbage Collector et il n'y a pas de gros changements. Par conséquent je suspecte que le problème soit du côté de Delphi -> qui pointe à FastMM.

Je ne suis pas un expert avec FastMM cependant. Je me suis assuré et FullDebugMode n'est pas activé. Est-ce que quelqu'un d'autre a vécu quelque chose comme ça? Avez-vous des astuces/idées sur ce qui pourrait être mal configuré dans FastMM?

Merci un million !!

+0

@DavidHeffernan Vous semblez avoir beaucoup d'expérience concernant les gestionnaires Delphi-Memory. :-). Je serais très reconnaissant si vous pouviez commenter si vous avez eu une expérience similaire. THX! – santiagoIT

+4

Vous ne pouvez pas adresser de questions à des utilisateurs spécifiques ici, et vous ne pouvez pas leur envoyer un ping en utilisant la notation @ à moins qu'ils aient d'abord commenté ou que vous commentiez leur réponse. Ce n'est pas un site de média social, et vous ne recevez pas de support technique personnel de votre utilisateur préféré. –

+0

@KenWhite Merci pour l'info! Bon à savoir. Bien, espérons qu'il va se heurter à cette question.Je sais par d'autres questions de SO que David utilise son propre MemoryManager et en a essayé plusieurs. Donc, sa contribution serait très utile. – santiagoIT

Répondre

1
  1. Le système d'exploitation identifie parfois RAM inutilisée d'une application au ralenti, pour le libérer pour d'autres applications, il ne comptait plus dans la ressource consommée par l'application.

  2. Dans une telle application hybride, la plus grande partie de la mémoire est réservée par le framework .Net, pour son garbage collector, je suppose. Le GC fonctionnera en mode inactif et libèrera/compactera sa mémoire. C'est peut-être ce qui est arrivé. Ajoutez des journaux dans votre application au monitor the actual FastMM4 heap consumption.

  3. Il peut y avoir une fuite de mémoire et vous atteignez la limite de 2 Go du processus 32 bits. Essayez de set the 3GB flag for the exe. Ou passer à l'exécutable 64 bits - ce qui rendra votre code .Net heureux. Exécutez FastMM4 in memory leak reporting mode pour vous assurer que l'application est sûre.