Это очень простое действие, которое повторяет проблему (по крайней мере, на Android 4.0.3)
public class MainActivity extends Activity {
int image[];
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// setContentView(R.layout.activity_main);
image = new int[1000 * 1500 * 4];
}
}
Как вы можете видеть, нет видов или макетов, связанных с активностью, также я установил профиль "Silent" в настройках звука системы и отключил "Vibrate on touch".
Теперь, после нескольких (5-7, в зависимости от вашего heapSize) перезапусков это действие генерирует java.lang.OutOfMemoryError при попытке создать новый массив.
07-27 19:54:10.160 22542-22542/? D/dalvikvm﹕ GC_FOR_ALLOC freed 6K, 1% free 56040K/56391K, paused 25ms
07-27 19:54:10.190 22542-22542/? D/dalvikvm﹕ GC_BEFORE_OOM freed 23449K, 43% free 32591K/56391K, paused 30ms
07-27 19:54:10.260 22542-22543/? D/dalvikvm﹕ GC_CONCURRENT freed 0K, 1% free 56029K/56391K, paused 3ms+3ms
07-27 19:54:11.850 22542-22542/? D/dalvikvm﹕ GC_FOR_ALLOC freed 6K, 1% free 56040K/56391K, paused 20ms
07-27 19:54:11.880 22542-22542/? D/dalvikvm﹕ GC_BEFORE_OOM freed <1K, 1% free 56040K/56391K, paused 29ms
... Out of memory on a 24000016-byte allocation.
Сброс .hprof Я также видел 2 действия, одно из которых проводится AudioManager.
Вызов «Кучи обновлений», а затем «Сбор мусора» в Android Device Monitor действительно удаляет активность из памяти, что и указывает logcat в этой процедуре
07-27 19:44:23.150 85-85/? I/DEBUG﹕ #06 pc 000382cc /system/lib/libdvm.so (dvmCollectGarbageInternal(GcSpec const*)+1204)
Я также пытался собрать релизную версию apk, и он ведет себя так же. Так что это не отладчик, содержащий ссылку.
Это мне кажется ошибкой в Android. Обходной путь должен был бы явным образом вызвать image = null в OnStop () или onFinish () действия. Это, конечно, не удобно.