2
get
に対してcount
変数を同期させ、他のメンバーに基づいてプライベートヘルパー機能を設定しようとしています。複数のスレッドがsetCount()
をそれぞれdeadlineNoteVisible
とreferencesAvailable
と呼びます。ただsetCount()
方法についてでAndroid OutOfMemoryError:57993496バイト割り当てに16764448フリーバイトを割り当てられません
、物事は罰金ですが、私はget()
コールにsynchronized(this)
を追加するときに、私が取得 :(Kotlinで書かれた)
OutOfMemoryError: Failed to allocate a 57993496 byte allocation with 16764448 free bytes and 32MB until OOM
コード:
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
}
}
}
スタックトレース:
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)
キャッチされていない例外がスローされたときに起動され、スタックトレースを出力するときに55MBの文字列を生成しようとしているクラッシュハンドラがあるようです。キャッチされていない例外をトラップするデバッガをアタッチすると、少なくとも、動作を開始しているクラッシュを特定できるようになります。 – fadden
'synchronized'メソッドは、おそらく赤ちゃんです。ちょうど、漏れているアプリケーションが大きすぎる原因になっています。あなたはyoyrの実行中のアプリをプロファイリングして、何がメモリを使用しているのか調べることができますか – sisyphus
とにかく読み込みを同期させる必要があるのはなぜですか? –