Supposons que j'ai une méthode C# comme ceci: (évidemment pas de code réel)Quand la méthode local .NET est-elle éligible aux objets GC?
byte[] foo()
{
var a = MethodThatReturns500mbObject();
var b = MethodThatReturns200mbObject(a);
byte[] c = MethodThatReturns150mbByteArray(b);
byte[] d = UnwiselyCopyThatHugeArray(c);
return d;
}
Comme vous pouvez le deviner par la dénomination, les objets qui sont retournés par ces méthodes sont gigantesques. Des centaines de mégaoctets de RAM totale requis par chacun, bien que les deux premiers objets soient composés de millions d'objets plus petits au lieu d'un gros morceau comme les deux derniers tableaux.
Nous allons bientôt l'optimiser en une solution de streaming, mais en attendant, je voudrais m'assurer qu'au moins, nous n'empêchons pas le GC des objets précédents lors de l'exécution du code pour produire les objets suivants.
Ma question est la suivante: l'objet a
sera-t-il admissible au GC dès que MethodThatReturns200mbObject (a) sera de retour? Sinon, quelle est la meilleure façon de faire savoir au GC qu'un 500Mo attend de l'être?
Le cœur de ma question est de savoir si la détermination de "cet objet n'a pas de références" .NET GC est assez intelligent pour savoir que a
ne peut pas être référencé après MethodThatReturns200mbObject(a)
renvoie. Même si var a
est encore théoriquement disponible pour le code ultérieur, a
n'est référencé nulle part en dessous de la deuxième ligne de la méthode. En théorie, le compilateur pourrait faire savoir au GC que a
n'est pas référencé. Mais en pratique, je ne suis pas sûr de savoir comment il se comporte. Savez-vous?
'GC.KeepAlive()' aurait pas une grande utilité si toutes les variables ont déjà été maintenues vivant jusqu'à la fin de leur portée. –
En mode release, oui, le compilateur est assez intelligent pour marquer 'a' en tant que candidat pour le garbage collection au moment où il n'est plus utilisé. [Cette réponse] (https://stackoverflow.com/questions/17130382/understanding-garbage-collection-in-net/17131389#17131389) peut aussi être utile – Rob