В настоящее время мы разрабатываем приложение kotlin, которое использует Pusher Beams . Работает очень хорошо, пока не наберет определенное количество уведомлений в секунду (4+). Затем обычно происходит сбой с одним из этих двух исключений:
Fatal Exception: java.lang.OutOfMemoryError: Could not allocate JNI Env
at java.lang.Thread.nativeCreate(Thread.java)
at java.lang.Thread.start(Thread.java:730)
at java.util.concurrent.ThreadPoolExecutor.addWorker(ThreadPoolExecutor.java:941)
at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1359)
at okhttp3.ConnectionPool.put(ConnectionPool.java:153)
или
Fatal Exception: android.database.CursorWindowAllocationException: Cursor window allocation of 2048 kb failed.
at android.database.CursorWindow.<init>(CursorWindow.java:108)
at android.database.AbstractWindowedCursor.clearOrCreateWindow(AbstractWindowedCursor.java:198)
at android.database.sqlite.SQLiteCursor.fillWindow(SQLiteCursor.java:138)
at android.database.sqlite.SQLiteCursor.getCount(SQLiteCursor.java:132)
Поскольку оба исключения, похоже, отказываются выделять больше памяти, мы проанализировали приложение с помощью Profiler. Там потребление выглядит стабильным, пока не падает. Также добавлен LeakCanary, который не сообщает о каких-либо (известных) утечках ... Кажется, что только экземпляры MessagingService и соединения okhttp живут / открываются дольше, чем необходимо.
Вот фрагмент моего Сервиса :
class NotificationService : MessagingService() {
...
override fun onMessageReceived(remoteMessage: RemoteMessage) {
val data = remoteMessage.data
if(data.containsKey("action")){
val action = data["action"].toString()
if(action == "ticketUpdate"){
val json = Json(JsonConfiguration.Stable)
val tickets: List<Ticket> = json.parse(Ticket.serializer().list, data["tickets"].toString())
val ticketIterator = tickets.iterator()
ticketIterator.forEach { ticket ->
ticketHelper.updateTicket(ticket)
}
}
}
}
}
- Мы неправильно обрабатываем входящие сообщения?
- Как продолжить отладку этой проблемы?
- Я не нашел никаких ограничений относительно пропускной способности сообщений fcm . Есть какие-либо известные проблемы с этим на части толкателя?