Intereting Posts
Android 4.4.2 и мягкая клавиатура. Возможноменменю? «Невыполненный метод WebView onKeyDown, вызванный из», произошел Android DataBinding и MVVM – использование одинаковых файлов макета для разных условий с использованием одинаковых моделей просмотра Проблемы с клавиатурой, возникающие при изменении ориентации Аннотации доступны только для java 1.5 и выше при создании бэкэнда приложений Google App Engine (JDK 1.8, новый ADT) Каков наилучший способ выбрать видео на Android? Исходный файл «AndroidManifest.xml» удален или недоступен Как удалить приложение с активным админом устройства на Android? Использовать голографическую тему на Android <4.0 Android – отображение ExoPlayer в круге MultiChoiceMode перед API 11 Диспетчер устройств Windows 8.1 теперь показывает устройство ACER, а не устройство Android для Google Nexus 7 Управление flipper страницы – как и домашние экраны Android Android: Bitmap recycle () как это работает? SurfaceView мерцает / разрывает Как включить учетные записи в новом API Android для Google Диска

Есть ли способ, чтобы процесс Android вывел кучу кучи на OutOfMemoryError?

Sun JVM поддерживает -XX:+HeapDumpOnOutOfMemoryError чтобы сбрасывать кучу всякий раз, когда у java-процесса заканчивается куча.

Есть ли аналогичный вариант на Android, который сделает кучу дампов приложения android на OutOfMemoryException? При использовании DDMS вручную это может быть сложно попытаться правильно.

Solutions Collecting From Web of "Есть ли способ, чтобы процесс Android вывел кучу кучи на OutOfMemoryError?"

Чтобы расширить ответ CommonsWare:

Я понятия не имею, работает ли это, но вы можете попробовать добавить обработчик исключений верхнего уровня и там просить дамп кучи, если это OutOfMemoryError .

Я успешно выполнил его предложение в своем приложении для Android со следующим кодом:

 public class MyActivity extends Activity { public static class MyUncaughtExceptionHandler implements Thread.UncaughtExceptionHandler { @Override public void uncaughtException(Thread thread, Throwable ex) { Log.e("UncaughtException", "Got an uncaught exception: "+ex.toString()); if(ex.getClass().equals(OutOfMemoryError.class)) { try { android.os.Debug.dumpHprofData("/sdcard/dump.hprof"); } catch (IOException e) { e.printStackTrace(); } } ex.printStackTrace(); } } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Thread.currentThread().setUncaughtExceptionHandler(new MyUncaughtExceptionHandler()); } } 

После создания дампа вам необходимо скопировать его с телефона на компьютер: Нажмите «Включить USB-накопитель» на телефоне, найдите файл и скопируйте его на свой жесткий диск.

Затем, если вы хотите использовать Eclipse Memory Analyzer (MAT) для анализа файла, вам нужно будет hprof-conv.exe dump.hprof dump-conv.hprof файл: hprof-conv.exe dump.hprof dump-conv.hprof (hprof-conv находится в android-sdk/tools )

Наконец, откройте файл dump-conv.hprof с MAT

Я понятия не имею, работает ли это, но вы можете попробовать добавить обработчик исключений верхнего уровня и там просить дамп кучи, если это OutOfMemoryError .

Вот улучшенная версия. В дополнение к первоначальной реализации эта реализация также поддерживает:

  • Улавливание ошибок памяти во всех потоках (не только в основном потоке)
  • Идентификация ошибок в памяти, даже если она скрыта внутри другой ошибки. В некоторых случаях ошибка Out of Memory инкапсулируется внутри ошибки Runtime.
  • Вызов оригинального обработчика исключенных исключений по умолчанию.
  • Работает только в DEBUG.

Использование: вызов метода статической initialize в классе Application в методе onCreate .

 package test; import java.io.File; import java.io.IOException; import java.lang.Thread.UncaughtExceptionHandler; import android.os.Environment; import android.util.Log; import com.example.test1.BuildConfig; public class OutOfMemoryDumper implements Thread.UncaughtExceptionHandler { private static final String TAG = "OutOfMemoryDumper"; private static final String FILE_PREFIX = "OOM-"; private static final OutOfMemoryDumper instance = new OutOfMemoryDumper(); private UncaughtExceptionHandler oldHandler; /** * Call this method to initialize the OutOfMemoryDumper when your * application is first launched. */ public static void initialize() { // Only works in DEBUG builds if (BuildConfig.DEBUG) { instance.setup(); } } /** * Keep the constructor private to ensure we only have one instance */ private OutOfMemoryDumper() { } private void setup() { // Checking if the dumper isn't already the default handler if (!(Thread.getDefaultUncaughtExceptionHandler() instanceof OutOfMemoryDumper)) { // Keep the old default handler as we are going to use it later oldHandler = Thread.getDefaultUncaughtExceptionHandler(); // Redirect uncaught exceptions to this class Thread.setDefaultUncaughtExceptionHandler(this); } Log.v(TAG, "OutOfMemoryDumper is ready"); } @Override public void uncaughtException(Thread thread, Throwable ex) { Log.e(TAG, "Uncaught exception: " + ex); Log.e(TAG, "Caused by: " + ex.getCause()); // Checking if the exception or the original cause for the exception is // an out of memory error if (ex.getClass().equals(OutOfMemoryError.class) || (ex.getCause() != null && ex.getCause().getClass() .equals(OutOfMemoryError.class))) { // Checking if the external storage is mounted and available if (isExternalStorageWritable()) { try { // Building the path to the new file File f = Environment .getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS); long time = System.currentTimeMillis(); String dumpPath = f.getAbsolutePath() + "/" + FILE_PREFIX + time + ".hprof"; Log.i(TAG, "Dumping hprof data to: " + dumpPath); android.os.Debug.dumpHprofData(dumpPath); } catch (IOException ioException) { Log.e(TAG,"Failed to dump hprof data. " + ioException.toString()); ioException.printStackTrace(); } } } // Invoking the original default exception handler (if exists) if (oldHandler != null) { Log.v(TAG, "Invoking the original uncaught exception handler"); oldHandler.uncaughtException(thread, ex); } } /** * Checks if external storage is available for read and write * * @return true if the external storage is available */ private boolean isExternalStorageWritable() { String state = Environment.getExternalStorageState(); if (Environment.MEDIA_MOUNTED.equals(state)) { return true; } Log.w(TAG,"The external storage isn't available. hprof data won't be dumped! (state=" + state + ")"); return false; } }