Вопрос или проблема
Я пытаюсь использовать cm3-unix64le-d5.11.1-20210610 из Modula 3 github. Я запускаю файл .cpp и получаю ошибку: исчерпана виртуальная память: недостаточно местa. У меня 16 ГБ оперативной памяти, и я работаю на Solaris 10 u11 на процессоре amd64. Мой раздел подкачки имеет 2097144 свободных, из 2097144. Я использую gcc5g++ из opencsw. Файл c++ имеет всего около 300 МБ. Вот вывод терминала. Предупреждения, похоже, не являются проблемой.
# g++ -g -pthread -c /Desktop/cm3-boot-unix64le-d5.11.1-20210610.cpp
[01m[K../src/types/ArrayType.m3:[m[K В функции '[01m[KINTEGER ArrayType__InitCoster(ArrayType__P, BOOLEAN)[m[K':
[01m[K../src/types/ArrayType.m3:429:16:[m[K [01;35m[Kпредупреждение: [m[Kпереполнение при неявном преобразовании константы [-Woverflow]
[01m[K../src/types/ArrayType.i3:134:20:[m[K [01;36m[Kзамечание: [m[В определении макроса '[01m[KINT64_[m[K'
[01m[K../src/types/ArrayType.m3:433:16:[m[K [01;35m[Kпредупреждение: [m[Kпереполнение при неявном преобразовании константы [-Woverflow]
[01m[K../src/types/ArrayType.i3:134:20:[m[K [01;36m[Kзамечание: [m[В определении макроса '[01m[KINT64_[m[K'
[01m[K../src/types/ArrayType.m3:434:16:[m[K [01;35m[Kпредупреждение: [m[Kпереполнение при неявном преобразовании константы [-Woverflow]
[01m[K../src/types/ArrayType.i3:134:20:[m[K [01;36m[Kзамечание: [m[В определении макроса '[01m[KINT64_[m[K'
[01m[K../src/float/IEEE/LongFloat.m3:[m[K В функции '[01m[KINTEGER LongFloat__ILogb(LongFloat__T)[m[K':
[01m[K../src/float/IEEE/LongFloat.m3:53:16:[m[K [01;35m[Kпредупреждение: [m[Kпереполнение при неявном преобразовании константы [-Woverflow]
[01m[K../src/float/Common/Float.ig:257:20:[m[K [01;36m[Kзамечание: [m[В определении макроса '[01m[KINT64_[m[K'
[01m[K../src/float/IEEE/LongFloat.m3:55:38:[m[K [01;35m[Kпредупреждение: [m[Kпереполнение при неявном преобразовании константы [-Woverflow]
[01m[K../src/MasmObjFile.m3:[m[K В функции '[01m[KINTEGER MasmObjFile__NextSymOffset(MasmObjFile__DState*, MasmObjFile__SKind)[m[K':
[01m[K../src/MasmObjFile.m3:750:16:[m[K [01;35m[Kпредупреждение: [m[Kпереполнение при неявном преобразовании константы [-Woverflow]
[01m[K../src/MasmObjFile.i3:92:20:[m[K [01;36m[Kзамечание: [m[В определении макроса '[01m[KINT64_[m[K'
[01m[K../src/MasmObjFile.m3:[m[K В функции '[01m[KINTEGER MasmObjFile__NextRelocOffset(MasmObjFile__DState*, MasmObjFile__SKind)[m[K':
[01m[K../src/MasmObjFile.m3:762:16:[m[K [01;35m[Kпредупреждение: [m[Kпереполнение при неявном преобразовании константы [-Woverflow]
[01m[K../src/MasmObjFile.i3:92:20:[m[K [01;36m[Kзамечание: [m[В определении макроса '[01m[KINT64_[m[K'
[01m[K../src/types/OpenArrayType.m3:[m[K В функции '[01m[KINTEGER OpenArrayType__InitCoster(OpenArrayType__P, BOOLEAN)[m[K':
[01m[K../src/types/OpenArrayType.m3:282:16:[m[K [01;35m[Kпредупреждение: [m[Kпереполнение при неявном преобразовании константы [-Woverflow]
[01m[K../src/types/OpenArrayType.i3:122:20:[m[K [01;36m[Kзамечание: [m[В определении макроса '[01m[KINT64_[m[K'
[01m[K../src/float/IEEE/RealFloat.m3:[m[K В функции '[01m[KINTEGER RealFloat__ILogb(RealFloat__T)[m[K':
[01m[K../src/float/IEEE/RealFloat.m3:49:16:[m[K [01;35m[Kпредупреждение: [m[Kпереполнение при неявном преобразовании константы [-Woverflow]
[01m[K../src/float/Common/Float.ig:257:20:[m[K [01;36m[Kзамечание: [m[В определении макроса '[01m[KINT64_[m[K'
[01m[K../src/float/IEEE/RealFloat.m3:51:38:[m[K [01;35m[Kпредупреждение: [m[Kпереполнение при неявном преобразовании константы [-Woverflow]
[01m[K../src/types/RecordType.m3:[m[K В функции '[01m[KINTEGER RecordType__InitCoster(RecordType__P, BOOLEAN)[m[K':
[01m[K../src/types/RecordType.m3:390:16:[m[K [01;35m[Kпредупреждение: [m[Kпереполнение при неявном преобразовании константы [-Woverflow]
[01m[K../src/types/RecordType.i3:99:20:[m[K [01;36m[Kзамечание: [m[В определении макроса '[01m[KINT64_[m[K'
[01m[K../src/misc/Scanner.m3:[m[K В функции '[01m[KINTEGER Scanner__HexDigitValue(m3_CHAR)[m[K':
[01m[K../src/misc/Scanner.m3:509:38:[m[K [01;35m[Kпредупреждение: [m[Kпереполнение при неявном преобразовании константы [-Woverflow]
исчерпана виртуальная память: недостаточно местa
Ответ или решение
Проблема исчерпания виртуальной памяти в Solaris 10 при компиляции C++ файла
Вы столкнулись с ошибкой "virtual memory exhausted: Not enough space", пытаясь скомпилировать .cpp файл размером 300 Мб на системе Solaris 10 с 16 Гб оперативной памяти и 2 Гб свопа. Давайте разберемся, что могло вызвать эту проблему и как ее решить.
1. Анализ причины ошибки
Ошибка "virtual memory exhausted" указывает на то, что процесс компиляции не смог выделить достаточно виртуальной памяти для завершения операции. Виртуальная память – это логическое расширение физической памяти (RAM), и если физической памяти не хватает, операционная система начинает использовать своп (файлы подкачки) для хранения данных, которые не могут поместиться в оперативной памяти.
Несмотря на наличие 16 Гб ОЗУ, ошибка может возникнуть из-за нескольких причин:
- Ограничение на размер свопа: Так как вы имеете только 2 Гб свободного пространства для свопа, этого может быть недостаточно для завершения компиляции, особенно для больших проектов.
- Ограничения самой системы: Solaris 10 имеет определённые предопределенные ограничения на использование памяти, которые могут быть быстрее достигнуты при компиляции больших файлов или при использовании специфичных флагов компилятора.
- Лимиты на процессы: Нередко в Unix-подобных системах применяются ограничения на размер памяти для процесса, которые могут блокировать возможность выделения необходимого объема (например, через ulimit).
2. Решение проблемы
Чтобы решить эту проблему, вы можете рассмотреть следующие шаги:
Увеличение размера свопа
-
Создайте дополнительное пространство для свопа. Для этого используйте команду:
mkdir /path/to/swapfile dd if=/dev/zero of=/path/to/swapfile bs=1M count=2048 chmod 600 /path/to/swapfile /usr/sbin/swap -a /path/to/swapfile
Это создаст новый своп-файл на 2 Гб. Убедитесь, что путь к файлу корректен.
-
Проверьте текущее состояние свопа:
swap -l
Параметры компилятора
- Измените параметры компиляции. Попробуйте использовать флаг
-pipe
для компилятора, который может сократить использование временного дискового пространства. Команда будет выглядеть так:g++ -pipe -g -pthread -c /Desktop/cm3-boot-unix64le-d5.11.1-20210610.cpp
Применение ulimit
- Проверьте и измените лимиты процесса:
ulimit -a # Проверяет текущие лимиты ulimit -v unlimited # Устанавливает лимит виртуальной памяти на неограниченный ulimit -d unlimited # Устанавливает лимит максимального размера сегмента памяти на неограниченный
3. Заключение
Решение проблемы исчерпания виртуальной памяти требует комплексного подхода, включая увеличение объема свопа, изменение флагов компиляции и управление ограничениями, установленными на уровне системы. Если проблемы будут продолжаться, вы можете рассмотреть возможность оптимизации кода или, в крайнем случае, использование более мощной машины для компиляции. Не забудьте протестировать каждое изменение, чтобы убедиться, что проблема действительно решена.
Следуйте этим рекомендациям, и у вас будет больше шансов успешно скомпилировать ваш C++ файл на Solaris 10.