【发布时间】:2015-03-15 02:00:38
【问题描述】:
我有一个使用 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 配置是什么?
-
我没有做任何额外的配置。将其留空:{}。我想,默认参数应该适合我。
-
嗯,它们通常是,但我以为你已经定制了它,因为你提到了
"Maybe I missconfigured an ExecutionContext?":S
标签: scala memory-leaks playframework-2.0 akka