Почему эти цифры распределения памяти не складываются? - PullRequest
3 голосов
/ 25 января 2012

Я вижу следующее в окне adb logcat:

01-24 14:40:56.916: E/dalvikvm-heap(24727): 1957200-byte external allocation too large for this process.
01-24 14:40:56.966: E/GraphicsJNI(24727): VM won't let us allocate 1957200 bytes
01-24 14:40:56.976: E/dalvikvm(24727): OutOfMemory: max: 50331648(49152 K), total: 39985120(39047 K), alloc: 33659240(32870 K), extAlloc: 8993870(8783 K)

Я не понимаю, почему эти цифры не складываются (или я просто не понимаю, как это работает). Я вижу OutOfMemory: максимум 48 МБ - я думаю, это максимальный размер кучи. Не уверен, что означает «общее» в этом контексте, но похоже, что он составляет около 39 МБ. Это происходит сбой при выделении 2 МБ, и я не совсем понимаю, почему это происходит, должно быть доступно 9 МБ ... Что я здесь недопонимаю?

1 Ответ

4 голосов
/ 25 января 2012

Добро пожаловать в удивительный мир фрагментации кучи. Короче говоря, вам нужен непрерывный кусок памяти, чтобы удовлетворить выделение, а не только достаточно свободных байтов.

В качестве примера представьте пустую кучу объемом 1 МБ. Теперь представьте, что прямо в середине этого 1 МБ выделено 1 КБ. Даже при том, что у вас есть 99,9% свободного места, вы не можете выделить что-то более 500K, потому что оно должно быть смежным. Переместите выделение в 1 Кб, и вы сможете выделить гораздо больше, но в патологических случаях у вас может оказаться гораздо больше свободной памяти, чем вы можете выделить.

В вашем случае, держу пари, что если вы попытаетесь выделить 2000 килобайт, это будет отлично работать. Это даст вам знать, если вы имеете дело с фрагментацией или чем-то еще.

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