Android OutOfMemoryError:无法使用16764448个空闲字节分配57993496字节分配

Cor*_* Wu 2 java android kotlin

我试图使我的count变量同步get和私人帮助函数基于其他成员进行设置.多个线程调用每一个setCount()作为deadlineNoteVisiblereferencesAvailable变化.

随着synchronized对刚刚setCount()方法,一切都很好,但是当我添加synchronized(this)get()电话,我得到:

OutOfMemoryError: Failed to allocate a 57993496 byte allocation with 16764448 free bytes and 32MB until OOM
Run Code Online (Sandbox Code Playgroud)

代码(用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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

堆栈跟踪:

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)
Run Code Online (Sandbox Code Playgroud)

Mic*_*ael 5

其实你已经有了一个StackOverflowError,因为你调用getCount()getCount()无条件.我想这只是一个错字,代码应该是:

var count: Int = 0
    get() = synchronized(this) { field }
    private set
Run Code Online (Sandbox Code Playgroud)

field此处的标识符允许您访问属性的支持字段.您可以在此处阅读有关支持字段的更多信息.