Все домены и субдомены, которые вы используете, необходимо настроить для разрешения IP-адресов, по которым ваш AUT доступен. Это обычно включает редактирование вашего /etc/hosts
или настройку локального DNS-сервера для сообщения правильного IP-адреса.
malloc tries to allocate a contiguous memory range, and this will initially be in real memory simply due to how swap memory works (at least as far as I remember). It could easily be that your OS sometimes can't find a contiguous block of 10gb of memory and still leave all the processes that require real memory in RAM at the same time (at which point your malloc will fail).
Do you actually require 10gb of contiguous memory, or would you be able to wrap a storage class/struct around several smaller blocks and use your memory in chunks instead? This relaxes the huge contiguous requirement and should also allow your program to use the swap file for less used chunks.
Just a guess here, but malloc allocates contiguous memory and you may not have a sufficiently large contiguous section on your heap. Here's a few things I would try;
Where a 20GB malloc fails, do four 5GB mallocs succeed? If so, it is a contiguous space issue.
Have you checked your compiler switches for anything that limits total heap size, or largest heap block size?
Have you tried writing a program that declares a static variable of the required size? If this works you could implement your own heap with big mallocs in that space.
Have you tried using heap functions to allocate your memory instead?
Это, скорее всего, фрагментация. Для простоты давайте рассмотрим пример.
Память состоит из одного модуля по 12 КБ. Эта память организована в блоки по 1 КБ в MMU. Итак, у вас есть 12 блоков по 1 КБ. Ваша ОС использует 100 байт, но это в основном код, который управляет таблицами страниц. Таким образом, вы не можете поменять его. Затем все ваши приложения используют по 100 байт.
Теперь, когда запущена только ваша ОС и ваше приложение (200 байт), вы уже используете 200 байт памяти (занимающих блоки по 2 КБ). Оставляя ровно 10 КБ, доступно для malloc ()
.
Итак, вы начали с malloc ()
пары буферов - A (900 байт), B (200 байт). Затем вы освобождаете A. Теперь у вас есть 9.8kb свободных (несмежных). Итак, вы пытаетесь malloc ()
C (9kb). Внезапно вы терпите неудачу.
У вас есть 8. 9k, смежные в хвостовой части и 0.9k в передней части. Вы не можете повторно отобразить первый блок до конца, потому что B растягивается на первые 1k и вторые 1k блоки.
Вы все еще можете malloc ()
один блок 8kb.
Конечно, это Пример немного надуман, но надеюсь, что это поможет.
Have you tried using VirtualAlloc()
and VirtualFree()
directly? This may help isolate the problem.
If the virtual address space reservation fails (even though it shouldn't, judging from what you've said), Sysinternals VMMap may help explain why. Turn on "Show free regions" to look at how the free virtual address space is fragmented.
But why else could a malloc fail? I can't think of other reasons
As implicitly stated previously several times, because of memory fragmentation
Вот официальный источник, который заявляет, что максимальный размер запроса кучи определяется вашей связанной библиотекой CRT (кроме вашего предыдущего кода, в котором целочисленные переполнения идут до 0, поэтому вы не получили NULL назад) (_HEAP_MAXREQ).
http://msdn.microsoft.com/en-us/library/6ewkz86d.aspx
Посмотрите мой ответ здесь для выделения больших окон, я включаю ссылка на статью MS по усовершенствованию модели памяти Vista / 2008.
Короче говоря, стандартная CRT не поддерживает даже для собственного 64-битного процесса любой размер кучи, превышающий 4 ГБ. У вас есть для использования VirtualAlloc * или CreateFileMapping или некоторых других аналогов.
О, я также заметил, что вы утверждаете, что ваши большие выделения на самом деле успешны, это на самом деле неверно, вы неправильно интерпретируете malloc ( 0x200000000); вы ДОЛЖНЫ ВСЕГДА вычислять ОБЩУЮ СУММ данных, которые должны быть запрошены перед оператором, который оценивает запрос.
Почему это так плохо? Мы знаем, что это ошибка, потому что точка, в которой делается запрос для динамических ресурсов, там должна быть точкой в будущем, где мы будем использовать этот ресурс.
Чтобы использовать то, что мы просили, мы должны знать, насколько он велик? (например, количество массивов, размер типа и т. д.).
Это будет означать, что если мы когда-либо увидим какую-либо арифметику внутри () запроса ресурса, это будет ошибкой, поскольку мы ДОЛЖНЫ продублируйте этот код еще раз , чтобы использовать эти данные надлежащим образом.
Почему это так плохо? Мы знаем, что это ошибка, потому что точка, в которой делается запрос для динамических ресурсов, там должна быть точкой в будущем, где мы будем использовать этот ресурс.
Чтобы использовать то, что мы просили, мы должны знать, насколько он велик? (например, количество массивов, размер типа и т. д.).
Это будет означать, что если мы когда-либо увидим какую-либо арифметику внутри () запроса ресурса, это будет ошибкой, поскольку мы ДОЛЖНЫ продублируйте этот код еще раз , чтобы использовать эти данные надлежащим образом.
Почему это так плохо? Мы знаем, что это ошибка, потому что точка, в которой делается запрос для динамических ресурсов, там должна быть точкой в будущем, где мы будем использовать этот ресурс.
Чтобы использовать то, что мы просили, мы должны знать, насколько он велик? (например, количество массивов, размер типа и т. д.).
Это будет означать, что если мы когда-либо увидим какую-либо арифметику внутри () запроса ресурса, это будет ошибкой, поскольку мы ДОЛЖНЫ продублируйте этот код еще раз , чтобы использовать эти данные надлежащим образом.
Чтобы использовать то, что мы просили, мы должны знать, насколько он велик? (например, количество массивов, размер типа и т. д.).
Это будет означать, что если мы когда-либо увидим какую-либо арифметику внутри () запроса ресурса, это будет ошибкой, поскольку мы ДОЛЖНЫ продублируйте этот код еще раз , чтобы использовать эти данные надлежащим образом.
Чтобы использовать то, что мы просили, мы должны знать, насколько он велик? (например, количество массивов, размер типа и т. д.).
Это будет означать, что если мы когда-либо увидим какую-либо арифметику внутри () запроса ресурса, это будет ошибкой, поскольку мы ДОЛЖНЫ продублируйте этот код еще раз , чтобы использовать эти данные надлежащим образом.