На устройстве Android 8 ГБ (Android 14+) я неоднократно выделяю большие фрагменты памяти (приблизительно 1 ГБ на выделение) с помощью malloc().
Я наблюдаю следующее:
- malloc() возвращает ненулевой указатель для каждого выделения
- Если я не инициализирую или не получаю доступ к выделенной памяти, приложение продолжает работать
- В этом случае общий выделенный размер может превышать размер физической оперативной памяти устройства
- Когда я инициализирую память с помощью memset(), приложение завершается после нескольких итераций
- Сбой происходит во время memset(), а не при вызове malloc()
- Происходит:
Нет сбоя malloc() - Нет возврата NULL
После завершения logcat показывает такие сообщения, как:
InputDispatcher: channel 'com.example.app/.MainActivity'
~ Channel is unrecoverably broken and will be disposed
Дополнительные сведения:
- Указатель, возвращаемый функцией malloc(), выглядит действительным до тех пор, пока не будет выполнена memset().
- Количество успешных выделений варьируется, но сбой постоянно происходит после нескольких больших выделений при доступе к памяти.
- Приложение определяет приложение подкласс -- Ни onLowMemory(), ни onTrimMemory() не вызывается перед завершением процесса.
- Почему malloc() позволяет выделять память за пределы физической оперативной памяти, когда к ней нет доступа?
- Почему процесс завершается во время memset() вместо malloc() возвращает nullptr?
#include
#include
#define ONE_GB (1024ULL * 1024 * 1024)
void allocate_chunks(int iterations) {
for (int i = 0; i < iterations; i++) {
void* ptr = malloc(ONE_GB);
__android_log_print(ANDROID_LOG_INFO, "NATIVE",
"Iteration %d, ptr=%p", i, ptr);
if (!ptr) {
__android_log_print(ANDROID_LOG_ERROR, "NATIVE",
"malloc returned NULL");
return;
}
// Uncommenting the following line causes the app to be killed
memset(ptr, 0, ONE_GB);
}
}
Подробнее здесь: https://stackoverflow.com/questions/798 ... illed-duri
Мобильная версия