Pergunta

Meu código:

var list = new LinkedList<int>();
var ramCounter = new PerformanceCounter("Memory", "Available MBytes");
while (true)
{
    for(int i = 0; i < 1000 * 1000; i++) list.AddLast(0);
    Console.WriteLine(ramCounter.NextValue());
}

Perguntas:

  1. A documentação parece dizer que eu posso usar um PerformanceCounter apenas como um Administrador , mas eu corri minha aplicação como um usuário padrão e funcionou. Posso contar com isso?
  2. I consistentemente get OutOfMemoryException quando cerca de 200 MB RAM permanecem, por ? Não pode ser devido à fragmentação porque eu atribuir um int em um momento. Além disso, não pode ser devido a problemas de endereçamento, como eu já estou muito acima de 2 GB (a exceção fica acionada quando 2.8 de minha 3GB são tomadas). O número de saída pelo aplicativo de teste foram verificados com uma janela Gerenciador de tarefas em execução ao lado.
  3. Uma vez que eu tenho um BSOD quando o aplicativo de teste foi executado e cerca de 400 MB foram restante. Quaisquer sugestões sobre o que poderia causar isso? Vou executar uma verificação de integridade RAM, qualquer outra coisa? Devo ter cuidado com a chamada PerformanceCounter.NextValue() em um loop, ou algo assim? Note, que é a primeira vez que recebo um BSOD neste PC.
  4. Em alguns pontos da execução do programa, eu recebo grandes atrasos. Por exemplo. quando eu começar a 1 GB RAM livre, quando eu chegar a 700 MB congela aplicativos por 1 segundo, em seguida, a cerca de 400 MB que congela por cerca de 4 segundos. Por que é isso? Porque as necessidades do sistema operacional para trocar caches de disco para liberar memória, ou algo assim?

Nota: Por que estou fazendo isso? Bem, eu quero meu aplicativo muita memória para detectar quando 5 MB RAM permanecem, e alertar o usuário com "Memory é baixo, por favor, feche outros programas e voltar, ou este programa irá falhar."

Foi útil?

Solução

Eu não posso resolver todas as suas questões, mas aqui vai

2) Você está em 32 ou 64 bits do Windows? Parece que você está executando um processo consciente grande endereço com acesso a 3 GB (ou seja, em 32 bits do Windows). Em qualquer caso, você tem que manter em mente que a memória é alocada em mandris de vários tamanhos e seu uso de pilha não é a única fonte. O CLR em si tem inúmeras estruturas, cada segmento tem uma pilha e assim por diante. Em qualquer caso, você realmente não pode esperar para ser capaz de usar exatamente 3 GB,

3) BSOD é devido a erros de driver ou do kernel. AFAIK sua aplicação não pode causar BSOD, então isso é provavelmente não relacionado.

4) Se você usar uma grande quantidade de memória que o GC terá dificuldade em manter-se. Como threads do usuário são suspensas enquanto certas partes do GC está em andamento este vai abrandar o seu aplicativo de forma significativa.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top