Как я могу имитировать состояние нехватки памяти в Windows 7 - PullRequest
8 голосов
/ 20 октября 2011

У меня есть приложение, написанное на C #, которое работает хорошо, но иногда в поле выдает ошибки, которые, по нашему мнению, связаны с нехваткой памяти или взаимодействием со сборщиком мусора.

Если кому-то интересно, оноописано здесь:
Невозможно привести объект типа 'NHibernate.Impl.ExpandedQueryExpression' к типу 'NHibernate.Linq.NhLinqExpression'

Я хочу попробовать и воспроизвести это для отладки, но моя машина разработки имеет слишком много памяти.

Я удалил файл подкачки, чтобы моя виртуальная память была ограничена 12 ГБ физической памяти, так что кроме физического удаления оперативной памяти, есть ли у кого-нибудь какие-либо предложения о том, как имитироватьнехватка памяти в среде разработки?

РЕДАКТИРОВАТЬ:
Удален вопрос об инструментах, которые контролируют сборщик мусора?

Ответы [ 9 ]

5 голосов
/ 20 октября 2011

Вы можете использовать виртуальную машину (VPC, VMWare или Virtual Box) и отключить память.

Это надежнее, чем ошибка.

EDIT

Это предложение является способом моделирования ПК с меньшей физической памятью. Как отмечается в комментариях и других ответах, если вы хотите отрегулировать виртуальную память, «съедая» кучу в начале процесса, это будет решением.

3 голосов
/ 20 октября 2011

Не ответ, но очень классная утилита, которую я нашел на The Code Project - инструмент выделения памяти

Введение

Иногда очень полезно тестировать ваши приложения в экстремальных ситуациях, таких как
нехватка ресурсов, полный жесткий диск или нехватка памяти.

Этот инструмент охватывает только последнюю память.
Это позволяет вам выделить столько памяти, сколько может быть доступно.

Memory Allocation Tool

3 голосов
/ 20 октября 2011

Объем вашей оперативной памяти не имеет отношения к операционной системе виртуальной памяти, такой как Windows.Недостаточно только замедляет программу.Важным является размер адресного пространства виртуальной памяти - 2 гигабайта в 32-разрядной операционной системе.Установите целевую платформу в вашем проекте EXE на x86, если у вас 64-битная операционная система.

Вы можете произвольно увеличить нагрузку на память, вызвав Marshal.AllocHGlobal () в начале вашей программы.Выделите, скажем, 500 мегабайт.Не более того, это легко потерпит неудачу.Получите больше, выделив куски по 90 МБ.

0 голосов
/ 04 сентября 2014

Нашел эту утилиту, которая теперь FreeWare: http://www.soft.tahionic.com/download-memalloc/

0 голосов
/ 06 июня 2014

Это очень простая программа, которую мы используем для проверки нехватки памяти на наших серверах Linux. Я никогда не компилировал его в Windows, но он должен работать.

https://github.com/julman99/eatmemory

Надеюсь, у вас все получится

0 голосов
/ 20 октября 2011

Вы можете использовать простую программу на C для выделения или попытки выделить произвольные объемы памяти в куче:

#include <stdio.h>
#include <stdlib.h>

#define MB (1024*1024)
#define DEFAULT_ALLOC ((size_t) (512*MB));

int main(int argc, char *argv[]) {
    char buffer[2];
    char *chunk;
    char *endp;
    size_t howmuch;

    if ( argc < 2 ) {
        howmuch = DEFAULT_ALLOC;
    }
    else {
        howmuch = strtoul(argv[1], &endp, 10);
        if ( *endp ) {
            fputs("Failed to parse command line argument", stderr);
            howmuch = DEFAULT_ALLOC;
        }
        else {
            howmuch *= MB;
        }
    }

    chunk = calloc(howmuch, 1);

    if ( chunk == NULL ) {
        fputs("Memory allocation error", stderr);
        exit(EXIT_FAILURE);
    }

    puts("Memory allocated.\nPress ENTER to terminate program");

    fgets(buffer, 2, stdin);

    return EXIT_SUCCESS;
}
0 голосов
/ 20 октября 2011

Для отслеживания активности вашего сборщика мусора и использования памяти процессами вы можете использовать счетчики производительности Windows.

Чтобы заполнить вашу оперативную память, почему бы не выделить достаточно большой массив из программы ac #?

0 голосов
/ 20 октября 2011

Почему бы не использовать ошибку как инструмент?

http://connect.microsoft.com/VisualStudio/feedback/details/521147/large-object-heap-fragmentation-causes-outofmemoryexception

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...