Что заставляет GC пытаться освободить больше собственных байтов, чем тех, которые зарегистрированы как выделенные (java.lang.Error: Очиститель завершен ненормально) - PullRequest
4 голосов
/ 09 июня 2019

В последнее время наше приложение для Android закрывалось без сообщений о сбоях.

Изучив журналы системного дампа, мы обнаружили общий журнал, который всегда появлялся при возникновении этой ситуации.

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

По-видимому, когда сборщик мусора начал свою нормальную работу, он попытался освободить больше собственных байтов, чем тех, которые зарегистрированы как выделенные.

Это произошло на Android 7 и 8.1, которые являются версиями, которые мы в настоящее время поддерживаем, используя планшет Samsung Tab A (2016) T585.

Это выдержка из системного журнала:

06-06 11:53:27.243  3954  3965 I art     : Background partial concurrent mark sweep GC freed 189192(8MB) AllocSpace objects, 25(7MB) LOS objects, 40% free, 13MB/22MB, paused 1.940ms total 126.255ms
06-06 11:53:27.244  3954  3962 W System.err: java.lang.Error: Cleaner terminated abnormally
06-06 11:53:27.246  3954  3962 W System.err:    at sun.misc.Cleaner$1.run(Cleaner.java:147)
06-06 11:53:27.246  3954  3962 W System.err:    at sun.misc.Cleaner$1.run(Cleaner.java:145)
06-06 11:53:27.247  3954  3962 W System.err:    at java.security.AccessController.doPrivileged(AccessController.java:41)
06-06 11:53:27.247  3954  3962 W System.err:    at sun.misc.Cleaner.clean(Cleaner.java:144)
06-06 11:53:27.247  3954  3962 W System.err:    at java.lang.ref.ReferenceQueue.enqueueLocked(ReferenceQueue.java:75)
06-06 11:53:27.247  3954  3962 W System.err:    at java.lang.ref.ReferenceQueue.enqueuePending(ReferenceQueue.java:243)
06-06 11:53:27.247  3954  3962 W System.err:    at java.lang.Daemons$ReferenceQueueDaemon.run(Daemons.java:160)
06-06 11:53:27.247  3954  3962 W System.err:    at java.lang.Thread.run(Thread.java:762)
06-06 11:53:27.247  3954  3962 W System.err: Caused by: java.lang.RuntimeException: Attempted to free 98 native bytes with only 91 native bytes registered as allocated
06-06 11:53:27.247  3954  3962 W System.err:    at dalvik.system.VMRuntime.registerNativeFree(Native Method)
06-06 11:53:27.247  3954  3962 W System.err:    at libcore.util.NativeAllocationRegistry.registerNativeFree(NativeAllocationRegistry.java:223)
06-06 11:53:27.247  3954  3962 W System.err:    at libcore.util.NativeAllocationRegistry.-wrap0(NativeAllocationRegistry.java)
06-06 11:53:27.247  3954  3962 W System.err:    at libcore.util.NativeAllocationRegistry$CleanerThunk.run(NativeAllocationRegistry.java:196)
06-06 11:53:27.247  3954  3962 W System.err:    at sun.misc.Cleaner.clean(Cleaner.java:142)
06-06 11:53:27.247  3954  3962 W System.err:    ... 4 more 

Я решил создать Отчет об ошибках Google .

...