Ошибка OOM произошла при открытии профиля студии Android - PullRequest
1 голос
/ 12 апреля 2019

Версия Android: 8.0.0

Когда я вызываю file.list, если я открываю профилировщик android studio для мониторинга памяти, легко возникает ошибка OOM, как показано ниже:

java.lang.OutOfMemoryError: EnsureLocalCapacity
   at java.io.UnixFileSystem.list0(Native Method)
   at java.io.UnixFileSystem.list(UnixFileSystem.java:303)
   at java.io.File.list(File.java:1122)

Я пытаюсь найти проблемы из исходного кода , Список заканчивается вызовом list0 ,

file.list -> UnixFileSystem.list () -> UnixFileSystem_list0 :

Java_java_io_UnixFileSystem_list0(JNIEnv *env, jobject this,
                              jobject file)
{
DIR *dir = NULL;
struct dirent64 *ptr;
struct dirent64 *result;
int len, maxlen;
jobjectArray rv, old;
jclass str_class;

str_class = JNU_ClassString(env);
CHECK_NULL_RETURN(str_class, NULL);


WITH_FIELD_PLATFORM_STRING(env, file, ids.path, path) {
    dir = opendir(path);
} END_PLATFORM_STRING(env, path);
if (dir == NULL) return NULL;

ptr = malloc(sizeof(struct dirent64) + (PATH_MAX + 1));
if (ptr == NULL) {
    JNU_ThrowOutOfMemoryError(env, "heap allocation failed");
    closedir(dir);
    return NULL;
}
// ...
}

И, что сбивает с толку, здесь возвращается строка " Не удалось выделить кучу ", а не " EnsureLocalCapacity " ,, поэтому я не знаю, где« EnsureLocalCapacity » от

вот мой код:

private static final String LINUX_CURRENT_FD_NUM = "/proc/" + Process.myPid() + "/fd";
private final File mFdFile = new File(LINUX_CURRENT_FD_NUM);

private void getFdInfo(){
  final String[] fdFileList = mFdFile.list();
}


mContext.registerActivityLifecycleCallbacks(new 
Application.ActivityLifecycleCallbacks() {

        // ...

        @Override
        public void onActivityStopped(Activity activity) {
            getFdInfo();
        }

        // ...
    });

В настоящее время обнаружено, что это происходит при условии включения мониторинга профилировщика.Неясно, будут ли возникать другие условия.

Несколько вопросов:

  1. Как решить эту проблему?
  2. Связана ли эта проблема с профилировщиком?Включает ли мониторинг памяти профилировщик память?Сколько это стоит?
  3. где можно увидеть исходный код, связанный с мониторингом памяти профилировщика
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...