2017-10-17 10 views
0

J'ai problème avec ceci:GC Alloc pour une raison inconnue

public void WriteArgs(object[] args) 
    { 
     for (var i = 0; i < args.Length; i++) 
     { 
      Stream.WriteObject(args[i]); 
     } 
    } 

Il y a 2 Ko allouer 50 appels (screen). Comment est-ce possible? Quelle partie de cette méthode alloue de la mémoire? (Sur cet écran, vous voyez que San Stream.WriteObject(args[i]); alloue 9.4 si 2KB alloue par WriteArgs lui-même)

+0

Bien que vous utilisez un 'Stream' qui est une ressource non gérée – Rahul

+0

Quel type est Stream? – Polyfun

+0

Pourquoi vous souciez-vous de 2KB? Courez-vous dans un environnement à contrainte de mémoire? – mjwills

Répondre

1

Un grand suspect est le object dans votre paramètre object[] args. Cela ressemble à un problème de boxe et de déballage.

Lorsque vous appelez la fonction WriteArgs et passer quelque chose, il effectuera boxe pour convertir ce paramètre à object.


Je ne sais pas ce que le Stream.WriteObject est ou où vous avez obtenu cela, mais si cela prend object comme paramètre trop et quand il entrer dans la fonction WriteArgs, il se produira également unboxing afin d'utiliser la variable qui passe à lui. Les deux boxe et unboxing allouent de la mémoire.

FIX:

Retirez object[] args et créer plusieurs pour votre fonction surcharges WriteArgs qui peut gérer différents types d'objets en tant que paramètre.

Aussi, faites la même chose pour le Stream.WriteObject si vous l'avez écrit ou trouvez une autre fonction pour cela. Vous pouvez en savoir plus sur boxe et unboxinghere.

EDIT:

La question la boxe et unboxing décrit ci-dessus appliquent uniquement aux Value Types. Si vous passez déjà Reference Type à cette fonction alors le seul problème ici est la fonction Stream.WriteObject.

+0

La boxe et le déballage n'auront lieu que si l'objet en question est un type de valeur. – Servy

+1

@Servy Oui, mais nous ne savons pas ce qui est passé à cette fonction.OP ne l'a pas montré dans la question. – Programmer

+0

Et pourtant vous avez dit que la valeur est * toujours * en boîte, et * toujours * sans boîte, ce qui est tout simplement faux. Si vous estimez que la question ne contient pas assez d'informations pour afficher une réponse correcte, alors * ne postez pas de réponse * jusqu'à ce que la question puisse être suffisamment clarifiée pour pouvoir répondre. – Servy