J'ai rencontré un comportement curieux en ce qui concerne la récupération de place dans .Net.Critères de déclenchement de la récupération de place dans .Net
Le programme suivant lancera une exception OutOfMemoryException très rapidement (après moins d'une seconde sur une machine 32 bits de 2 Go). Le finaliseur Foo n'est jamais appelé.
class Foo
{
Guid guid = Guid.NewGuid();
byte[] buffer = new byte[1000000];
static Random rand = new Random();
public Foo()
{
// Uncomment the following line and the program will run forever.
// rand.NextBytes(buffer);
}
~Foo()
{
// This finalizer is never called unless the rand.NextBytes
// line in the constructor is uncommented.
}
static public void Main(string args[])
{
for (; ;)
{
new Foo();
}
}
}
Si la ligne rand.nextBytes est décommentée, viderait ad infinitum, et le Foo finaliseur est régulièrement invoquée. Pourquoi donc?
Ma meilleure estimation est que dans le premier cas, soit le CLR ou Windows VMM est paresseux sur l'allocation de la mémoire physique. Le tampon n'est jamais écrit, donc la mémoire physique n'est jamais utilisée. Lorsque l'espace adresse est épuisé, le système se bloque. Dans ce dernier cas, le système manque de mémoire physique avant de manquer d'espace d'adressage, le GC est déclenché et les objets sont collectés.
Cependant, voici la partie que je ne comprends pas. En supposant que ma théorie est correcte, pourquoi le GC ne se déclenche-t-il pas lorsque l'espace d'adressage est faible? Si ma théorie est incorrecte, alors quelle est la véritable explication?
I Je ne suis pas certain que vous ayez la bonne réponse, mais vous m'avez mis sur une piste intéressante. J'ai arrêté deux Virtual PC que je courais (tous les deux avec 512 Mo) et j'ai votre comportement. Lorsque j'ai rechargé les VPC, j'ai eu le comportement d'écrasement d'origine. –
Il y a aussi des fonctions intéressantes dans la classe 'GC' à vérifier, mais encore une fois, en code réel, celles-ci ne devraient jamais être utilisées. –
Avec les VPC en cours d'exécution et le Thread.Sleep (0) en place, le programme s'exécute pour toujours. Maintenant, la question se déplace ... Pourquoi le GC ne se déclenche-t-il pas automatiquement en cas d'échec de l'allocation? –