我在Scala v2.11.4上編寫的Play Framework v2.3.7中有一個應用程序。它在服務器上運行,每週一次崩潰,OutOfMemoryError異常:超出GC開銷限制。我試圖找出那裏有什麼問題。我做了內存轉儲,並使所有使用的類的直方圖(我使用jmap -histo
)。而且我發現很奇怪的結果:
Object Histogram:
num #instances #bytes Class description
--------------------------------------------------------------------------
1: 24023 787570032 scala.concurrent.forkjoin.ForkJoinTask[]
2: 96965 12420368 * MethodKlass
3: 96965 11250824 * ConstMethodKlass
4: 8424 8652552 * ConstantPoolKlass
5: 8424 7547640 * InstanceKlassKlass
6: 61739 5531288 char[]
7: 7527 4799776 * ConstantPoolCacheKlass
8: 24024 4612608 scala.concurrent.forkjoin.ForkJoinPool$WorkQueue
9: 27289 3543672 byte[]
10: 23190 2597280 scala.concurrent.impl.ExecutionContextImpl$DefaultThreadFactory$$anon$2
11: 63921 2045472 java.util.concurrent.ConcurrentHashMap$HashEntry
12: 3735 1470112 * MethodDataKlass
13: 42877 1029048 scala.collection.immutable.$colon$colon
14: 8834 1023064 java.lang.Class
所以,有很多的ForkJoinTask[]
和ForkJoinPool$WorkQueue
實例。所以,我假設,它是應用程序的所有異步調用和線程的隊列和任務。而且我理論上也認爲,它們在完成後應該直接刪除。
這個問題有什麼可能的原因?也許我錯過配置一個ExecutionContext?以前有人遇到這個問題嗎?
,什麼是你特別ExecutionContext配置? – ale64bit
我沒有做任何額外的配置。只是將它留空:{}。我認爲,默認參數應該適合我。 – Denis
好吧,他們通常是這樣的,但我認爲你已經定製了它,因爲你提到過''也許我錯過配置了一個ExecutionContext?「:S – ale64bit