2015-01-16 11 views
1

我在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?以前有人遇到這個問題嗎?

+0

,什麼是你特別ExecutionContext配置? – ale64bit

+0

我沒有做任何額外的配置。只是將它留空:{}。我認爲,默認參數應該適合我。 – Denis

+0

好吧,他們通常是這樣的,但我認爲你已經定製了它,因爲你提到過''也許我錯過配置了一個ExecutionContext?「:S – ale64bit

回答

0

這件事是通過使用最新版本的解決「斯卡拉,反映」庫(版本後即可2.11.6):

val scalaV = "2.11.6" 

scalaVersion := scalaV 

libraryDependencies ++= Seq(
    "org.scala-lang" % "scala-reflect" % scalaV 
) 

下面是錯誤描述:https://issues.scala-lang.org/browse/SI-8946

+0

你確定這個額外的圖書館能解決你的問題嗎?我沒有找到你稱之爲圖書館的地方。你能否給我一些詳細的解釋。因爲目前我也遇到這個性能問題。謝謝。 – Haimei

+0

那麼,在具體的情況下,我的應用程序使用了庫,它依賴於較舊版本的scala-reflect(並且舊版本包含[bug](https://issues.scala-lang.org/browse/SI- 8946))。所以,當我明確指定應該使用哪個版本的scala-reflect時,問題就解決了。 – Denis

+0

好吧,我明白了。謝謝。 – Haimei

0

您使用哪種上下文?按照documentation,你應該使用

play.api.libs.concurrent.Execution.Implicits.defaultContext 

,而不是默認

scala.concurrent.ExecutionContext.Implicits.global 

一個解釋請參見本answer

+0

我讀過這個文檔,但是我沒有找到你提出這個改變的原因。你能給出明確的理由嗎?謝謝。 – Haimei

+0

我已經添加了一個鏈接到一個解釋。 – KaC

+0

我明白了,謝謝。 – Haimei