2016-04-06 8 views
2

getに対してcount変数を同期させ、他のメンバーに基づいてプライベートヘルパー機能を設定しようとしています。複数のスレッドがsetCount()をそれぞれdeadlineNoteVisiblereferencesAvailableと呼びます。ただ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) 
+2

キャッチされていない例外がスローされたときに起動され、スタックトレースを出力するときに55MBの文字列を生成しようとしているクラッシュハンドラがあるようです。キャッチされていない例外をトラップするデバッガをアタッチすると、少なくとも、動作を開始しているクラッシュを特定できるようになります。 – fadden

+0

'synchronized'メソッドは、おそらく赤ちゃんです。ちょうど、漏れているアプリケーションが大きすぎる原因になっています。あなたはyoyrの実行中のアプリをプロファイリングして、何がメモリを使用しているのか調べることができますか – sisyphus

+0

とにかく読み込みを同期させる必要があるのはなぜですか? –

答えて

5

getCount()を無条件にgetCount()に電話しているので、実際にはStackOverflowErrorがあります。私はそれだけで誤植だとコードがあるべきとします

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

ここfield識別子を使用して、プロパティのバッキングフィールドにアクセスすることができます。バッキングフィールドhereについて詳しく読むことができます。

関連する問題