Android OutOfMemoryError: no se pudo asignar una asignación de bytes 57993496 con 16764448 bytes libres

Estoy tratando de hacer que mi variable de count esté sincronizada para get y una function de ayudante privada para la configuration basada en otros miembros. Varios hilos llaman a setCount() como deadlineNoteVisible y referencesAvailable cambian.

Con synchronized solo para el método setCount() , las cosas están bien, pero cuando agrego synchronized(this) a la llamada a get() , obtengo:

 OutOfMemoryError: Failed to allocate a 57993496 byte allocation with 16764448 free bytes and 32MB until OOM 

Código (escrito en Kotlin):

 var count: Int = 0 // Why does adding synchronized here explode? get() = synchronized(this) { count } private set private fun setCount() { synchronized(this) { count = 0 if (deadlineNoteVisible) { count += 1 } if (referencesAvailable) { count += 1 } } } 

Stack trace:

 Error reporting crash java.lang.OutOfMemoryError: Failed to allocate a 57993496 byte allocation with 16764448 free bytes and 32MB until OOM at java.lang.AbstractStringBuilder.enlargeBuffer(AbstractStringBuilder.java:95) at java.lang.AbstractStringBuilder.append0(AbstractStringBuilder.java:125) at java.lang.StringBuffer.append(StringBuffer.java:278) at java.io.StringWriter.write(StringWriter.java:123) at com.android.internal.util.FastPrintWriter.flushLocked(FastPrintWriter.java:358) at com.android.internal.util.FastPrintWriter.appendLocked(FastPrintWriter.java:303) at com.android.internal.util.FastPrintWriter.write(FastPrintWriter.java:625) at com.android.internal.util.FastPrintWriter.append(FastPrintWriter.java:658) at java.io.PrintWriter.append(PrintWriter.java:691) at java.io.PrintWriter.append(PrintWriter.java:687) at java.io.Writer.append(Writer.java:198) at java.lang.Throwable.printStackTrace(Throwable.java:324) at java.lang.Throwable.printStackTrace(Throwable.java:300) at android.util.Log.getStackTraceString(Log.java:343) at com.android.internal.os.RuntimeInit.Clog_e(RuntimeInit.java:61) at com.android.internal.os.RuntimeInit.-wrap0(RuntimeInit.java) at com.android.internal.os.RuntimeInit$UncaughtHandler.uncaughtException(RuntimeInit.java:86) at com.crashlytics.android.core.CrashlyticsUncaughtExceptionHandler.uncaughtException(CrashlyticsUncaughtExceptionHandler.java:249) at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:693) at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:690) 

En realidad, tienes un StackOverflowError porque estás invocando getCount() de getCount() incondicionalmente. Supongo que es solo un error tipográfico y el código debería ser:

 var count: Int = 0 get() = synchronized(this) { field } private set 

El identificador de field aquí le permite acceder a un campo de respaldo de la propiedad. Puede leer más información sobre los campos de respaldo aquí .

  • Kotlin: ¿Ya no es posible iterar un map con una input desestructurada? ¿Error?
  • Kotlin y Gradle sin Maven Central?
  • No puede abrir el proyecto después de actualizar Android Studio
  • Genera kdoc y mira en el browser
  • Cómo volver a vincular al service de reproductor de música bind ya en ejecución
  • Error de estudio de Android R.java
  • Cómo acceder a los miembros de un object interno en Kotlin
  • Convirtiendo el método Java "Callable <T>" a Kotlin
  • Kotlin getter setter sin campo
  • Enumera y con en Kotlin
  • Argumentos pnetworkingeterminados frente a sobrecargas, cuándo usar qué